JS石头剪刀布游戏for与do-while嵌套后条件判断未逐轮执行问题
问题根因
- 控制台输出被阻塞缓冲:
prompt是同步阻塞方法,多数浏览器的控制台会在连续阻塞的同步任务执行期间,把console.log的内容暂存到缓冲区,等所有阻塞的prompt交互完成后才一次性把所有缓冲的日志打印出来,这就是你看到6轮结束才一起出结果的直接原因。 - 循环嵌套逻辑不符合预期:你把
for循环整个包在了do-while里面,导致for循环必须完整跑完6次才会触发do-while的条件判断,哪怕中间某一轮已经把win设为true了,剩下的for循环迭代还是会继续执行。 - 变量状态与边界场景缺失:全局定义的
win变量不会在每次启动游戏时自动重置,而且你没有补充平局的判断逻辑,如果6轮全是平局,win始终为false会触发do-while的无限循环。
修复后可直接运行的代码
var arr = ['rock', 'scissor'] function play(arr){ // win变量放函数内部,每次启动游戏自动重置状态 let win = false // 移除不必要的do-while嵌套,直接用for控制6轮对局 for(let i=0; i<6;i++){ var a = prompt(`第${i+1}轮对局,请输入选择(rock/scissor):`) console.log(`第${i+1}轮用户选择:`, a) var b = arr[(Math.floor(Math.random()*2))] console.log(`第${i+1}轮电脑选择:`, b) if(a==="rock" && b==="scissor"){ console.log("Rock crushes Scissor! You win!") win=true } else if(b==="rock" && a==="scissor"){ console.log("Rock crushes Scissor! You lose!") win=true } else { // 补充平局场景判断 console.log("本局平局") } // 每轮结束加弹窗阻断后续prompt,触发控制台刷新缓冲,实现每轮实时输出日志 alert("本局结果已打印到控制台,点击确定进入下一轮") } check_winner(win) } function check_winner(win){ if(win===true){ console.log("game over") } else{ prompt("6轮全为平局,请重新开始") } } play(arr)
关键修改说明
- 调整了循环嵌套结构,符合6轮独立对局的需求
- 新增每轮结束的alert弹窗,触发控制台刷新缓冲,解决日志延迟输出的问题
- 优化变量作用域,补充边界场景判断,避免出现无限循环、状态残留的问题
- 给日志增加了轮次标记,方便调试查看
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

