我刚开始学习JS,我为石头剪刀游戏写了一段代码。所以我在接下来的步骤中遇到了麻烦:如果第一次用户的选择和计算机的选择是一样的,功能就会重新启动。但在第二次时,用户的选择并不重要,因为程序使用第一次输入的值,而忽略第二次。请解释一下我的错误在哪里。代码如下。
function compare(choice1,choice2) {
choice1=prompt("Make your choice!");
console.log("You're choosing "+choice1);
choice2=Math.random();
console.log("Computer rolls the dice and the result is "+choice2);
if (choice2 < 0.333) {
choice2="rock";
} else if (choice2 < 0.666) {
choice2="paper";
} else {
choice2="scissors";
}
console.log("That means "+choice2+".");
if (choice1===choice2) {
console.log("Ooops!Tie!");
compare();
}
if(choice1==="rock") {
if(choice2==="scissors"){
return("Your rock wins");
} else {
return("Computer's paper wins");
}
} else if (choice1==="paper") {
if(choice2==="rock") {
return("Your paper wins");
} else {
return("Computer's scissors wins");
}
} else if (choice1==="scissors") {
if(choice2==="rock") {
return("Computer's rock wins");
} else {
return("Your scissors wins");
}
} else {
return("Nice try smirky!");
}
}
compare();
我对全局变量的评论并不成立,因为我错过了将它们声明为参数,这确实在本地范围内创建了它们。它实际上并没有创建全局,但您仍然应该删除参数并使用var
无论我打了多少次compare
或打成平手,我每次都会得到正确的回应。
你想要改变的是你的变量分配:
choice1=prompt("Make your choice!");
使choice1
成为全局变量,而
var choice1=prompt("Make your choice!");
在函数的"作用域"中创建一个局部变量,即每次运行时都被隔离
您需要在初始化变量时(第一次分配变量时)添加var
。这似乎不会导致你的错误,但无论如何都是一个很好的练习。
此外,在平局的情况下,您的compare()
调用不会返回结果。你应该确保也返回:
if (choice1===choice2) {
console.log("Ooops!Tie!");
return compare();
}
这也防止了在平局的情况下返回"Nice try smirky!",因为这是它遇到的第一个return
语句。
构建代码的更好方法如下:
var choices = ['rock', 'paper', 'scissors']
function startGame(){
var choiceHuman = prompt('Make your choice!');
var choiceComp = choices[Math.floor(Math.random() * 3)];
console.log(determineResult(choiceHuman, choiceComp));
}
function determineResult(choiceHuman, choiceComp){
if (choiceHuman === choiceComp){
return 'Ooops!Tie!';
} else if (choiceHuman === 'rock') {
if (choiceComp === "scissors") {
return("Your rock wins");
} else {
return("Computer's paper wins");
}
} else if (choiceHuman === "paper") {
if (choiceComp === "rock") {
return("Your paper wins");
} else {
return("Computer's scissors wins");
}
} else if (choiceHuman === "scissors") {
if (choiceComp === "rock") {
return("Computer's rock wins");
} else {
return("Your scissors wins");
}
} else {
return("Nice try smirky!");
}
}
var userInput = true;
while(userInput) {
startGame();
userInput = prompt('Play again? (Y/N)') === 'y';
}
对compare()的递归调用没有任何用途,它可以防止内存被丢弃。当然,对于这个例子,你可能永远不会因此而遇到麻烦,但对于更复杂的情况,它最终可能会损害你的性能。