JavaScript石头剪刀布游戏checkWinner函数结果异常求助
问题分析与修复
核心问题
你遇到的错误并非checkWinner函数逻辑错误,而是两次调用getComputerChoice()导致的混淆:
- 代码中先执行了
console.log(getComputerChoice()),生成一个随机选择并打印; - 随后又执行
let computerSelection= getComputerChoice();,再次生成一个全新的随机选择,这才是传入checkWinner的真实值。
你误以为控制台打印的就是传入函数的电脑选择,所以会出现“明明打印的是Paper却返回Player获胜”的错觉——实际传入函数的是另一个随机值(比如Rock),此时玩家选Paper确实会赢,只是你看到的打印值和实际传入值不一致。
另外,函数中混合使用了===和==,虽然当前场景下不影响结果,但建议统一使用严格相等===保持代码规范。
修复后的代码
let choices = ["Rock", "Paper", "Scissors"]; function getComputerChoice() { let result = choices[Math.floor(Math.random() * 3)]; return result; } function checkWinner(computerSelection, playerSelection) { // 统一使用严格相等=== if ((computerSelection === "Rock" && playerSelection === "Rock") || (computerSelection === "Paper" && playerSelection === "Paper") || (computerSelection === "Scissors" && playerSelection === "Scissors")) { return "Tie"; } else if ((computerSelection === "Rock" && playerSelection === "Scissors") || (computerSelection === "Paper" && playerSelection === "Rock") || (computerSelection === "Scissors" && playerSelection === "Paper")) { return "Computer"; } else if ((computerSelection === "Scissors" && playerSelection === "Rock") || (computerSelection === "Rock" && playerSelection === "Paper") || (computerSelection === "Paper" && playerSelection === "Scissors")) { return "Player"; } else { return "Try again"; } } // 只调用一次getComputerChoice,并存入变量,确保打印和传入函数的是同一个值 let computerSelection = getComputerChoice(); let playerSelection = "Paper"; console.log(`电脑选择:${computerSelection}`); console.log(checkWinner(computerSelection, playerSelection));
验证说明
修复后,控制台会先打印真实传入函数的电脑选择,再输出胜负结果,你可以清晰看到每一次的对应关系,结果会100%符合石头剪刀布的规则:
- 当电脑和玩家选择相同时返回
Tie - 电脑赢的场景(Rock赢Scissors、Paper赢Rock、Scissors赢Paper)返回
Computer - 玩家赢的场景(Rock赢Scissors、Paper赢Rock、Scissors赢Paper的反向)返回
Player
内容的提问来源于stack exchange,提问作者CrimKingX49
相关产品推荐
相关产品推荐

