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  

コードを要約することに興味があります。現在、コードは 5 つの行を繰り返しているからです。提案をいただけますか?ありがとうございました。

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;

それでは、これらの 2 つの行がどのように変化するかを見てみましょう。

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;
     }
}    

ここから、空白を埋めることができます。

于 2013-08-22T17:03:12.860 に答える
0

forループの 1 つを、5 つの列をループする 2 番目の外側のループに入れ子にforします。各 for ループに追加する値 (1、16 など) は、この列インデックスを使用して計算でき、列インデックスはcard2D 配列で直接使用できます。

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 に答える