You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript开发控制台宾果游戏如何避免条件判断陷入死循环?

宾果游戏卡顿问题修复方案

问题核心原因

  • 去重校验效率低:用数组遍历判断号码是否重复,每次校验时间复杂度为O(n),已出号码越多校验越慢,剩余号码越少时随机撞中未使用号码的概率越低,会触发大量无效循环
  • 错误递归逻辑:bombo函数发现号码重复时直接调用bingo(),会导致调用栈无限嵌套,内存占用持续升高,加剧卡顿
  • 随机数函数范围错误:原randomNum生成的数字范围是1~89,无法取到最大值90

优化方案

  1. 用Set替代数组存储已出号码,判断存在的操作时间复杂度为O(1),大幅提升校验效率
  2. 调整重复号码的处理逻辑:在bombo函数内部循环生成新号码,直到得到未使用的号码,避免不必要的递归
  3. 修正随机数生成逻辑,保证取值范围为1~90
  4. 避免使用未声明的全局变量,减少潜在逻辑风险

修复后代码

// 初始化已出号码存储容器,替换原数组
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:45:04