나는 내 코드에서 (IMHO) 이상한 행동을 취했다. 현재 Tic Tac Toe 게임을위한 minimax 알고리즘을 구현 중입니다. 내 "후계자"방법에서는 모든 가능한 동작을 결정하려고합니다. 코드는 다음과 같습니다.2 차원 배열 복사 - 여전히 참조를 사용합니까?
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;
}
위에서 볼 수 있듯이 가능한 모든 동작을 얻고 arraylist에 저장하려고합니다. 불행히도, "currentCopy"에서 값을 설정할 때 "필드"도 변경됩니다. 그러나 필자는 배열을 복사했기 때문에 필드를 재사용해서는 안됩니다. 실수는 어디 있습니까? 이미 2 차원 배열에서 clone() 메서드를 사용하여 시도했다 -> 같은 문제.
도움 주셔서 감사합니다.
는