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

JS石头剪刀布:如何让playRound每次循环获取新参数?

石头剪刀布游戏问题修复

核心问题分析

  1. 全局变量导致重复选择:你把user和computer定义在全局,只会在页面加载时执行一次,所以每轮游戏用的都是同一个用户输入和电脑选择,自然只能运行一次有效对决。
  2. 循环条件错误:while (playerScore < 4 || compScore < 4)逻辑混乱,应该是只要双方都没到3分就继续循环,即playerScore < 3 && compScore < 3。
  3. 平局直接终止游戏:当前代码遇到平局就return round,直接结束游戏,不符合平局重赛的逻辑。
  4. getComputerChoice函数冗余:可以简化随机选择的逻辑,不用多个if判断。

修复后的完整代码

const choices = ['rock', 'paper', 'scissors'];

function getComputerChoice() {
    // 简化随机选择逻辑
    const randomIndex = Math.floor(Math.random() * choices.length);
    return choices[randomIndex];
}

function playRound(playerSelection, computerSelection){
    // 处理平局
    if (playerSelection === computerSelection) {
        return '平局!';
    } 
    
    // 玩家选石头
    if (playerSelection === choices[0]){
        return computerSelection === choices[1] ? '你输了!纸包石头。' : '你赢了!石头剪剪刀。';
    } 
    
    // 玩家选纸
    if (playerSelection === choices[1]){
        return computerSelection === choices[2] ? '你输了!剪刀剪纸。' : '你赢了!纸包石头。';
    } 
    
    // 玩家选剪刀
    if (playerSelection === choices[2]){
        return computerSelection === choices[0] ? '你输了!石头砸剪刀。' : '你赢了!剪刀剪纸。';
    } 
}

function game(){
    let playerScore = 0;
    let compScore = 0;

    // 循环直到一方先拿到3分
    while (playerScore < 3 && compScore < 3) {
        // 每轮重新获取用户输入和电脑选择
        const userInput = prompt('请选择:rock/paper/scissors').toLowerCase();
        // 可选:校验用户输入合法性
        if (!choices.includes(userInput)) {
            alert('输入无效,请输入rock、paper或scissors');
            continue;
        }
        const computerChoice = getComputerChoice();
        
        const roundResult = playRound(userInput, computerChoice);
        console.log(roundResult);

        // 根据结果更新分数
        if (roundResult.startsWith('你赢了!')) {
            playerScore++;
            console.log(`玩家分数:${playerScore}`);
        } else if (roundResult.startsWith('你输了!')) {
            compScore++;
            console.log(`电脑分数:${compScore}`);
        }
        // 平局不处理分数,直接进入下一轮
    }

    // 循环结束后判断最终胜负
    if (playerScore === 3) {
        console.log('恭喜你,最终获胜!');
    } else {
        console.log('电脑获胜,再来一局吧!');
    }
}

game();

关键修改说明

  • 每轮重新获取选择:把用户输入和电脑选择的逻辑移到game函数的循环内部,确保每一轮都生成新的选择。
  • 修正循环条件:改为playerScore < 3 && compScore < 3,只有当双方都没达到3分时才继续游戏。
  • 修复平局逻辑:平局不再终止游戏,而是直接进入下一轮循环,不改变分数。
  • 输入合法性校验:新增了用户输入的校验,避免无效输入导致游戏逻辑出错。
  • 简化getComputerChoice:直接通过随机索引获取选择,减少冗余代码。

内容的提问来源于stack exchange,提问作者SolomonM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:13:25