JavaScript开发控制台石头剪刀布游戏时布尔变量无法设为true问题
问题原因及修复方案
核心问题
- JavaScript中布尔值、数字等原始类型是按值传递:当你将
game函数内声明的playerWins、computerWins、playerScore、computerScore作为参数传入其他函数时,函数接收的只是这些值的副本,函数内部对参数的修改只会作用于副本,完全不会影响外层的原变量。playRound函数内部对playerWins、computerWins的赋值,修改的只是函数入参的副本,外层game函数里的两个布尔值永远保持初始的false- 同理
checkWinnerInEachRound中对分数的累加操作,也无法修改外层的playerScore、computerScore,最终统计的分数会一直为0
修复方案
我们可以调整playRound的逻辑,让它直接返回本轮的胜负结果,不需要通过入参修改外部变量,操作更直观:
- 修改
playRound函数,返回包含胜负状态和提示消息的对象:
// 调整后的playRound函数 function playRound(playerSelection, computerSelection) { let playerWins = false; let computerWins = false; let msg = ""; if (playerSelection === computerSelection) { msg = "No one wins. Move on."; } else if (playerSelection === 'Rock' && computerSelection === 'Scissors') { playerWins = true; msg = "You win! The computer chose Scissors, and Rock beats Scissors."; } else if (playerSelection === 'Scissors' && computerSelection === 'Rock') { computerWins = true; msg = "You lose! The computer chose Rock, and Rock beats Scissors"; } else if (playerSelection === 'Paper' && computerSelection === 'Rock') { playerWins = true; msg = "You win! The computer chose Rock, and Paper beats Rock."; } else if (playerSelection === 'Rock' && computerSelection === 'Paper') { computerWins = true; msg = "You lose! The computer chose Paper, and Paper beats Rock."; } else if (playerSelection === 'Scissors' && computerSelection === 'Paper') { playerWins = true; msg = "You win! The computer chose Paper, and Scissors beats Paper."; } else if (playerSelection === 'Paper' && computerSelection === 'Scissors') { computerWins = true; msg = "You lose! The computer chose Scissors, and Scissors beats Paper."; } return { playerWins, computerWins, msg } }
- 调整
game函数中调用playRound的逻辑,直接用返回的结果更新状态和分数:
// 原来调用playRound的部分替换为以下代码 const roundResult = playRound(playerSelection, computerSelection); console.log(roundResult.msg); console.log(roundResult.playerWins); console.log(roundResult.computerWins); // 直接在外层累加分数,无需额外传参 if (roundResult.playerWins) { playerScore++; } else if (roundResult.computerWins) { computerScore++; }
调整完成后,playerWins和computerWins的状态就能正确更新,分数统计逻辑也会正常运行。
内容的提问来源于stack exchange,提问作者Röyal
相关产品推荐
相关产品推荐

