重复随机整数的java宾果纸牌游戏问题
我为宾果游戏创建了这个静态方法
public static void bingoCard(){
int [][]card = new int [5][5];
ArrayList<Integer> alreadyUsed = new ArrayList<Integer>();
boolean valid = false;
// First row
for(int row = 0; row < card.length; row++){
int tmp = 0;
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][0] = tmp;
valid = false;
}
// Second row
for(int row = 0; row < card.length; row++){
int tmp = 0;
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][1] = tmp;
valid = false;
}
// Third row
for(int row = 0; row < card.length; row++){
int tmp = 0;
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][2] = tmp;
valid = false;
}
card[2][2] = 0; // The 3rd matrix to the left and right is a 0.
// Fourth row
for(int row = 0; row < card.length; row++){
int tmp = 0;
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][3] = tmp;
valid = false;
}
// Fifth row
for(int row = 0; row < card.length; row++){
int tmp = 0;
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][4] = tmp;
valid = false;
}
// Creates an array to make title
String title[] = {"B","I","N","G","O"};
for(int i = 0; i < title.length;i++){
System.out.print(title[i] + "\t");
}
System.out.println();
for(int row = 0; row < card.length; row++){
for(int col = 0; col < card[row].length; col++){
System.out.print(card[row][col] + "\t");
}
System.out.println();
}
}
在输出中,这段代码输出到此控制台宾果卡:http://puu.sh/487mz/939c8d7a59.png
我的主要问题是重复数字。我很想知道如何消除5x5阵列中的重复数字。谢谢大家!
第二次编辑:我也对游戏本身感兴趣。这意味着,它将拉出随机数,并对应于数字是否在电路板上。如果宾果游戏的条件满足,那么做些什么。有人对此有什么建议吗
# 1 楼答案
创建一个表示宾果表的类。用0到99之间的数字填充数组。生成新表时,将此数组洗牌并按顺序从中提取数字
这是一种用随机值填充网格的非常有效的方法
# 2 楼答案
当我编写BINGO boards时,我创建了一个包含所有可能唯一值的ArrayList,然后调用
Collections.shuffle( mylist)
,它将随机重新排序这些值。然后,您可以迭代列表以填充矩阵只要确保你为每一块新的棋盘重新洗牌
# 3 楼答案
一种解决方案是使用另一种数据结构,该结构保存已生成并添加到表示卡的2D数组中的所有随机数
创建一个随机数后,您可以检查数据结构中是否已经存在该随机数。如果确实如此,则生成一个不同的数字。如果没有,则将其添加到卡和数据结构中
这里最好使用ArrayList,因为它已经为您编写了一个很好的contains方法。这里有一个例子
此外,在所有嵌套for循环中,您从不使用变量col。您只需在每个嵌套循环中去掉内部for循环即可
可以改成
而且
card[2][2]=0;
只需要发生一次,在这里您将多次设置它。这可以从到
# 4 楼答案
不要像那样使用随机函数-相反,用所有可能的随机数填充数组或ArrayList。然后随机删除其中的数字-这将确保您不会得到重复的数字,因为每个数字中只有一个存在
# 5 楼答案
下面是我实现它的方法
结果:
# 6 楼答案
用从
1
到N
的数字填充ArrayList
,然后使用java.util.Random
拾取/删除数字(无需乱洗):您可以很容易地将其包装到一个类中来组织事情