You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制台版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:35