我刚刚开始学习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();
答案 0 :(得分:2)
我对全局变量的评论并没有真正成立,因为我错过了你将它们声明为参数,这确实在本地范围内创建它们。它实际上并不创建全局,但您仍应删除参数并使用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
语句。
答案 1 :(得分:0)
构建代码的更好方法是:
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()的递归调用没有任何意义,它可以防止内存被丢弃。当然,对于这个例子,你可能不会遇到麻烦,但对于更复杂的情况,它最终可能会损害你的表现。