-2

私はこのテーマについて多くの検索を行いましたが、私の問題に役立つものは何も見つかりませんでした。整数配列に基づいてJavaで単純なメモリゲームを作成しています。配列に重複するエントリのみを含め、一意のエントリを含めないようにします。残念ながら、ここでの質問のほとんどは、重複するエントリの回避または削除に関するものですが、それらを強制することについてはどうでしょうか。

これまでの私のコードは次のようになっています。

public Field[] getField(){
    Random r = new Random();
    int pool = 16;
    ArrayList<Integer> used = new ArrayList<Integer>();
    int rand = r.nextInt(pool);
    System.out.println("First random: " + rand);

    for(int i = 0; i < fields.length; i++){
        System.out.println("ITERATION " + i + " STARTED");
        while(used.contains(rand)){
            System.out.println(rand + " is used, recalculating...");
            rand = r.nextInt(pool);
            System.out.println("New random is " + rand);
        }

        fields[i] = new Field(rand);
        System.out.println(rand + " added in Field " + i);

        int tmp = r.nextInt(fields.length - 1);
        System.out.println("First tmp calculated: " + tmp);

        while(fields[tmp] != null && i <= fields.length / 2){
            tmp = r.nextInt(fields.length - 1);
            System.out.println("Field " + tmp + " is used, looking for another...");
        }

        fields[tmp] = new Field(rand);
        System.out.println(rand + " added in temp Field " + tmp);

        used.add(rand);
        System.out.println("ITERATION " + i + " ENDED");
        System.out.println();
    }

    return fields;
}

fields []は、Field型の配列です(基本的に、メンバーは1つだけです(int id)。

4

1 に答える 1

1

あなたが何を求めているのかを正しく理解していれば、おそらくこれを必要以上に難しくしていると思います。

fields配列を順番Fieldsに反復処理し、反復ごとに同じ値を2つ追加してから、配列をシャッフルする方がはるかに簡単です。次のコードのようなもの:

{
    ...
    for (int i = 0; i < fields.length; i += 2)
        fields[i] = fields[i + 1] = new Field(r.nextInt(pool));

    shuffleFields(fields);

    return fields;
}

シャッフルアルゴリズムを選択できます。フィッシャーイェーツシャッフルが人気です。例えば:

void shuffleFields (Field[] fields)
{
    Random r = new Random();
    for (int i = fields.length - 1; i >= 1; --i)
    {
        int j = r.nextInt(i + 1);
        Field t = fields[i];
        fields[i] = fields[j];
        fields[j] = temp;
    }
}
于 2012-06-25T22:32:21.187 に答える