JS石头剪刀布:如何让playRound每次循环获取新参数?
石头剪刀布游戏问题修复
核心问题分析
- 全局变量导致重复选择:你把
user和computer定义在全局,只会在页面加载时执行一次,所以每轮游戏用的都是同一个用户输入和电脑选择,自然只能运行一次有效对决。 - 循环条件错误:
while (playerScore < 4 || compScore < 4)逻辑混乱,应该是只要双方都没到3分就继续循环,即playerScore < 3 && compScore < 3。 - 平局直接终止游戏:当前代码遇到平局就
return round,直接结束游戏,不符合平局重赛的逻辑。 - getComputerChoice函数冗余:可以简化随机选择的逻辑,不用多个if判断。
修复后的完整代码
const choices = ['rock', 'paper', 'scissors']; function getComputerChoice() { // 简化随机选择逻辑 const randomIndex = Math.floor(Math.random() * choices.length); return choices[randomIndex]; } function playRound(playerSelection, computerSelection){ // 处理平局 if (playerSelection === computerSelection) { return '平局!'; } // 玩家选石头 if (playerSelection === choices[0]){ return computerSelection === choices[1] ? '你输了!纸包石头。' : '你赢了!石头剪剪刀。'; } // 玩家选纸 if (playerSelection === choices[1]){ return computerSelection === choices[2] ? '你输了!剪刀剪纸。' : '你赢了!纸包石头。'; } // 玩家选剪刀 if (playerSelection === choices[2]){ return computerSelection === choices[0] ? '你输了!石头砸剪刀。' : '你赢了!剪刀剪纸。'; } } function game(){ let playerScore = 0; let compScore = 0; // 循环直到一方先拿到3分 while (playerScore < 3 && compScore < 3) { // 每轮重新获取用户输入和电脑选择 const userInput = prompt('请选择:rock/paper/scissors').toLowerCase(); // 可选:校验用户输入合法性 if (!choices.includes(userInput)) { alert('输入无效,请输入rock、paper或scissors'); continue; } const computerChoice = getComputerChoice(); const roundResult = playRound(userInput, computerChoice); console.log(roundResult); // 根据结果更新分数 if (roundResult.startsWith('你赢了!')) { playerScore++; console.log(`玩家分数:${playerScore}`); } else if (roundResult.startsWith('你输了!')) { compScore++; console.log(`电脑分数:${compScore}`); } // 平局不处理分数,直接进入下一轮 } // 循环结束后判断最终胜负 if (playerScore === 3) { console.log('恭喜你,最终获胜!'); } else { console.log('电脑获胜,再来一局吧!'); } } game();
关键修改说明
- 每轮重新获取选择:把用户输入和电脑选择的逻辑移到
game函数的循环内部,确保每一轮都生成新的选择。 - 修正循环条件:改为
playerScore < 3 && compScore < 3,只有当双方都没达到3分时才继续游戏。 - 修复平局逻辑:平局不再终止游戏,而是直接进入下一轮循环,不改变分数。
- 输入合法性校验:新增了用户输入的校验,避免无效输入导致游戏逻辑出错。
- 简化getComputerChoice:直接通过随机索引获取选择,减少冗余代码。
内容的提问来源于stack exchange,提问作者SolomonM
相关产品推荐
相关产品推荐

