2015-11-17 10 views
0

Хотя было много других вопросов о клонировании, я читал их ответы, и насколько мне известно, я, похоже, сделал большую часть того, что люди говорили.Java Cloning Checkers Game Board

В игре Java Checkers состояние платы представлено в виде 2D-массива, содержащего объекты класса Checker. Чтобы реализовать MiniMax AI, вам нужно создать дерево поиска, чтобы пройти по возможным состояниям игры & оценить их. По какой-то причине моя техника клонирования не сработала.

В настоящее время происходит то, что алгоритм MiniMax продолжает перемещать шашки вокруг основного игрового массива, поэтому, когда он решает о лучшем перемещении, Checker больше не перемещается, и возникает ошибка с нулевым указателем.

мне было интересно, если любой из вас могли бы взглянуть на мое клонирование и скажите мне, где я буду неправильно:

Game Board Конструктора:

public PlaySpace(Chequer[][] chequerBoard) 
    { 
     setState(chequerBoard); 
    } 

Набор государственного метода:

public void setState(Chequer[][] state) 
    { 
     Chequer[][] newBoard = new Chequer[8][8]; 
     for(int i = 0; i < state.length; i++){ 
      newBoard[i] = state[i]; 
     } 
     chequerBoard = newBoard; 
    } 

Создание новой настольной игры & клонировать значение текущего состояния к нему:

PlaySpace child = new PlaySpace(board.returnState()); 
child.setState(board.returnState()); 
child.moveChequer(move.returnCurrentX(),move.returnCurrentY(),move.returnDestX(),move.returnDestY()); 

Благодарим вас за это заранее! Пожалуйста, дайте мне знать, если я могу дать больше информации.

Cheers, Louis

+0

вы могли eleborate где you'd думает, что это будет «клон» что-то? – SomeJavaGuy

+2

В вашем конструкторе вы переопределяете значение параметра; вы можете вообще не передавать параметр. В вашем методе 'setState' вы копируете ссылки в' state' в локальную переменную, которая затем отбрасывается. –

+0

Также я думаю, что [прочитать это] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) может потенциально сделать вас способным исправить ошибки самостоятельно. – SomeJavaGuy

ответ

2

Вы не копируя 2 одномерный массив. Вы должны помнить, что массивы в Java являются объектами, а массивы массивов содержат ссылки на объекты массива, они могут содержать ссылки на один и тот же массив.

Так в основном у вас есть 2 Chequer[][] массивов (newBoard и state), которые оба содержат Chequer[] массив. Но вы не копируете массив Chequer[], вы назначаете их из одного массива Chequer[][] в другой.

Вот пример того, что происходит:

Chequer[] array = new Chequer[8]; 

Chequer[][] arrayOfArrays1 = new Chequer[8][]; 
// Assign element 0 of arrayOfArrays1 with array 
arrayOfArrays1[0] = array; 

Chequer[][] arrayOfArrays2 = new Chequer[8][]; 
// Assign element 0 of arrayOfArrays2 with arrayOfArrays1[0] == array 
arrayOfArrays2[0] = arrayOfArrays1[0]; 

arrayOfArrays1[0] Теперь и arrayOfArrays2[0] как ссылаться на тот же объект array и изменение array, изменит его в обоих 2 мерных массивов.

То, что вы должны сделать, это получить доступ к элементам во внутренних массивах с 2 размерным циклом:

for (int y = 0; y < state.length; y++) 
    for (int x = 0; x < state[y].length; x++) 
     newBoard[y][x] = state[y][x]; 
+0

спасибо большое! все отсортировано сейчас, stackoverflow на помощь еще раз – lel23