2017-03-07 9 views
0

私はコードがランダムに5つのセルを選択するペニーゲームを作成しています。私はそれを次のように設定しました:ランダムな配列の繰り返し

int a = gen.nextInt(5); 
    int b = gen.nextInt(5); 
    int c = gen.nextInt(5); 
    int d = gen.nextInt(5); 
    int e = gen.nextInt(5); 
    int f = gen.nextInt(5); 
    int g = gen.nextInt(5); 
    int h = gen.nextInt(5); 
    int i = gen.nextInt(5); 
    int j = gen.nextInt(5); 
    int penny1 = Parray[a][b]; 
    int penny2 = Parray[c][d]; 
    int penny3 = Parray[e][f]; 
    int penny4 = Parray[g][h]; 
    int penny5 = Parray[i][j]; 

問題はランダムなセルが繰り返されることがあるということです。

どのようにしてランダムなアレイセルを繰り返したり、再度選択することはできませんか?

+2

コード行を繰り返さないのはどうですか?ループを使用する必要があります。私はまた、いくつかの並べ替えの配列(2列、5行、各行はペアです)にセル座標を配置します。各ループの後に各ペアのランダムな値が得られたら、既に配列に存在するものをチェックし、既に存在する場合はリロールします。 – tnw

+0

まあ、5つの異なる値を10の変数に入れると、繰り返しは避けられません。 '(c、d)'が '(a、b)'を繰り返さない限り、 'b'と' c'は 'a'を繰り返すことができますか? –

+0

また、 'penny2'は' Parray'の別のセルから取り出しても 'penny1'を繰り返す可能性はありますか?もしそうなら、これは許可されていますか?言い換えると、2D配列に二重引用符が含まれている可能性がありますか? –

答えて

1

はオプションです:

List<Integer> pennies = new ArrayList<>(NUMBER_OF_PENNIES); 
    for (int p = 0; p < NUMBER_OF_PENNIES; p++) { 
     Integer penny; 
     do { 
      int a = gen.nextInt(5); 
      int b = gen.nextInt(5); 
      penny = pArray[a][b]; 
     } while (pennies.contains(penny)); 
     pennies.add(penny); 
    } 

これは、ペニーのリストに何も値が繰り返されていないことを確認します。代わりに、セルのインデックスを繰り返さないようにしたい場合は、もう少し複雑になりますが、同様のテクニックを使用できます。

Javaの命名規則に従って、2D配列の名前をpArrayに変更することができました。

0

あなたのペニーも一意になるように、(a、b)、(c、d)などの組み合わせがユニークであることを確認するだけでいいです。 (私はあなたが達成しようとしている何を考えている)5×5ペニー配列内のユニークなペアを取得するための非常に簡単な方法は次のとおりです。ここにあなたの正確な要件に応じて

public static boolean checkIfComboExists(ArrayList<int[]> map,int[] combo){ 
    for(int i = 0; i < map.size(); i++){ 
     int[] elem = map.get(i); 
     if(elem[0] == combo[0] && elem[1] == combo[1]){ 
      return true; 
     } 
    } 
    return false; 
} 

public static void main(String[] args){ 

    int[][] Parray = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; 
    Random gen = new Random(); 

    ArrayList<int[]> map = new ArrayList<int[]>(); 
    while (map.size() < 5){ 
     int x = gen.nextInt(5); 
     int y = gen.nextInt(5); 
     int[] combo = {x,y}; 
     if(!checkIfComboExists(map,combo)){ 
      map.add(combo); 
     } 
    } 

    int newpenny1 = Parray[map.get(0)[0]][map.get(0)[1]]; 
    int newpenny2 = Parray[map.get(1)[0]][map.get(1)[1]]; 
    int newpenny3 = Parray[map.get(2)[0]][map.get(2)[1]]; 
    int newpenny4 = Parray[map.get(3)[0]][map.get(3)[1]]; 
    int newpenny5 = Parray[map.get(4)[0]][map.get(4)[1]]; 

    System.out.println(newpenny1); 
    System.out.println(newpenny2); 
    System.out.println(newpenny3); 
    System.out.println(newpenny4); 
    System.out.println(newpenny5); 
} 
1
  1. Collections.shuffle(indexes); 
    
  2. (オプションのステップではなく、必要に応じてそれをシャッフル(?あなたは5x5のグリッド権利を持っている)25個の整数のリストを作成し、インクリメンタル

    List<Integer> indexes = new ArrayList<>(); 
    for (int i = 0; i < 25; i++) 
        indexes.add(i); 
    
  3. それを初期化します)最初の5つのインデックスが必要なのでリストを縮小してください

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24 
    
  4. (例:第2列の要素へのインデックス8相当し、第3列)の座標列行にこれらのインデックスのそれぞれを変換し、私はなかったと

    List<Integer> pickedPennies = new ArrayList<>(); 
    for (int i = 0; i < 5; i++) { 
        int row = indexes.get(i)/5; 
        int col = indexes.get(i) % 5; 
        pickedPennies.add(Parray[row][col]); 
    } 
    

対応ペニーを保存しますそれをテストしますが、私は考えがかなり簡単だと思います。この方法では、すでにペニーを選んだかどうかを確認するために、醜いwhileループを実装することを避けることができます。


オルタナティブ:

ストアリストであなたのペニー

List<Integer> pickedPennies = new ArrayList<>(); 
for (int i = 0; i < 5; i++) 
    for (int j = 0; j < 5; j++) 
     pickedPennies.add(Parray[i][j]); 

そしてリストの

Collections.shuffle(pickedPennies); 

まず5つの要素は、あなたのランダムペニー

あり、それをシャッフル