2

三目並べを表す2D配列があります。そして空のボックスはただの""; 私の現在のゲームボードは、2D文字列配列であるar1に保存されています。2D配列=3D配列の配列であるゲームボードの配列を作りたいです。だから私はそれがそのようになると思います:

String[][][]ar3 = new String[80][9][9]; // array of game boards

        for(int k=0;k<ar3.length;k++)// filling the array with the current game board
        {
            ar3[k] = ar1;
        }

ええ、私は80枚のボードが欲しいのですが、ゲームは9x9になります。今まではすべて問題ありませんでしたが、ゲームボード(ar1)を見て、ar3で可能な限りの動きをしたいと思います。だから、可能なすべての動きのために、私はar3にボードを手に入れました。そのために、ボード上の空のインデックスを含む配列を作成します。これは、ar2で可能なすべての移動です。

int[][]ar2 = new int[81][2]; // contains blank boxes indexes
        int line = 0;

        for(int k=0;k<SIZE;k++) //finds blank boxes indexes and adding to the array
            for(int j=0;j<SIZE;j++,line++)
            {
                if(ar1[k][j].equals(""))
                {
                    ar2[line][0] = k;
                    ar2[line][1] = j;
                }
                else
                {
                    ar2[line][0] = -1;
                    ar2[line][1] = -1;
                }

            }

ボックスにXまたはOである「」以外の何かがある場合にわかるように、-1を入力します。このコードは私が望むことを実行していますが、ここで問題が発生します。 ar3のar2:

String[][][]ar3 = new String[80][9][9]; // array of game boards

        for(int k=0;k<ar3.length;k++)// filling the array with the current game board
        {
            ar3[k] = ar1;
        }
        for(int k=0;k<ar3.length;k++)// making a move
        {
            int i1 = ar2[k][0];
            int i2 = ar2[k][1];
            if(!(i1 == -1 || i2 == -1))
                if(num%2==0)
                    ar3[k][i1][i2] = "X";
                else
                    ar3[k][i1][i2] = "O";
        }

ボードごとに1回移動するのではなく、ar3のインデックスごとに、すべてのボードに対してすべての移動を行う理由がわかりません。たとえば(3x3ボードでデモンストレーションします)^は前のボードを意味しますこのように見えます:

^ ^ ^
^ X ^
^ ^ ^

しかし、私が作成しようとしている「移動」(たとえば0,0)の後、すべてのボードは次のようになります。

O ^ ^
^ X ^
^ ^ ^

最初の1の代わりに...そして、2番目のボード(ar3 [1])の異なるインデックスで同じことをしていますが、すべてのボードに影響します..(ar3 [0-k])したがって、最終的には私は同じ80枚のボードを手に入れました。誰かアイデアがありますか?Kインデックスのボードだけでなく、すべてのボードを変更するのはなぜですか?

ありがとう!

4

1 に答える 1

5

コードを完全に理解しているかどうかわからないので、これは大げさな推測ですが、次のようになります。

最初の抜粋ではar3、同じオブジェクトへの参照内のすべてのスロットを指定していますar1。つまり、ar1のコンテンツを変更するとar3、すべてのアイテムが同じオブジェクトへの参照であるため、すべてのアイテムでその変更が表示されます。これがあなたの問題であるかどうかを確認することができます。

さて、コメントとして、これらの場合に個人的に役立つ2つのことを始めることをお勧めします。1つは、識別子にできるだけ意味のある名前を付けることです。コメントは、何が何であるかを理解するために実際には必要ありません。 。2つ目は、Javaのような言語で記述しているという事実を利用して、よりオブジェクト指向の方法でコードを記述しようとすることです。たとえば、3D配列の代わりに、(たとえば)GameBoardオブジェクトの通常の配列があり、それぞれに2D情報が含まれている場合、「疑わしい」コードパターンを作成するのに非常に良い効果があります(あなたの実際の意図に対応します、つまり)より明白です。

于 2012-12-10T22:36:04.963 に答える