TheOdinProject石头剪刀布项目playRound函数无法循环问题排查
石头剪刀布5轮循环执行报错问题
- 前置说明:我是编程初学者,知道同类问题已有较多提问,但仍希望针对我编写的石头剪刀布游戏中playRound函数循环逻辑代码获得针对性反馈。
单独测试功能时可正常返回结果,确认playRound与computerPlay函数可正常工作,能随机返回三种选择结果,测试代码如下:
const playerSelection = "rock"; const computerSelection = computerPlay(); console.log(playRound(playerSelection, computerSelection));
但将playRound函数包裹在game函数中执行时,要么无任何响应,要么弹出两次输入提示后抛出如下错误,错误指向19、50、53行:
Uncaught TypeError: computerPlay is not a function
若按照TheOdinProject教程要求将变量设为playRound函数的入参,console.log会返回undefined,但不会抛出错误。
我查阅过他人的同类问题修复方案,知道当前代码写法不够规范整洁,但不希望直接照搬他人实现,否则无法达到学习效果,希望能修复当前代码使其正常返回5轮游戏的结果。
完整代码如下:
function humanPlayer() { let input = prompt("what do you choose, rock, paper, or scissors?"); } // computer makes a move function computerPlay() { computerPlay = Math.floor(Math.random() * 3) if (computerPlay === 0 ) { return "rock"; } else if (computerPlay === 1) { return "paper"; } else if (computerPlay === 2) { return "scissors"; } } function playRound() { const playerSelection = humanPlayer(); const computerSelection = computerPlay(); // rock if(playerSelection === "rock" && computerSelection === "scissors"){ return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "rock" && computerSelection === "rock") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "rock" && computerSelection === "paper") { return "AHAHAHA. You lost. Loser." } // paper else if (playerSelection === "paper" && computerSelection == "rock") { return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "paper" && computerSelection === "paper") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "paper" && computerSelection === "scissors") { return "AHAHAHA. You lost. Loser." } // scissors else if (playerSelection === "scissors" && computerSelection === "paper") { return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "scissors" && computerSelection === "scissors") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "scissors" && computerSelection === "rock") { return "AHAHAHA. You lost. Loser." } else { return "Good-bye" } } function game() { for (let i = 0; i < 5; i++) { playRound(); } } console.log(game())
当前核心疑问:为什么这段代码无法正常执行循环?
问题根因
循环逻辑本身没有问题,跑不满5轮是3处代码错误导致的:
computerPlay函数自覆盖
你在computerPlay函数内写了computerPlay = Math.floor(Math.random() * 3),这行没有声明新变量,直接给同名的函数标识符赋值了数字。第一次调用computerPlay时函数还存在,能正常返回结果,但执行完这行后computerPlay就被覆盖成了0/1/2的数字值,第二次循环再尝试调用computerPlay()时,JS无法对数字做函数调用,直接抛出类型错误,循环直接中断。humanPlayer没有返回值
你用input接收了prompt的输入内容,但没有写return input把值返回出去,导致playRound里拿到的playerSelection永远是undefined,所有胜负判断分支都不会命中,只会走到最后的else分支返回"Good-bye"。- 结果未打印、函数无返回值
你在game函数里只是调用了playRound(),没有打印或者接收返回值,加上game本身没有return语句,最后console.log(game())必然打印undefined,看不到每轮的对战结果。
修复后可运行代码
function humanPlayer() { let input = prompt("what do you choose, rock, paper, or scissors?"); // 补充返回值,顺手做小写转换避免用户输入大写匹配失败 return input?.toLowerCase(); } // 电脑出拳逻辑 function computerPlay() { // 更换变量名,不要覆盖函数本身 const randomNum = Math.floor(Math.random() * 3) if (randomNum === 0 ) { return "rock"; } else if (randomNum === 1) { return "paper"; } else if (randomNum === 2) { return "scissors"; } } function playRound() { const playerSelection = humanPlayer(); const computerSelection = computerPlay(); // 原有胜负判断逻辑不需要改动 if(playerSelection === "rock" && computerSelection === "scissors"){ return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "rock" && computerSelection === "rock") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "rock" && computerSelection === "paper") { return "AHAHAHA. You lost. Loser." } else if (playerSelection === "paper" && computerSelection == "rock") { return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "paper" && computerSelection === "paper") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "paper" && computerSelection === "scissors") { return "AHAHAHA. You lost. Loser." } else if (playerSelection === "scissors" && computerSelection === "paper") { return "Good job! You had a one in three chance to win and you did. Congratulations..."; } else if (playerSelection === "scissors" && computerSelection === "scissors") { return "Oh, Well. It could be worse. You Could of Chosen paper." } else if (playerSelection === "scissors" && computerSelection === "rock") { return "AHAHAHA. You lost. Loser." } else { return "Good-bye" } } function game() { for (let i = 0; i < 5; i++) { // 打印每轮结果,否则看不到返回内容 console.log(`第${i+1}轮结果:${playRound()}`); } } // 直接调用即可,不需要额外console.log game()
改完以上三点就能正常执行完5轮循环,看到每轮的对战结果。
内容的提问来源于stack exchange,提问作者brokenapple
相关产品推荐
相关产品推荐

