JS CLI石头剪刀布游戏计分失效、输入不识别问题排查求助
存在的问题及修复方案
- 问题1:随机出拳逻辑有边界漏洞
原computerPlay函数的判断条件没有覆盖anyPick = 0.3、anyPick = 0.6两个边界值,触发时函数返回undefined,导致后续比对逻辑全部失效。
修复:调整判断条件覆盖全区间,同时直接返回小写字符串,统一后续比对格式。 - 问题2:大小写不匹配导致比对失效
玩家输入通过toLowerCase()转成了全小写,但电脑返回的出拳结果是首字母大写格式,二者永远无法匹配平局规则,甚至会误判为输入错误。
修复:电脑出拳直接返回小写字符串,保持和玩家输入格式一致。 - 问题3:判断逻辑结构错误导致误报输入错误
原battleRound函数的else只跟最后一个if绑定,只要不满足最后一个胜负条件,哪怕玩家输入正确、触发了前面的平局/其他胜负规则,也有可能误返回输入错误提示。同时没有做输入合法性校验,用户点取消输入时调用toLowerCase()会直接抛错。
修复:先校验输入合法性,再调整判断逻辑,将所有胜负判断合并成多分支判断,最后再处理非法输入的情况。 - 问题4:作用域问题导致最终计分函数无法正常工作
定义的scores函数形参与全局计分变量重名,调用时如果不传参,函数内部会优先读取形参(值为undefined),无法拿到全局的真实分数;同时循环结束后没有调用该函数输出最终结果。
修复:删除scores函数的多余形参,循环结束后调用该函数输出最终结果。 - 其他优化点
修正单词拼写错误:Loose改为Lose,THEN改为THAN。
修复后完整代码
function computerPlay() { let anyPick = Math.random(); if (anyPick < 0.3) { return "rock"; } else if (anyPick < 0.6) { return "paper"; } else { return "scissors"; } } let aiScore = 0; let playerScore = 0; function battleRound(playerSelection, computerSelection) { // 先校验输入合法性 const validInputs = ['rock', 'paper', 'scissors']; if (!validInputs.includes(playerSelection)) { return "输入错误,请输入Rock/Paper/Scissors"; } if (playerSelection === computerSelection) { return "平局!"; } // 胜负判断 if ( (playerSelection === "rock" && computerSelection === "scissors") || (playerSelection === "paper" && computerSelection === "rock") || (playerSelection === "scissors" && computerSelection === "paper") ) { playerScore += 1; return `你赢了!${playerSelection} 击败 ${computerSelection}`; } else { aiScore += 1; return `你输了!${computerSelection} 击败 ${playerSelection}`; } } function getFinalResult() { if (aiScore > playerScore) { return "游戏结束:AI获胜,你输了!"; } else if (playerScore > aiScore) { return "游戏结束:恭喜你击败了AI!"; } else { return "游戏结束:双方平局!"; } } for (let i = 0; i < 5; i++) { let playerSelection = prompt("Choose: Rock, Paper or Scissors", ""); // 处理取消输入的情况 if (playerSelection === null) { alert("游戏已取消"); break; } playerSelection = playerSelection.trim().toLowerCase(); const computerSelection = computerPlay(); console.log("AI出拳:" + computerSelection); console.log(battleRound(playerSelection, computerSelection)); console.log("AI分数:" + aiScore, "玩家分数:" + playerScore); } // 输出最终结果 console.log(getFinalResult());
内容的提问来源于stack exchange,提问作者user6872370
相关产品推荐
相关产品推荐

