宾果游戏方法的冷凝代码

时间:2013-08-22 16:54:54

标签: java

我创建了一个方法,使用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  

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

3 个答案:

答案 0 :(得分: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;
     }
}    

从这里,你可以填补空白。

答案 1 :(得分: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++;
    }

现在你只能写一次。

答案 2 :(得分:0)

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

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的逻辑。我将此作为一种练习,将如何包含这种逻辑。