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

为何在函数参数与函数返回字符串比较时会返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:07:32