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

JS新手求助:石头剪刀布游戏回合执行次数异常问题

石头剪刀布游戏固定回合数问题修复

问题根源

  1. 重复调用playRound导致多次输入:你的game函数中,每个if/else if分支都调用了playRound(),比如第一个if判断触发一次输入,不满足条件时,下一个else if又会再次调用playRound,触发新的输入。这就是输入次数随机的核心原因。
  2. 电脑选择全局固定:computerSelection在全局作用域只生成一次,所有回合电脑都会出同一个选项,不符合游戏逻辑。
  3. 输入未做大小写兼容:用户输入小写的"rock"会被判定为错误输入,体验不佳。

修复后的代码

const computerChoice = ["Rock", "Paper", "Scissors"];

function getComputerChoice() {
    let random = Math.floor(Math.random() * computerChoice.length);
    return computerChoice[random];
};

function getPlayerChoice() {
    let choice = prompt('Take your pick! Rock, Paper, or Scissors?');
    // 统一转为大写首字母格式,兼容任意大小写输入
    return choice ? choice.charAt(0).toUpperCase() + choice.slice(1).toLowerCase() : "";
}

function playRound() {
    const lose = 'lose';
    const win = 'win';
    const tie = 'tie';
    const wrong = 'wrong';
    // 每回合重新生成电脑选择
    const computerSelection = getComputerChoice();
    const playerSelection = getPlayerChoice();

    // 先判断输入是否合法
    if (!computerChoice.includes(playerSelection)) {
        return wrong;
    }

    // 判断平局
    if (computerSelection === playerSelection) {
        return tie;
    }

    // 简化胜负判断逻辑
    const winConditions = [
        {player: "Rock", computer: "Scissors"},
        {player: "Paper", computer: "Rock"},
        {player: "Scissors", computer: "Paper"}
    ];
    const didWin = winConditions.some(cond => cond.player === playerSelection && cond.computer === computerSelection);
    
    return didWin ? win : lose;
}

let playerCounter = 0;
let computerCounter = 0;

function game(){
    // 第一回合:仅调用一次playRound,存储结果后再判断
    const round1Result = playRound();
    switch(round1Result) {
        case 'lose':
            console.log('you lost this round');
            computerCounter++;
            break;
        case 'win':
            console.log('you won this round');
            playerCounter++;
            break;
        case 'tie':
            console.log("it's a tie");
            break;
        default:
            console.log('wrong input');
    }

    // 第二回合:同样仅调用一次playRound
    const round2Result = playRound();
    switch(round2Result) {
        case 'lose':
            console.log('you lost this round');
            computerCounter++;
            break;
        case 'win':
            console.log('you won this round');
            playerCounter++;
            break;
        case 'tie':
            console.log("it's a tie");
            break;
        default:
            console.log('wrong input');
    }

    // 最终胜负判断
    if (computerCounter > playerCounter) {
        console.log('game over, pc won');
    } else if (playerCounter > computerCounter) {
        console.log('game over, you won');
    } else {
        console.log('game over, its a tie');
    }
}

game();

关键修复点

  • 每回合仅调用一次playRound,将结果存入变量后再做判断,彻底避免多次触发输入框
  • 把电脑选择的生成逻辑移到playRound内部,确保每回合电脑重新随机出拳
  • 增加输入大小写兼容处理,用户输入任意格式的选项都能被正确识别
  • 用数组存储获胜条件,简化胜负判断逻辑,代码更易读维护
  • 用switch替代多层if/else,逻辑结构更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:40:09