功能重新启动工作不正确

Function restart works incorect

本文关键字:不正确 工作 重新启动 功能      更新时间:2023-09-26

我刚开始学习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()的递归调用没有任何用途,它可以防止内存被丢弃。当然,对于这个例子,你可能永远不会因此而遇到麻烦,但对于更复杂的情况,它最终可能会损害你的性能。