2

Tic Tac Toeのゲームに非常に基本的な AI を埋め込もうとしていますが、要求するのに最も適した正方形を識別するために使用する配列に問題が発生しています。

現在の状態のゲーム グリッドを表す 1 つの配列と、特定の正方形が要求された場合の外観を表す別の配列があります。

AI が変な判断をし続けるので、マイルストーンごとにさまざまな情報を報告するようにしました。

string[,] currentGrid;
string[,] hypotheticalGrid;


MessageBox.Show(currentGrid);

hypotheticalGrid = currentGrid;
hypotheticalGrid[x, y] = "O";

MessageBox.Show(currentGrid);

上記は実際のコードの非常に単純化されたバージョンであることに注意してください。

配列には線に沿って値が割り当てられ、メッセージ ボックスは含まれる値のシーケンスとして currentGrid を表示するように設定されます。

メッセージ ボックス間のコードを除いて、すべて正常に動作します。

問題は、後者が前者のコピーであり、2 つの間のスペースで currentGrid への変更が指定されていないにもかかわらず、2 つのメッセージ ボックスが異なる結果を表示することです。

間にある 2 行はソース コードから直接コピーされたもので、仮想グリッドにのみ影響します。明らかなように、これらの線は仮想グリッドをリセットし、問題の正方形に「O」を追加することになっています。

ただし、何らかの理由で「O」も現在のグリッドに配置されます。

私は何を間違っていますか?

4

3 に答える 3

3

この行hypotheticalGrid = currentGrid;は のコピーを作成しませんcurrentGrid。代わりに、両方の変数が同じ配列を指しています。したがって、hypotheticalGrid で行われた変更は currentGrid でも見られます。

hypotheticalGrid を currentGrid のコピーにする必要があります。

hypotheticalGrid = (string[,])currentGrid.Clone();

この場合、Clone().NET では文字列が不変であるため、動作します。それ以外の場合は、Clone十分ではないかもしれませんが、注意が必要です。

于 2012-09-23T17:00:38.843 に答える
2

問題は、あなたの課題です:

hypotheticalGrid = currentGrid;

は単なる参照割り当てです。つまり、両方ともメモリ内の同じ配列を指しているため、仮想グリッドへの変更は現在のグリッドにも影響します。

それらが互いに干渉しないようにするには、アイテム全体のコピーが必要です。

于 2012-09-23T16:59:42.883 に答える
0

配列は参照型であることに注意してください。割り当ては参照をコピーしますが、配列の複製は作成しません。代入後、両方の配列変数が同じ配列を指しています!

次のように配列の複製を作成できます。

string[] hypotheticalGrid = new string[currentGrid.Length];
Array.Copy(currentGrid, hypotheticalGrid, currentGrid.Length);

これは配列に含まれる項目の複製を作成しないことに注意してください。ただし、文字列は不変であるため、これは問題ではありません。つまり、配列の 1 つで文字列を操作すると、新しい文字列が作成されるため、2 番目の配列には影響しません。


編集:

他の投稿を見ると、次のClone方法で簡単に実行できることがわかります。

string[] hypotheticalGrid = currentGrid.Clone();
于 2012-09-23T17:08:15.613 に答える