Java开发宾果游戏如何避免生成重复的随机号码?
宾果游戏号码去重实现方案
核心思路
提前构造包含1~75所有合法宾果球号的池,提前打乱顺序后按顺序取号,从根源避免重复抽取,性能远优于随机生成后再校验重复的方案,也方便后续扩展多卡片功能时共用抽取序列。
具体改动实现
- 删除原有无效的
while(c1 != c1)死逻辑(该判断永远为假,不会执行) - 初始化球号池并打乱,按顺序取号即可
- 可复用的延时逻辑可以抽成公共方法,减少冗余代码
修正后的完整代码如下:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ThreadLocalRandom; public class BingoGame { // 公共延时方法,减少冗余代码 private static void sleep5s() { try { Thread.sleep(5000); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } public static void main(String[] args) { // 这里假设你的b1-b5/i1-i5等变量已经提前初始化赋值 int b1=1,b2=2,b3=3,b4=4,b5=5; int i1=16,i2=17,i3=18,i4=19,i5=20; int n1=31,n2=32,n3=33,n4=34,n5=35; int g1=46,g2=47,g3=48,g4=49,g5=50; int o1=61,o2=62,o3=63,o4=64,o5=65; int b=0,i=0,n=0,g=0,o=0; // 初始化1-75的球号池 List<Integer> ballPool = new ArrayList<>(); for (int num = 1; num <=75; num++) { ballPool.add(num); } // 打乱球号顺序,模拟真实摇球 Collections.shuffle(ballPool, ThreadLocalRandom.current()); int drawIndex = 0; int Bingo = 0; sleep5s(); while(Bingo == 0 && drawIndex < ballPool.size()) { // 按顺序取号,不会重复 int c1 = ballPool.get(drawIndex); drawIndex++; if(c1 == b1 || c1 == b2 || c1 == b3 || c1 == b4 || c1 == b5){ b++; System.out.println("B " + c1); sleep5s(); } else if(c1 == i1 || c1 == i2 || c1 == i3 || c1 == i4 || c1 == i5){ i++; System.out.println("I " + c1); sleep5s(); } else if(c1 == n1 || c1 == n2 || c1 == n3 || c1 == n4 || c1 == n5){ n++; System.out.println("N " + c1); sleep5s(); } else if(c1 == g1 || c1 == g2 || c1 == g3 || c1 == g4 || c1 == g5){ g++; System.out.println("G " + c1); sleep5s(); } else if(c1 == o1 || c1 == o2 || c1 == o3 || c1 == o4 || c1 == o5){ o++; System.out.println("O " + c1); sleep5s(); } // 这里补充Bingo获胜的判断逻辑,满足条件时将Bingo设为1即可退出循环 } } }
后续扩展建议
如果后续要支持多张卡片,只要共用同一个ballPool的抽取序列即可,所有卡片都基于同一个摇球结果校验,符合真实宾果游戏的规则。
内容的提问来源于stack exchange,提问作者agentpinkdog
相关产品推荐
相关产品推荐

