У меня (ИМХО) странное поведение в моем коде. В настоящее время я реализую минимаксный алгоритм для игры 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" меняется и "поле". Но поле не должно быть переработано, потому что я скопировал массив. Где ошибка? Я уже пробовал использовать метод clone() для двумерного массива -> та же проблема.
Спасибо за любую помощь.
(К вашему сведению, TicTacToeState — это перечисление, включающее «Player1», «Player2» и «Empty»)