Я не уверен, что схожу с ума, но вот в чем моя проблема:
Я программирую игру «Жизнь» и использую «счетный» метод, который подсчитывает, сколько окружающих полей живо.
public int countalive(Board board, int yaxis, int xaxis) { //defekt
int living = board.getfields()[yaxis - 1][xaxis - 1] + board.getfields()[yaxis - 1][xaxis] + board.getfields()[yaxis - 1][xaxis + 1] +
board.getfields()[yaxis][xaxis - 1] + board.getfields()[yaxis][xaxis + 1] + board.getfields()[yaxis + 1][xaxis - 1] +
board.getfields()[yaxis + 1][xaxis] + board.getfields()[yaxis + 1][xaxis + 1];
return living;
}
Этот метод, кажется, работает отлично. Но когда я делаю это
public Board evolve(Board board) {
Board tmpboard = board;
System.out.println(countalive(board, 1, 3)); //I test with this. SHOULD AND IS 2!!
int aliveneighbours = 0;
for (int i = 1; i < board.getfields().length - 1; i++) {
for (int j = 1; j < board.getfields()[i].length - 1; j++) {
System.out.print("i = " +i);
System.out.print("j = " +j +" ");
aliveneighbours = countalive(board, i, j);
System.out.println(aliveneighbours);
if (aliveneighbours == 3) {
tmpboard.getfields()[i][j] = 1;
} else if (aliveneighbours < 2 || aliveneighbours > 3) {
tmpboard.getfields()[i][j] = 0;
}
}
System.out.println("");
}
return tmpboard;
}
Я получаю это в консоли:
2
i = 1j = 1 1
i = 1j = 2 1
i = 1j = 3 1
i = 1j = 4 1
i = 1j = 5 0
...
хотя i = 1 и j = 3 должно быть 2, а не 1. Как видите, метод countalive(board, 1, 3) работает, но в цикле for он дает другой результат. Вы можете найти мою ошибку?
Board
. Однако стоит отметить, что вы обращаетесь к(Y, X)
, что показалось мне странным (соглашение(X, Y)
, не так ли?) - person Dan   schedule 14.09.2014Board tmpboard = board;
копию текущей доски? Ваш результат может быть объяснен, если каким-то образомtmpboard == board
-- то есть вы меняетеboard
, изменяяtmpboard
. Если правила Java неясны в этом (для меня они непонятны), вы можете проверить, изменив что-то вtmpboard
, а затем изучив самуboard
. - person Jongware   schedule 14.09.2014tmpboard = board
буквально! Действительно, поскольку они равны, изменение одного изменяет и другое. Создайте новую пустую доску и вместо этого скопируйте отдельные ячейки. - person Jongware   schedule 14.09.2014