JS新手求助:石头剪刀布游戏回合执行次数异常问题
石头剪刀布游戏固定回合数问题修复
问题根源
- 重复调用
playRound导致多次输入:你的game函数中,每个if/else if分支都调用了playRound(),比如第一个if判断触发一次输入,不满足条件时,下一个else if又会再次调用playRound,触发新的输入。这就是输入次数随机的核心原因。 - 电脑选择全局固定:
computerSelection在全局作用域只生成一次,所有回合电脑都会出同一个选项,不符合游戏逻辑。 - 输入未做大小写兼容:用户输入小写的"rock"会被判定为错误输入,体验不佳。
修复后的代码
const computerChoice = ["Rock", "Paper", "Scissors"]; function getComputerChoice() { let random = Math.floor(Math.random() * computerChoice.length); return computerChoice[random]; }; function getPlayerChoice() { let choice = prompt('Take your pick! Rock, Paper, or Scissors?'); // 统一转为大写首字母格式,兼容任意大小写输入 return choice ? choice.charAt(0).toUpperCase() + choice.slice(1).toLowerCase() : ""; } function playRound() { const lose = 'lose'; const win = 'win'; const tie = 'tie'; const wrong = 'wrong'; // 每回合重新生成电脑选择 const computerSelection = getComputerChoice(); const playerSelection = getPlayerChoice(); // 先判断输入是否合法 if (!computerChoice.includes(playerSelection)) { return wrong; } // 判断平局 if (computerSelection === playerSelection) { return tie; } // 简化胜负判断逻辑 const winConditions = [ {player: "Rock", computer: "Scissors"}, {player: "Paper", computer: "Rock"}, {player: "Scissors", computer: "Paper"} ]; const didWin = winConditions.some(cond => cond.player === playerSelection && cond.computer === computerSelection); return didWin ? win : lose; } let playerCounter = 0; let computerCounter = 0; function game(){ // 第一回合:仅调用一次playRound,存储结果后再判断 const round1Result = playRound(); switch(round1Result) { case 'lose': console.log('you lost this round'); computerCounter++; break; case 'win': console.log('you won this round'); playerCounter++; break; case 'tie': console.log("it's a tie"); break; default: console.log('wrong input'); } // 第二回合:同样仅调用一次playRound const round2Result = playRound(); switch(round2Result) { case 'lose': console.log('you lost this round'); computerCounter++; break; case 'win': console.log('you won this round'); playerCounter++; break; case 'tie': console.log("it's a tie"); break; default: console.log('wrong input'); } // 最终胜负判断 if (computerCounter > playerCounter) { console.log('game over, pc won'); } else if (playerCounter > computerCounter) { console.log('game over, you won'); } else { console.log('game over, its a tie'); } } game();
关键修复点
- 每回合仅调用一次
playRound,将结果存入变量后再做判断,彻底避免多次触发输入框 - 把电脑选择的生成逻辑移到
playRound内部,确保每回合电脑重新随机出拳 - 增加输入大小写兼容处理,用户输入任意格式的选项都能被正确识别
- 用数组存储获胜条件,简化胜负判断逻辑,代码更易读维护
- 用
switch替代多层if/else,逻辑结构更清晰
内容的提问来源于stack exchange,提问作者ofg
相关产品推荐
相关产品推荐

