石头剪刀布游戏页面刷新偶发无响应无报错,求问题原因
嘿,我帮你梳理下导致游戏没反应的几个关键问题,都是代码里的小细节出错了:
函数参数与内部函数重名冲突
你给game函数定义了computerSelection参数,但在函数内部又定义了同名的computerSelection函数。虽然JS在作用域上会优先用内部函数,但这种命名冲突会让逻辑变得混乱,而且当你通过onload="game()"调用时,参数是undefined,很容易触发意料之外的问题。建议把内部函数改个名字(比如getComputerSelection),或者直接删掉game函数的两个参数——毕竟你已经在函数内部给playerItem赋值,电脑选择也内部生成了,这俩参数完全多余。用错了逻辑运算符
你在条件判断里用了&,这是位运算符号,不是咱们需要的逻辑与!正确的逻辑与应该是&&。&会强制两边都求值,在布尔判断里的表现完全不符合预期,这直接导致你的条件判断几乎不会正确触发。每次判断都重新生成电脑选择
你在每个if语句里都调用computerSelection(),这意味着三次判断会生成三个不同的随机结果!比如第一次判断时电脑选了paper,第二次可能就变成scissors了,你的逻辑根本没法匹配到对应的结果。正确的做法是先把电脑的选择存到一个变量里,只生成一次,再用这个变量做所有判断。多余的函数参数引发混淆
你在onload里调用game()时没有传参数,但game函数定义了两个参数,虽然你内部给playerItem赋了值,但这种不一致很容易让代码出问题,直接删掉这俩参数就好。
修正后的代码示例
<body onload="game()"> <script> function game() { // 重命名内部函数避免冲突 function getComputerSelection() { var arr = ["rock", "paper", "scissors"]; return arr[Math.floor(Math.random() * 3)]; } var playerItem = "rock"; // 只生成一次电脑选择,存在变量里复用 var computerChoice = getComputerSelection(); if (playerItem == "rock" && computerChoice == "paper") { document.write(rockVSpaper); } else if (playerItem == "rock" && computerChoice == "scissors") { document.write(rockVSscissors); } else if (playerItem == "rock" && computerChoice == "rock") { document.write(rockVSrock); } } var rockVSpaper = "You lose! The computer's paper wraps your rock."; var rockVSscissors = "You won! Your rock make the computer's scissors blunt."; var rockVSrock = "Tie! A Rock doesn't do anything with another rock."; </script> </body>
这样修改后,页面加载时就会正确生成一次电脑选择,逻辑判断也能正常触发,不会再出现没反应的情况啦。
内容的提问来源于stack exchange,提问作者MaRK

