2012-04-22 3 views
0

나는 내 코드에서 (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() 메서드를 사용하여 시도했다 -> 같은 문제.

도움 주셔서 감사합니다.

답변

2

자바 얕은 사본을 사용 (FYI, TicTacToeState는 "플레이어 1", "Player2"및 "빈"을 포함하는 열거). 즉, 복사본을 얻을 수 있지만 원하는 것은 아닙니다. 깊은 사본이 필요합니다. 각 요소를 수동으로 returnList에 복사하고 어떤 결과가 발생하는지보십시오.

이 문제를 해결하는 또 다른 방법은 이동, 재귀, 이동을 해제하는 것입니다. 그렇다면 배열을 전혀 복사 할 필요가 없습니다.

0

2 차원 배열을 사용하고 있지만 시스템 배열 복사본의 배열의 첫 번째 차원 만 복사합니다. 나는 그 모든 것을 복사하지는 않을 것을 제안합니다. 아마도 가능한 다른 동작을 설명하기 위해 다른 것을 사용하십시오. 또한 배열의 내용은 복사하지 않고 배열 만 복사합니다.