Java 从宾果游戏方法中压缩代码

Java 从宾果游戏方法中压缩代码,java,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;

我创建了一个方法,用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();
        }

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

我将在一秒钟内嵌套一个
for
循环,外部
for
循环在5列上循环。现在可以使用此列索引计算在每个for循环中添加的值(1、16等),并且可以直接在
二维数组中使用列索引

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;
    }
}
for(int col=0;/*在此处决定边界*/;col++){
//此处复制并修改了一个for循环

for(int row=0;row我将在一秒钟内嵌套一个
for
循环,外部
for
循环在5列上循环。您现在在每个for循环中添加的值(1、16等)可以使用此列索引进行计算,列索引可以直接在
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;
    }
}
for(int col=0;/*在此处决定边界*/;col++){
//此处复制并修改了一个for循环

对于(int行=0;行< p>),每当你想压缩代码时,你应该寻找模式。所以,让我们来看看你的代码的一部分:

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)+16;
tmp = (int)(Math.random()*15)+31;
tmp = (int)(Math.random()*15)+46;
tmp = (int)(Math.random()*15)+61;
很容易看出它是如何变化的——它只是每次增加15。至于另一行,它只是每次增加1

一旦您意识到这一点,就可以很容易地编写一个带有空白区域的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;
     }
}    
for(int i=0;i<\u\u\u;i++){
for(int行=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;
}

让我们看看这两条线是如何变化的

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。至于另一行,它只是每次增加1

一旦您意识到这一点,就可以很容易地编写一个带有空白区域的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;
     }
}    
for(int i=0;i<\u\u\u;i++){
for(int行=0;行

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

您可以以参数化方式指定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++;
    }
intaux=0;

对于(int row=0;row,您可以以参数化方式指定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++;
    }
intaux=0;


对于(int row=0;row你绝对应该研究嵌套循环。它们是所有编程的关键组成部分。@Thatidotguy他已经在使用嵌套循环了,lolWell true,但他应该使用更多的东西。谢谢你的回答。我的循环中有很多嵌套循环,这就是我提出这个问题的原因。我不确定如何实现moRE for for循环,以便不破坏我的代码。你应该考虑发布这样的问题。你绝对应该查看嵌套循环。它们是所有编程的一个关键构建块。@ ToTIOTHOTHE他已经使用嵌套循环LoWoReTress了,但是他应该使用MuleHee。谢谢你的回复。我有很多嵌套循环。循环,这就是为什么我提出这个问题。我不确定如何执行更多的循环,以便不破坏我的代码。你应该考虑把这样的问题发布到Hi RGTTMAN。你能给我演示一下我应该如何做这个的例子吗?我在每个循环中都有很多嵌套的循环,所以如果我再往前走,我会有点困惑。我已经修改过了。我的答案包含了一个模板来指导你找到解决方案。第一个空白:
i<4
第二个空白:
+1+15*i
第三个空白:
i
非常感谢!这很有效。嗨,Targetman。你能给我举个例子说明我应该怎么做吗?我在每个循环中都有许多嵌套的循环,所以我有点不太自信如果我再进一步的话,我会感到困惑。我已经修改了我的答案,加入了一个模板来指导你找到解决方案。第一个空格:
I<4
第二个空格:
+1+15*I
第三个空格:
I
非常感谢!这很有效。对于第一个空格,我假设
卡片[col]。长度
,第二个空格是+
(15)+1和
卡[行][col+1]
。对吗?顺便说一句,谢谢你仔细的解释。这真的很有帮助。@TheGreenColla好吧,你没有一个名为
col
的变量。但是,是的,外循环应该从0到4。至于第二个空格,如果你认为在每次迭代中它将等于
16
。第一次是这样的,但你没有'不需要16,16,16,16,…您需要16,31,46,…所以您必须修改它。同样,对于第三个空格,您没有一个名为col的变量。(但是您有一个名为
i
的变量)啊,我明白了。第一个空格:
4
。第三个空格:
I
。但是,对于第二个空格,我仍然不确定。第一个空格:
I对于第一个空格,我假设
card[col]。length
,第二个空格是+
(15)+1
,和
card[row][col 1]
。对吗?顺便说一句,谢谢你仔细的解释。这真的很有帮助。@TheGreenColla好吧,你没有一个名为
col
的变量。但是是的,外循环应该从0到4。至于