我的代码中有(恕我直言)一个奇怪的行为。我目前正在为井字游戏实现极小极大算法。在我的“继任者”方法中,我想确定所有可能的动作。这是代码:
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”中设置值时,“字段”也发生了变化。但是该字段不应该被引用,因为我复制了数组。错误在哪里?我已经尝试在二维数组上使用 clone() 方法 - >同样的问题。
感谢您的任何帮助。
(仅供参考,TicTacToeState 是一个包括“Player1”、“Player2”和“Empty”的枚举)