JavaScript实现1-100猜数字游戏出现无限循环崩溃该如何修复
猜数字游戏问题排查与修复方案
问题根因
- 无限循环的核心原因是你仅在调用函数时获取了1次用户输入,整个
while循环逻辑中没有更新input变量的值:如果第一次输入的数值不等于随机生成的目标数字,循环永远无法触发break条件,会持续重复执行判断分支,最终导致程序崩溃。 prompt返回值为字符串类型,直接和数字类型的目标值做比较,存在类型匹配隐患,如果用户输入非数字内容,也会导致永远无法命中相等判断,触发无限循环。- 函数定义的
rand、number、tries形参属于冗余设计,你在函数内部直接对这几个变量重新赋值,完全不需要从外部传参。
修复后的完整代码
var generator = function(){ // 生成1-100的随机整数 const rand = 100 * Math.random(); const targetNumber = Math.ceil(rand); let tries = 0; while (true){ // 每次循环都重新获取用户输入 let input = prompt("请输入一个1-100之间的数字"); // 处理用户点取消的情况 if (input === null) { console.log("游戏已退出"); break; } // 把输入转成数字,校验合法性 input = Number(input); if (isNaN(input) || input < 1 || input > 100) { console.log("请输入有效的1-100之间的数字"); continue; } tries += 1; if (input > targetNumber){ console.log("你输入的数字比我想的要大"); } else if (input < targetNumber){ console.log("你输入的数字比我想的要小"); } else { console.log(`恭喜你猜对了!总共猜了${tries}次`); break; } } } generator();
关键修改说明
- 把获取用户输入的
prompt逻辑移到了while循环内部,每次判断前都重新获取最新的用户输入,保证循环能走到终止条件。 - 增加了输入合法性校验:处理用户取消输入、输入非数字、输入超出1-100范围的场景,避免异常输入导致死循环。
- 移除了冗余的函数形参,优化了变量命名可读性,统计猜题次数的逻辑统一放到判断分支外,避免重复代码。
内容的提问来源于stack exchange,提问作者Αντώνιος Θωμάς
相关产品推荐
相关产品推荐

