私のコードには (IMHO) 奇妙な動作があります。現在、Tic Tac Toe ゲームのミニマックス アルゴリズムを実装しています。私の「後継者」メソッドでは、可能なすべての動きを決定したいと考えています。コードは次のとおりです。
private ArrayList<TicTacToeState[][]> successor(final TicTacToeState[][] field, TicTacToeState s) {
ArrayList<TicTacToeState[][]> returnList = new ArrayList<TicTacToeState[][]>();
for (int i = 0; i < TicTacToeGame.FIELDSIZE; i++) {
for (int j = 0; j < TicTacToeGame.FIELDSIZE; j++) {
if (field[i][j] == TicTacToeState.Empty) {
TicTacToeState[][] currentCopy = new TicTacToeState[TicTacToeGame.FIELDSIZE][TicTacToeGame.FIELDSIZE];
System.arraycopy(field, 0, currentCopy, 0, field.length);
currentCopy[i][j] = s; // <- field seems to be referenced?!
returnList.add(currentCopy);
}
}
}
return returnList;
}
ご覧のとおり、考えられるすべての動きを取得して、配列リストに保存したいと考えています。残念ながら、「currentCopy」に値を設定すると、「フィールド」も変更されます。ただし、配列をコピーしたため、フィールドを参照しないでください。間違いはどこですか?私はすでに2次元配列で clone() メソッドを使用しようとしました - >同じ問題。
助けてくれてありがとう。
(参考までに、TicTacToeState は "Player1"、"Player2"、"Empty" を含む列挙型です)