功能重启工作不正确

时间:2013-09-02 15:01:58

标签: javascript

我刚刚开始学习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(); 

2 个答案:

答案 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()的递归调用没有任何意义,它可以防止内存被丢弃。当然,对于这个例子,你可能不会遇到麻烦,但对于更复杂的情况,它最终可能会损害你的表现。