JavaScript while循环多条件实现骰子游戏的代码问题排查
问题排查结论
你的代码核心bug是while循环的逻辑运算符使用错误,直接导致死循环:
当前判断条件为dice != numb1 || dice != numb2 || dice != numb3 || dice != numb4,该逻辑永远返回真:
- 或逻辑(
||)的规则是只要任意一个子条件为真,整个判断就为真 - 哪怕骰子掷中了终止值2,此时
dice != 2为假,但dice !=3、dice !=6、dice !=12均为真,整个循环条件依然成立,程序会永远运行下去 - 单条件判断时因为没有其他或分支,所以可以正常终止,和你观察到的现象完全一致
除此之外代码还有两个小问题:
- 投掷次数初始值设为1错误:第一次投掷是进入循环后才执行的,初始值应为0,否则最终统计的次数会比实际多1次
- 随机数生成逻辑不符合真实骰子概率:
Math.floor(Math.random() * 11) + 2会让2-12的每个点数出现概率均等,但真实两枚六面骰子掷出和为7的概率是和为2的6倍,需要分别生成两个1-6的随机数求和才符合规则
修复后可直接运行的代码
function play() { var dice = -1; var rolls = 0; // 未命中任意终止值时持续投掷 while (dice != 2 && dice != 3 && dice != 6 && dice != 12) { // 模拟两枚独立六面骰子 var die1 = Math.floor(Math.random() * 6) + 1; var die2 = Math.floor(Math.random() * 6) + 1; dice = die1 + die2; rolls++; } document.getElementById('results').innerHTML = 'Your dice landed on: ' + dice; document.getElementById('rolls').innerHTML = 'Rolls: ' + rolls; }
逻辑说明
- 循环判断将
||替换为&&(与逻辑):只有当骰子点数同时不等于四个终止值时,才会继续循环;命中任意一个终止值时,循环条件立刻不成立,退出循环输出结果 - 投掷计数从0开始累加,每完成一次投掷计数+1,最终结果和实际投掷次数完全匹配
- 分开生成两个骰子的点数再求和,符合真实掷骰子的概率分布
内容的提问来源于stack exchange,提问作者sansievar
相关产品推荐
相关产品推荐

