为何在函数参数与函数返回字符串比较时会返回undefined?——石头剪刀布游戏函数故障排查
问题分析与修复方案
嘿,我一眼就看到问题出在哪了——你在rps函数里犯了一个很容易忽略的小错误:每次条件判断都重新调用了cpuPlay(),这会导致CPU的选择在同一个rps调用过程中反复随机变化!
举个例子:当你调用rps('paper')时,第一个if判断里调用cpuPlay()得到了rock,但到第二个else if时又调用了一次cpuPlay(),这次可能变成了scissors,结果三个条件都不匹配,自然就没有任何console.log执行,最终输出undefined。偶尔能得到正常输出,只是刚好几次cpuPlay()的随机结果碰巧一致,刚好命中了某个条件而已。
修复后的代码
你只需要在rps函数开头先调用一次cpuPlay(),把结果存进变量里,之后所有判断都用这个固定的变量值就行:
function cpuPlay(){ let numberGen = Math.floor(Math.random() * 3) if (numberGen === 0){ return 'rock' } if (numberGen === 1){ return 'paper' } if (numberGen === 2){ return 'scissors' } } function rps(playersChoice){ // 只调用一次cpuPlay,固定本次对局的CPU选择 const cpuChoice = cpuPlay(); if(playersChoice == 'paper' && cpuChoice == 'rock'){ console.log('你赢了!CPU选了rock'); } else if (playersChoice == 'paper' && cpuChoice == 'paper'){ console.log('平局!双方都选了paper'); } else if (playersChoice == 'paper' && cpuChoice == 'scissors'){ console.log('你输了!CPU选了scissors'); } } rps('paper')
额外优化建议
如果想让函数兼容大小写输入(比如用户传入Paper或PAPER),可以在函数开头加上一行处理:
playersChoice = playersChoice.toLowerCase();
这样不管用户输入什么大小写的选项,都能正确匹配判断条件。
内容的提问来源于stack exchange,提问作者Jermaine
相关产品推荐
相关产品推荐

