控制台版Rock Paper Scissors循环执行结果不更新问题排查
问题:石头剪刀布游戏多轮调用时分数无法正确更新
尝试在控制台实现支持分数更新的3轮石头剪刀布游戏,在game函数外运行第一轮一切正常,但在game函数内多次调用相关函数时,结果始终停留在第一轮的状态,无法正确更新分数。原本计划通过playRound返回结果并传入updateScore来更新分数,但实际无论每轮选择结果如何,分数都不会变化。
原代码
let computerSelection = getComputerChoice(); let randomNum = Math.random(); function getComputerChoice() { let randomNum = Math.random() let computerSelection = ''; if (randomNum >= 0 && randomNum < 1 / 3) { computerSelection = 'rock'; } else if (randomNum >= 1 / 3 && randomNum < 2 / 3) { computerSelection = 'paper'; } else if (randomNum >= 2 / 3 && randomNum < 1) { computerSelection = 'scissors'; } console.log(computerSelection); return computerSelection } // prompt the player to make a selection let playerSelection = getPlayerChoice() function getPlayerChoice() { let playerSelection = prompt('Rock, Paper, or Scissors?').toLowerCase(); if (playerSelection === 'rock') { console.log('rock'); } else if (playerSelection === 'paper') { console.log('paper'); } else if (playerSelection === 'scissors') { console.log('scissors'); } return playerSelection } // compare the player selection to the comp selection and update a score let result = playRound(playerSelection, computerSelection) function playRound(playerSelection, computerSelection) { let result = ''; if (playerSelection === 'rock' && computerSelection === 'rock') { result = 'Tie Game!'; } else if (playerSelection === 'rock' && computerSelection === 'paper') { result = `Computer wins! ${computerSelection} beats ${playerSelection}`; } else if (playerSelection === 'rock' && computerSelection === 'scissors') { result = 'You win! Computer sucks!'; } else if (playerSelection === 'paper' && computerSelection === 'rock') { result = 'You win! Computer sucks!'; } else if (playerSelection === 'paper' && computerSelection === 'paper') { result = 'Tie Game!'; } else if (playerSelection === 'paper' && computerSelection === 'scissors') { result = `Computer wins! ${computerSelection} beats ${playerSelection} `; } else if (playerSelection === 'scissors' && computerSelection === 'rock') { result = `Computer wins! ${computerSelection} beats ${playerSelection}`; } else if (playerSelection === 'scissors' && computerSelection === 'paper') { result = 'You win! Computer sucks!'; } else if (playerSelection === 'scissors' && computerSelection === 'scissors') { result = 'Tie Game!'; }; console.log(result); return result; } let score = { wins: 0, losses: 0, }; function updateScore(result) { if (result === 'You win! Computer sucks!') { score.wins += 1; } else if (result === 'Tie Game!') { score = score; } else if (result === `Computer wins! ${computerSelection} beats ${playerSelection}`) { score.losses += 1; }; console.log(score) return score; }; updateScore(result); function game() { getPlayerChoice(); getComputerChoice(); playRound(playerSelection, computerSelection); updateScore(result); getPlayerChoice(); getComputerChoice(); playRound(playerSelection, computerSelection); updateScore(result); }; game();
问题根源与修复方案
1. 全局变量未更新,始终使用初始值
代码最外层提前调用了getComputerChoice()、getPlayerChoice()和playRound()并赋值给全局变量,但在game函数内调用这些函数时,没有将返回值重新赋值给对应变量,导致后续调用始终使用第一轮的初始值。
修复方式:在game函数内每轮调用后更新变量:
function game() { // 第一轮 playerSelection = getPlayerChoice(); computerSelection = getComputerChoice(); result = playRound(playerSelection, computerSelection); updateScore(result); // 第二轮 playerSelection = getPlayerChoice(); computerSelection = getComputerChoice(); result = playRound(playerSelection, computerSelection); updateScore(result); // 补充第三轮逻辑 }
2. updateScore中字符串匹配逻辑失效
updateScore里用模板字符串判断电脑获胜的条件,会因为每轮选择不同而生成动态字符串,且原代码中存在返回字符串末尾多空格的情况,导致匹配失败。
修复方式:通过关键词匹配代替完整字符串匹配:
function updateScore(result) { if (result.includes('You win')) { score.wins += 1; } else if (result.includes('Computer wins')) { score.losses += 1; } console.log(score) return score; };
3. 冗余代码清理
- 删除最外层提前调用的初始化代码(避免提前弹出prompt)
- 删除未使用的全局变量
randomNum
完整修复后的代码
function getComputerChoice() { let randomNum = Math.random() let computerSelection = ''; if (randomNum >= 0 && randomNum < 1 / 3) { computerSelection = 'rock'; } else if (randomNum >= 1 / 3 && randomNum < 2 / 3) { computerSelection = 'paper'; } else if (randomNum >= 2 / 3 && randomNum < 1) { computerSelection = 'scissors'; } console.log(computerSelection); return computerSelection } function getPlayerChoice() { let playerSelection = prompt('Rock, Paper, or Scissors?').toLowerCase(); console.log(playerSelection); return playerSelection } function playRound(playerSelection, computerSelection) { let result = ''; if (playerSelection === computerSelection) { result = 'Tie Game!'; } else if ( (playerSelection === 'rock' && computerSelection === 'scissors') || (playerSelection === 'paper' && computerSelection === 'rock') || (playerSelection === 'scissors' && computerSelection === 'paper') ) { result = 'You win! Computer sucks!'; } else { result = `Computer wins! ${computerSelection} beats ${playerSelection}`; } console.log(result); return result; } let score = { wins: 0, losses: 0, }; function updateScore(result) { if (result.includes('You win')) { score.wins += 1; } else if (result.includes('Computer wins')) { score.losses += 1; } console.log(score) return score; }; function game() { // 第一轮 let playerSelection = getPlayerChoice(); let computerSelection = getComputerChoice(); let result = playRound(playerSelection, computerSelection); updateScore(result); // 第二轮 playerSelection = getPlayerChoice(); computerSelection = getComputerChoice(); result = playRound(playerSelection, computerSelection); updateScore(result); // 第三轮 playerSelection = getPlayerChoice(); computerSelection = getComputerChoice(); result = playRound(playerSelection, computerSelection); updateScore(result); // 游戏结束显示最终战绩 console.log(`游戏结束!总战绩:胜${score.wins}场,负${score.losses}场`); }; game();
内容的提问来源于stack exchange,提问作者air
相关产品推荐
相关产品推荐

