
本文讲解如何通过变量存储 prompt 返回值,避免在多个条件判断中重复调用 prompt 导致用户被反复询问,从而修复 rock-paper-scissors 游戏逻辑中的计分异常问题。
本文讲解如何通过变量存储 prompt 返回值,避免在多个条件判断中重复调用 prompt 导致用户被反复询问,从而修复 rock-paper-scissors 游戏逻辑中的计分异常问题。
在 JavaScript 中,prompt() 是一个有副作用的函数:每次调用都会向用户弹出新对话框并等待输入。你当前代码的问题在于——在 if 和 else if 分支中分别调用了两次 play()(即两次 prompt()),这导致:
- 用户输入
'soup'时,第一个play()已返回'soup',但未保存; - 程序进入
else if后再次执行play(),重新弹窗,用户需再次输入; - 计分逻辑因此错乱:计算机需“赢”6次才能达3分,而玩家只需3次有效输入。
✅ 正确做法是:只调用一次 prompt(),将结果存入变量,后续所有判断均复用该变量值。
以下是修复后的完整 game() 函数(含优化建议):
function play() {
return prompt('Say something: ');
}
function game() {
let playerScore = 0;
let compScore = 0;
while (playerScore < 3 && compScore < 3) { // ✅ 修正逻辑:应为 AND(双方均未达3分才继续)
const userResponse = play(); // ← 关键:仅此处调用一次,结果存入变量
if (userResponse === 'cheese') {
playerScore++;
console.log('Player score:', playerScore);
} else if (userResponse === 'soup') {
compScore++;
console.log('Computer score:', compScore);
} else {
console.warn('Invalid input. Please enter "cheese" or "soup".');
continue; // 忽略无效输入,不计分,重新循环
}
// 检查胜负(放在循环末尾,确保每次输入后都校验)
if (playerScore === 3) {
console.log('? Player Wins!');
break;
} else if (compScore === 3) {
console.log('? Computer Wins!');
break;
}
}
}
game();? 关键改进点说明:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
单次获取 + 变量缓存:
const userResponse = play()是核心修复,确保输入值被复用; -
逻辑运算符修正:原
while (playerScore 会导致一方已达3分后仍继续循环(如 <code>playerScore=3, compScore=0时0 为真),应改为 <code>&&并统一目标为3分; -
输入校验与容错:增加
else分支提示非法输入,并用continue跳过本次循环,避免无效输入干扰计分; -
清晰的胜负终止:使用
break显式退出循环,比return console.log()更符合控制流规范(后者会提前终止整个函数,可能影响后续扩展)。
? 进阶提示:若要迁移到真正的 RPS 游戏,可将 play() 升级为带验证的输入函数:
function getPlayerChoice() {
while (true) {
const input = prompt('Choose: rock, paper, or scissors').trim().toLowerCase();
if (['rock', 'paper', 'scissors'].includes(input)) return input;
alert('Invalid choice! Try again.');
}
}这样既保持输入复用,又增强健壮性——这才是生产级交互逻辑的起点。

















