如何查找并移除多维数组中的数字 实现Bingo游戏中奖判定
Bingo游戏兑奖逻辑实现方案
需求说明
开发供家人游玩的Bingo(宾果)游戏,需要实现:
- 已叫号数字的高效处理方案
- 自动识别所有数字全匹配的中奖票券,将中奖票存入独立数组,简化兑奖流程
目前游戏其余功能已开发完成,现有票券数据结构如下:
var tickets = [ ['T1',1,2,8,10,23,18,44], ['T2',2,3,3,6,45,12,55], ['T3',4,7,10,42,55,45,60], ['T4',3,5,3,6,55,68,85], ['T5',1,4,3,6,66,74,80], ];
实现思路
不需要做「从票券里移除已叫号数字」的操作,直接用集合做存在性判断,逻辑更简单、性能更高,也不会破坏原始票券数据:
- 用
Set结构存储所有已经叫过的数字,单数字查询时间复杂度为O(1),比数组遍历的O(n)效率高很多 - 每次叫号后遍历所有未中奖的票券,跳过第一个票号字段,校验票上数字是否全部存在于已叫号集合中
- 校验通过的票直接推入独立的中奖票数组,后续兑奖直接读这个数组即可,不需要重复校验
可直接复用的代码
// 已叫号数字集合 const calledNumbers = new Set(); // 独立存储中奖票的数组,可按需存票号或者完整票数据 const winningTickets = []; // 叫号触发方法 function onNumberCalled(num) { calledNumbers.add(num); checkAllTickets(); } // 中奖校验逻辑 function checkAllTickets() { for (const ticket of tickets) { const ticketId = ticket[0]; // 已经中奖的票跳过,避免重复计入 if (winningTickets.some(item => item[0] === ticketId)) continue; // 从索引1开始是票面上的数字,全部匹配则标记为中奖 const isWin = ticket.slice(1).every(num => calledNumbers.has(num)); if (isWin) { winningTickets.push(ticket); } } }
针对你现有票券里存在重复数字的情况(比如T2、T4都包含两个3),上述逻辑可以直接适配,只要对应数字被叫过就算匹配,不需要额外处理重复值计数,符合常规Bingo游玩规则。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

