JavaScript实现石头剪刀布游戏返回前多一次循环的修复问题
问题根因
你的bug来自循环逻辑的执行顺序错误:
当前你写的while循环执行顺序为:
- 进入循环体
- 生成电脑出拳结果
- 弹出prompt请求用户输入
- 才校验当前双方得分是否达到5分阈值
也就是说上一轮对局结束后如果有一方得分刚好到5,下一轮循环还是会先弹出prompt,再执行结束逻辑,就出现了你遇到的多弹一次输入框的问题。
修复方案
直接把得分校验作为循环的执行条件,同时去掉冗余的gameContinue变量,调整后的完整代码如下:
// 补充缺失的全局options数组定义,否则代码会报未定义错误 const options = ['rock', 'paper', 'scissors']; let playerPoints = 0; let computerPoints = 0; // Computer Selection function computerPlay() { const compAnswer = options[Math.floor(Math.random() * options.length)]; return compAnswer; } // One round of the game results function playRound(playerSelection, computerSelection) { let rock = options[0]; let paper = options[1]; let scissors = options[2]; let youWin = "You Win! "; let youLose = "You Lose! "; let rockWin = "Rock beats scissors."; let scissorWin = "Scissors beats paper."; let paperWin = "Paper beats rock."; let tie = "It's a tie, no points added." if (playerSelection === computerSelection) { console.log(playerPoints, computerPoints); return tie; } else if (playerSelection === rock && computerSelection === scissors) { playerPoints = playerPoints + 1; console.log(playerPoints, computerPoints); return youWin + rockWin; } else if (playerSelection === rock && computerSelection == paper) { computerPoints = computerPoints + 1; console.log(playerPoints, computerPoints); return youLose + paperWin; } else if (playerSelection === scissors && computerSelection === rock) { computerPoints = computerPoints + 1; console.log(playerPoints, computerPoints) return youLose + rockWin; } else if (playerSelection === scissors && computerSelection === paper) { playerPoints = playerPoints + 1; console.log(playerPoints, computerPoints) return youWin + scissorWin; } else if (playerSelection === paper && computerSelection === rock) { playerPoints = playerPoints + 1; console.log(playerPoints, computerPoints); return youWin + paperWin; } else if (playerSelection === paper && computerSelection === scissors) { computerPoints = computerPoints + 1; console.log(playerPoints, computerPoints); return youLose + scissorWin; } else { console.log(playerPoints, computerPoints); return "I'm sorry please try another answer" } }; // 修改后的Game loop function game() { // 循环条件直接判断得分,只要任意一方到5分就不会进入循环体,不会触发prompt while (playerPoints < 5 && computerPoints < 5) { const computerSelection = computerPlay(); const playerSelection = prompt("Choose your weapon"); alert(playRound(playerSelection, computerSelection)); } // 循环结束后直接输出结果 if (playerPoints === 5) { console.log("You win"); } else { console.log("You Lose"); } }; game();
修改后只要任意一方得分达到5,就不会进入下一轮循环,自然不会再弹出多余的prompt输入框。
内容的提问来源于stack exchange,提问作者becmarley22
相关产品推荐
相关产品推荐

