我为宾果游戏创建了这个静态方法。
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阵列中的重复数字。谢谢!
第二次编辑:我也有兴趣自己玩游戏。意思是,它会抽出随机数并对应数字是否在板上。如果BINGO条件满足条件,则执行某些操作。有没有人对此提出建议?
答案 0 :(得分:3)
当我编写BINGO板时,我创建了一个包含所有可能唯一值的ArrayList,然后调用Collections.shuffle( mylist)
,它将随机重新排序值。然后,您可以遍历列表以填充矩阵。
请确保为每个新制作的电路板重新洗牌
答案 1 :(得分:1)
一种解决方案是拥有另一个数据结构,该数据结构包含已生成并添加到代表该卡的2D数组中的所有随机数。
创建随机数后,您可以检查数据结构中是否已存在该数字。如果是,则生成不同的数字。如果没有,则将其添加到卡和数据结构中。
这里使用ArrayList很好,因为它有一个很好的contains方法,已经为你编写了。这是一个例子。
import java.util.ArrayList;
int [][]card = new int [5][5];
ArrayList<Integer> alreadyUsed = new ArrayList<Integer>();
boolean valid = false;
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;
}
同样在所有嵌套for循环中,您永远不会使用变量col。您可以简单地在每个嵌套循环中摆脱内部for循环。
for(int row=0; row < card.length; row++){
for(int col=0; col < card[row].length; col++){
card[row][0]=(int)(Math.random()*15)+1;
}
}
可以更改为
for(int row=0; row < card.length; row++){
card[row][0]=(int)(Math.random()*15)+1;
}
同样card[2][2]=0;
只需要发生一次,在这里你要设置多次。这可以从
for(int row=0;row<card.length;row++){
for(int col=0;col<card[row].length;col++){
card[row][2]=(int)(Math.random()*15)+31;
card[2][2]=0;
}
}
要
for(int row=0;row<card.length;row++){
card[row][2]=(int)(Math.random()*15)+31;
}
card[2][2]=0;
答案 2 :(得分:0)
不要使用这样的随机函数 - 而是用所有潜在的随机数填充数组或ArrayList。然后从中随机删除数字 - 这将确保您不会重复数字,因为每个数字中只有一个存在。
答案 3 :(得分:0)
创建一个代表宾果表的类。使用0到99之间的数字填充数组。生成新表时,将此数组洗牌并按顺序从中拉出数字。
public class BingoBoard{
Integer[] randomNumbers;
int[][] grid = new int[5][5];
public BingoBoard(){
randomNumbers = new Integer[100];
for(int i=0;i<randomNumbers.length;i++)
randomNumbers[i] = i;
populateCard();
}
public void set(int x, int y, int value){
grid[x][y] = value;
}
public void populateCard(){
//randomize the numbers you'll pull from.
//Array.asList will be backed by randomNumbers, so this works.
Collections.shuffle(Arrays.asList(randomNumbers));
for(int x=0;x<5;x++){
for(int y=0;y<5;y++){
int num = randomNumbers[x+y*5];
set(x,y,num);
}
}
}
}
这是使用随机值填充网格的一种非常有效的方法。
答案 4 :(得分:0)
您可以保留生成的已访问随机数列表,并在将此数字添加到游戏中之前进行检查
boolean[] visited = new boolean[100];
for(int i = 0; i < 100; i ++) visited[i] = false;
并在每个循环内使用此
for(int row=0; row < card.length; row++){
int num = (int)(Math.random()*15)+1;
if visited[num]{
row --;
continue;
}
visited[num] = true;
card[row][0] = num;
}
答案 5 :(得分:0)
使用ArrayList
到1
的数字填充N
,然后使用java.util.Random
选择/删除号码(不需要随机播放):
ArrayList<Integer> card = new ArrayList<Integer>(N);
for (int i = 0; i < N; i++)
card.add(i + 1);
Random random = Random();
int pick = card.remove(random.nextInt(card.size()));
你可以轻松地将它包装成一个类来组织事物。
答案 6 :(得分:0)
这是我实施它的方式。
int[][] board = new int[5][5];
ArrayList<Integer> list = new ArrayList<Integer>();
int number = 0;
int index = 0;
int increment = 1;
int col = 0;
//Run a loop until you're at your last column.
while (col < board.length) {
//Ensure uniqueness of your numbers
while (list.size() < 5) {
number = (int) (Math.random() * 15) + increment;
if (!list.contains(number))
list.add(number);
}
//Add elements to the array.
for (int i : list)
board[index++][col] = i;
//Set values for the next iteration.
index = 0;
increment += 15;
list.clear();
col++;
}
board[2][2] = 0;
//Print the board.
System.out.println("B\tI\tN\tG\tO\n");
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
System.out.print(board[i][j] + "\t");
System.out.println("");
}
结果:
B I N G O
9 29 34 59 62
8 23 44 52 64
7 16 0 53 63
1 19 33 46 71
15 17 41 58 61
答案 7 :(得分:0)
很简单,就用这个。
int element = 5;
List<Integer> numbers = new ArrayList<Integer>(element);
for (int i = 1; i <= element * element; i++)
numbers.add(i);
Collections.shuffle(numbers);
int[][] numArr = new int[element][element];
for (int i = 0, counter = 0; i < element; i++)
for (int j = 0; j < element; j++, counter++)
numArr[i][j] = numbers.get(counter);
for (int i = 0; i < numArr.length; i++) {
for (int j = 0; j < numArr[i].length; j++) {
System.out.printf("%-5d", numArr[i][j]);
}
System.out.println();
}