有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

重复随机整数的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阵列中的重复数字。谢谢大家!

第二次编辑:我也对游戏本身感兴趣。这意味着,它将拉出随机数,并对应于数字是否在电路板上。如果宾果游戏的条件满足,那么做些什么。有人对此有什么建议吗


共 (6) 个答案

  1. # 1 楼答案

    创建一个表示宾果表的类。用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);
                }
            }
        }
    }
    

    这是一种用随机值填充网格的非常有效的方法

  2. # 2 楼答案

    当我编写BINGO boards时,我创建了一个包含所有可能唯一值的ArrayList,然后调用Collections.shuffle( mylist),它将随机重新排序这些值。然后,您可以迭代列表以填充矩阵

    只要确保你为每一块新的棋盘重新洗牌

  3. # 3 楼答案

    一种解决方案是使用另一种数据结构,该结构保存已生成并添加到表示卡的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;
    
  4. # 4 楼答案

    不要像那样使用随机函数-相反,用所有可能的随机数填充数组或ArrayList。然后随机删除其中的数字-这将确保您不会得到重复的数字,因为每个数字中只有一个存在

  5. # 5 楼答案

    下面是我实现它的方法

        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
    
  6. # 6 楼答案

    用从1N的数字填充ArrayList,然后使用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()));
    

    您可以很容易地将其包装到一个类中来组织事情