问题描述
我正在构建一个简单的石头剪刀布,我可以通过浏览器控制台播放它。使用 do/while 循环,我会提示选择三个可接受的选项“石头”、“纸”或“剪刀”之一。一旦玩家输入这 3 个可接受的选项之一,do/while 循环就应该终止。问题是它没有。
function playerPlay(){
let choice;
do{
choice = prompt("Rock,paper or scissors?").toLowerCase();
console.log(choice);
console.log(choice !== "rock" || choice !== "paper" || choice !== "scissors");
console.log(choice === "rock" || choice === "paper" || choice === "scissors");
} while (choice !== "rock" || choice !== "paper" || choice !== "scissors");
return choice;
}
playerPlay();
我一直在尝试使用 console.log 进行调试,发现播放器给出的提示选择似乎工作正常(请参见下面的屏幕截图)令人难以置信:
-
当输入是“rock”、“paper”或“scissors”时,两个console.log布尔测试记录“true”。第一个 console.log 应该记录 false(意外),而第二个应该记录 true(预期)。
-
当输入为“notRockPaperScissors”时,第一个 console.log 布尔测试记录为真(预期),而第二个 console.log 布尔测试记录为假(预期)。
我当然错过了显而易见的事情,但作为初学者,我只是看不出是什么导致了这种情况的发生,了解原因肯定会对我(以及其他学习者)有所帮助。感谢您的帮助!
解决方法
您应该使用 &&
运算符而不是 ||
运算符。
即而不是这个
while (choice !== "rock" || choice !== "paper" || choice !== "scissors");
使用这个
while (choice !== "rock" && choice !== "paper" && choice !== "scissors");
这样做的原因是我们希望程序在 choice
接受任何值 [rock
,paper
,scissors
] 时退出。在 ||
运算符中,如果任何条件的计算结果为真,循环将继续;在 &&
运算符中,如果任何条件的计算结果为假,循环将退出。因此,如果选择采用任何列出的值,条件将评估为假,然后整个条件将评估为假。
while (choice !== "rock" || choice !== "paper" || choice !== "scissors")
您的条件始终为真,因为价值不是石头或纸,也不是 scicors,因为它不可能是全部。用 && 而不是 || 检查。
,问题出在 while 条件中,您的程序将在 while 循环中堆栈,直到他得到一个错误条件。
while (choice !== "rock" || choice !== "paper" || choice !== "scissors")
随着|| (OR) 逻辑运算符,您将在无限循环中堆叠。 您需要做的是更改为 && (AND) 运算符,如下所示:
while (choice !== "rock" && choice !== "paper" && choice !== "scissors")