JavaScript开发控制台宾果游戏如何避免条件判断陷入死循环?
宾果游戏卡顿问题修复方案
问题核心原因
- 去重校验效率低:用数组遍历判断号码是否重复,每次校验时间复杂度为O(n),已出号码越多校验越慢,剩余号码越少时随机撞中未使用号码的概率越低,会触发大量无效循环
- 错误递归逻辑:
bombo函数发现号码重复时直接调用bingo(),会导致调用栈无限嵌套,内存占用持续升高,加剧卡顿 - 随机数函数范围错误:原
randomNum生成的数字范围是1~89,无法取到最大值90
优化方案
- 用
Set替代数组存储已出号码,判断存在的操作时间复杂度为O(1),大幅提升校验效率 - 调整重复号码的处理逻辑:在
bombo函数内部循环生成新号码,直到得到未使用的号码,避免不必要的递归 - 修正随机数生成逻辑,保证取值范围为1~90
- 避免使用未声明的全局变量,减少潜在逻辑风险
修复后代码
// 初始化已出号码存储容器,替换原数组 const numbersOut = new Set(); // 生成15个不重复数字的宾果卡牌,可替换为你自己的卡牌生成逻辑 const usedCardNum = new Set() const bingoCard = [] while(bingoCard.length < 15) { const num = Math.floor(Math.random() * 90) + 1 if(!usedCardNum.has(num)) { usedCardNum.add(num) bingoCard.push({number: num, matched: false}) } } function bingo(){ console.table(bingoCard); const bola = bombo(); for (let i = 0; i < bingoCard.length; i++){ if (bola === bingoCard[i].number){ bingoCard[i].number = 'X'; bingoCard[i].matched = true; } } const continuar = confirm('是否继续?'); if (continuar === true){ console.table(bingoCard); bingo(); }else { return '下次再见'; } } function randomNum(){ const min = 1; const max = 90; // 修正随机数范围,包含最大值90 return Math.floor(Math.random() * (max - min + 1)) + min; } function bombo(){ let bola; // 内部循环生成直到拿到未使用的号码 do { bola = randomNum(); } while(numbersOut.has(bola)) numbersOut.add(bola); console.log('已出号码:', Array.from(numbersOut)); alert('本轮摇出的号码是:' + bola); return bola; }
进阶优化提示
当前bingo函数采用递归调用,游玩回合过多时可能出现调用栈溢出,后续学习完循环逻辑后,可以将递归改为while循环实现,稳定性更高。
内容的提问来源于stack exchange,提问作者Rekoide
相关产品推荐
相关产品推荐

