我一周前刚开始做JavaScript。在我的第一个项目中,我的目标是利用我对基本JavaScript的知识来创建一个“思考的计算机大脑”,可以这么说。我没有关注它的外观,就像我只使用基本提示和警告所看到的那样。我只是想习惯在JavaScript中连贯地写作。
游戏“工作”,但我觉得代码过于冗长,可能会更简洁。但由于我刚开始接触JS,我很难弄清楚该怎么做。我理解这是否要求过高,但也许有些数学人员可能会觉得这个游戏至少有点有趣。
var welcome = alert("Welcome to 2-to-1. Both you and the computer will start the game off with the number '2'. Whoever gets to '1' first wins! But of course, there's a catch.");
var rules = alert("This is a turn based game. You must first choose a factor of the computer's number. This can be any factor EXCEPT the number 1. If the chosen factor is even, it is added to your current score; if odd, it is subtracted. After this, the computer chooses a factor from your new number. This back-and-forth continues until someone gets their number down to 1.");
var rules2 = alert("A few extra rules: When an odd number is being subtracted from your score, if your resulting score is a negative number, the absolute value is taken, turning the negative number into a positive. Also, if your score ever reaches 0, this results in an automatic loss and the game ends.");
var rules3 = alert('Lastly, instead of choosing a factor from the computers score, you can choose to simply add 1 to your current score. To do this, type "+1" without the quotes. Good Luck!');
var yourDiv;
var compDiv;
var operator;
var yourNumber = 2;
var compNumber = 2;
function getFactors(integer) {
var factors = [],
quotient = 0;
for(var i = 1; i <= integer; i++){
quotient = integer/i;
if(quotient === Math.floor(quotient)){
factors.push(i);
}
}
factors.shift();
return factors;
}
while (compNumber !== 1 && yourNumber !== 1) {
var initCompFactors = getFactors(compNumber);
var idk = 1;
yourDiv = prompt("Your score: " + yourNumber + ". Computer's score: " + compNumber + ". Which factor (besides 1) do you choose from the computer's score?");
for (var i = 0; i <= initCompFactors.length - 1; i += 1) {
if (parseInt(yourDiv) === initCompFactors[i]) {
idk += 1;
}
}
if (yourDiv === "+1") {
idk += 1;
}
while (idk !== 2) {
alert("Not a valid entry.");
yourDiv = prompt("Your score: " + yourNumber + ". Computer's score: " + compNumber + ". Which factor (besides 1) do you choose from the computer's score?");
for (var i = 0; i <= initCompFactors.length - 1; i += 1) {
if (parseInt(yourDiv) === initCompFactors[i]) {
idk += 1;
}
}
if (yourDiv === "+1") {
idk += 1;
}
}
if (yourDiv === "+1") {
yourNumber += 1;
yourDiv = "1";
operator = "added to";
} else {
if (parseInt(yourDiv) % 2 === 0) {
yourNumber += parseInt(yourDiv);
operator = "added to";
} else {
yourNumber -= parseInt(yourDiv);
operator = "subtracted from";
}
}
if (yourNumber < 0) {
yourNumber = yourNumber * -1;
}
var yourResult = alert(yourDiv + " was " + operator + " your score. You now have " + yourNumber + ".");
if (yourNumber === 0) {
alert("Sorry! You lost :/");
break;
}
if (yourNumber === 1) {
alert("YAY! You won!");
break;
}
var yourFactors = getFactors(yourNumber);
var doNotUse = [];
for (var i = 0; i <= yourFactors.length - 1; i += 1) {
if (yourFactors[i] % 2 !== 0) {
if (compNumber - yourFactors[i] === 1 || compNumber - yourFactors[i] === -1) {
compDiv = yourFactors[i];
compNumber = 1;
}
}
}
if (compNumber !== 1) {
compDiv = yourFactors[Math.floor(Math.random() * yourFactors.length)];
if (yourFactors.length !== 1) {
while (compNumber % 2 !== 0 && compDiv === compNumber) {
compDiv = yourFactors[Math.floor(Math.random() * yourFactors.length)];
}
for (var i = 0; i <= yourFactors.length - 1; i += 1) {
if (yourFactors[i] % 2 !== 0) {
var rawr = compNumber - yourFactors[i];
var compFactors = getFactors(rawr);
for (var j = 0; j <= compFactors.length - 1; j += 1) {
var compFactor = compFactors[j];
if (compFactor % 2 !== 0) {
if (yourNumber - compFactor === 1 || yourNumber - compFactor === -1) {
if (doNotUse.indexOf(yourFactors[i]) === -1) {
doNotUse.push(yourFactors[i]);
}
}
}
}
}
if (yourFactors[i] % 2 === 0) {
var rawr = compNumber + yourFactors[i]; // 2 + 4 = 6
var compFactors = getFactors(rawr); // [2,3,6]
for (var j = 0; j <= compFactors.length - 1; j += 1) {
var compFactor = compFactors[j];
if (compFactor % 2 !== 0) {
if (yourNumber - compFactor === 1 || yourNumber - compFactor === -1) {
if (doNotUse.indexOf(yourFactors[i]) === -1) {
doNotUse.push(yourFactors[i]);
}
}
}
}
}
}
console.log(doNotUse);
if (doNotUse.length !== yourFactors.length) {
while (doNotUse.indexOf(compDiv) !== -1) {
compDiv = yourFactors[Math.floor(Math.random() * yourFactors.length)];
}
}
}
if (compDiv % 2 === 0) {
compNumber += compDiv;
} else {
compNumber -= compDiv;
}
if (compNumber < 0) {
compNumber = compNumber * -1;
}
}
var compResult = alert("The computer chose the factor " + compDiv + " from your score of " + yourNumber + ". The computer's new score is " + compNumber + ".");
if (compNumber === 0) {
alert("YAY! You won!");
break;
}
if (compNumber === 1) {
alert("Sorry! You lost :/");
break;
}
}发布于 2015-08-31 19:47:56
你已经把程序写成一个单一的函数。如果您定义了包含整个程序较小步骤的助手函数,则可以使总体结构更加清晰,代码更易于遵循。
例如,如果您查看程序的30,000英尺的视图,它看起来如下(在伪代码中):
while (neither player has won) {
get the player's number
update the player's score
check if player has won or lost
determine the computer's number
update the computer's score
check if the computer has won or lost
}这些步骤中的每一个都可以放入它们自己的助手函数中,也称为“子例程”。will使while循环的主体更具可读性。
下面是一个从播放机获取有效数字的子程序示例(同样,伪代码):
function getPlayersDivisor(computersNumber) {
while (true) {
...prompt for a number, put into var yourDiv...
if (yourDiv is a divisor of computersNumber or is "+1") {
return yourDiv;
}
alert("Not a valid entry");
}
}请注意while循环如何避免程序中代码的重复。
这是一个子例程的另一个想法-一个更新球员的分数,并返回如何报告它。计算机或玩家的分数都可以用以下内容更新:
function updateNumber(oldNumber, divisorChosen) {
var newNumber;
var message;
if (divisorChosen == 1 || divisorChosen % 2 == 0) {
newNumber = oldNumber + divisorChosen
message = divisorChosen + " was added to";
} else {
newNumber = oldNumber - divisorChosen;
if (newNumber < 0) {
newNumber = - newNumber;
}
message = divisorChosen + " was subtracted from";
}
return [ newNumber, message ]; # returns multiple values
}最后,您应该将计算机的所有决策逻辑放在一个单独的函数中,例如:
function chooseForComputer(playerNumber) {
# logic for choosing a divisor for the computer goes here
...
return compDiv;
}使用这些助手函数,what循环可能是这样的:
// Assume these variables are defined:
// player - the player's number
// computer - the computer's number
//
// and that neither player has won.
while (true) {
playersDiv = getPlayersDivisor(computer);
var result = updateNumber(player, playersDiv);
player = result[0];
var message = result[1];
alert(message + " your score. Your number is now " + player)
if (player == 0) { alert ("You lost."); break }
if (player == 1) { alert ("You won.!"); break }
var computerDiv = chooseForComputer(player);
var result = updateNumber(computer, computerDiv);
computer = result[0]
alert("Computer choose " + computerDiv +" and now has score " + computer);
if (computer == 0) { alert("Computer lost."); break }
if (computer == 1) { alert("Computer won!"); break }
}发布于 2015-08-31 19:04:11
不是一个完整的答案,但是当声明多个变量时,您可以--而且应该--只使用一个var关键字。而不是
var a;
var b;
var c = 4;
var d = "foo";使用
var a,
b,
c = 4,
d = 10;https://codereview.stackexchange.com/questions/102425
复制相似问题