0

我创建了一个方法,它使用 1 到 75 的整数来流行一个 5 x 5 数组,为宾果游戏卡奠定了基础。

public static void bingoCard(){

        int [][]card=new int [5][5];
        ArrayList<Integer> alreadyUsed = new ArrayList<Integer>();
        boolean valid = false;
        int tmp = 0;

        for(int row=0; row < card.length; row++){
            while(!valid){
                tmp = (int)(Math.random()*15)+1;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][0]= tmp;
            valid = false;
        }

        for(int row=0;row<card.length;row++){
            while(!valid){
                tmp = (int)(Math.random()*15)+16;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][1]= tmp;
            valid = false;
        }

        for(int row=0;row<card.length;row++){
            while(!valid){
                tmp = (int)(Math.random()*15)+31;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][2]= tmp;
            valid = false;
        }

        card[2][2]=0;

        for(int row=0;row<card.length;row++){
            while(!valid){
                tmp = (int)(Math.random()*15)+46;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][3]= tmp;
            valid = false;
        }

        for(int row=0;row<card.length;row++){
            while(!valid){
                tmp = (int)(Math.random()*15)+61;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][4]= tmp;
            valid = false;
        }

        //create 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();
        }

样本输出:

B   I   N   G   O   
14  23  31  49  66  
13  29  45  52  65  
15  20  0   60  64  
5   21  33  54  63  
6   16  40  57  71  

我对压缩代码很感兴趣,因为到目前为止,它重复了五行。我能得到一些建议吗?谢谢你。

4

3 回答 3

2

每当您想压缩代码时,您都应该寻找模式。所以,让我们来看看你的部分代码:

for(int row=0; row < card.length; row++){
    while(!valid){
        tmp = (int)(Math.random()*15)+1;
        if(!alreadyUsed.contains(tmp)){
            valid = true;
            alreadyUsed.add(tmp);
        }
    }
    card[row][0]= tmp;
    valid = false;
}

事实证明,大多数情况在您的代码中重复出现。唯一改变的是:

tmp = (int)(Math.random()*15)+1;

card[row][0]= tmp;

那么让我们看看这两行是如何变化的。

tmp = (int)(Math.random()*15)+16;
tmp = (int)(Math.random()*15)+31;
tmp = (int)(Math.random()*15)+46;
tmp = (int)(Math.random()*15)+61;

很容易看出这是如何变化的——它每次只增加 15。至于另一行,它只是每次增加一个。

一旦您意识到这一点,就很容易编写一个带有空白区域的 for 循环,您需要在其中替换。

for (int i = 0; i < _____; i++) {
    for (int row = 0; row < card.length; row++) {
        while (!valid) {
            tmp = (int) (Math.random() * 15) + _____;
            if (!alreadyUsed.contains(tmp)) {
                valid = true;
                alreadyUsed.add(tmp);
            }
        }
        card[row][_____] = tmp;
        valid = false;
     }
}    

从这里,您可以填写空白。

于 2013-08-22T17:03:12.860 回答
1

您可以在参数 fashon 中分配 tmp 的值,并根据行号进行相应更改:

    int aux = 0;
    for(int row=0;row<card.length;row++){
        while(!valid){
            tmp = (int)(Math.random()*15) + 1 + 15 * aux;
            if(!alreadyUsed.contains(tmp)){
                valid = true;
                alreadyUsed.add(tmp);
            }
        }
        card[row][4]= tmp;
        valid = false;
        aux++;
    }

现在你只能写一次。

于 2013-08-22T17:04:44.233 回答
0

我会将您for的一个循环嵌套在第二个外部for循环中,该循环遍历 5 列。现在你在每个for循环中添加的值(1、16等)可以用这个列索引来计算,列索引可以直接在card二维数组中使用。

for (int col = 0; /* Decide on your bounds here*/ ; col++) {
   // One of your for loops is copied and modified here
   for(int row=0;row<card.length;row++){
        while(!valid){
            tmp = (int)(Math.random()*15) + (/* calculation here*/) + 1;  
            if(!alreadyUsed.contains(tmp)){
                valid = true;
                alreadyUsed.add(tmp);
            }
        }
        card[row][/* Decide what to use here*/]= tmp;
        valid = false;
    }
}

控制的逻辑[2][2]可以用if. 我将把它作为如何包含该逻辑的练习。

于 2013-08-22T16:57:23.343 回答