重复随机整数的宾果卡游戏问题

时间:2013-08-22 15:14:43

标签: 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阵列中的重复数字。谢谢!

第二次编辑:我也有兴趣自己玩游戏。意思是,它会抽出随机数并对应数字是否在板上。如果BINGO条件满足条件,则执行某些操作。有没有人对此提出建议?

8 个答案:

答案 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)

使用ArrayList1的数字填充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();
    }