Odin Project石头剪刀布游戏:分数统计失效问题求助
石头剪刀布游戏分数统计问题排查与修复
问题根源拆解
- 分数无法累加:
play函数里,return alert(...)会直接结束函数,导致后面的playerScore++/computerScore++完全没机会执行。必须把分数累加代码放在return之前(或直接移除多余的return)。 - 电脑选择无随机性:
const rty = Math.floor(Math.random()),Math.random()输出0到1之间的浮点数,经过Math.floor后永远是0,所以电脑每次只会出"rock",彻底失去游戏随机性。 - 胜利判定逻辑失效:
game函数的循环固定跑5次,哪怕玩家提前赢够5局也不会提前终止;而且原循环最多只允许玩家玩5局,就算每局都赢,也要等第5局结束才会判断,不符合"赢5轮就弹出提示"的设计。
修正后的完整代码
<script> let option1 = "rock" let option2 = "paper" let option3 = "scissors" let playerScore = 0 let computerScore = 0 function getComputerChoice() { // 每次调用生成新随机数,保证选择随机性 const rty = Math.random() if (rty <= 0.33) { return option1 } else if (rty <= 0.66) { return option2 } else { return option3 } } function play() { const playerChoice = prompt("Enter your choice").toLowerCase() const computerChoice = getComputerChoice() if (playerChoice === "paper" && computerChoice === "rock") { alert("You Win! Paper beats Rock"); playerScore++; } else if (playerChoice === "rock" && computerChoice === "paper") { alert("You Lose! Paper beats Rock"); computerScore++; } else if (playerChoice === "scissors" && computerChoice === "rock") { alert("You Lose! Rock beats Scissors"); computerScore++; } else if (playerChoice === "rock" && computerChoice === "scissors") { alert("You Win! Rock beats Scissors"); playerScore++; } else if (playerChoice === "scissors" && computerChoice === "paper") { alert("You Win! Scissors beats Paper"); playerScore++; } else if (playerChoice === "paper" && computerChoice === "scissors") { alert("You Lose! Scissors beats Paper"); computerScore++; } else if (playerChoice === computerChoice) { alert("It's a tie") } else { alert("Enter a valid input plox") } } function game() { const winMsg = "Winner!" // 改用while循环,直到玩家赢够5局 while (playerScore < 5) { play() if (playerScore === 5) { alert(winMsg) // 重置分数,避免下次调用game时累计旧分数 playerScore = 0 computerScore = 0 return } } } </script>
修正说明
- 将随机数生成逻辑移到
getComputerChoice内部,每次调用都生成新的随机数,保证电脑选择的随机性。 - 移除
play函数中多余的return语句,确保分数累加代码能正常执行。 - 将
game函数的固定次数循环改为while循环,持续运行直到玩家分数达到5,满足"赢5轮就弹出提示"的设计需求;同时在弹出提示后重置分数,避免后续调用时使用历史数据。
内容的提问来源于stack exchange,提问作者Klynk917
相关产品推荐
相关产品推荐

