【发布时间】:2014-09-14 18:12:26
【问题描述】:
我不确定我是不是发疯了,但这就是我的问题:
我编写了 Game of Life 并有一个“countalive”方法来计算周围有多少场是活着的。
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),不是吗?) -
这行
Board tmpboard = board;是否为您提供了当前板的副本?如果以某种方式tmpboard == board,您的结果可能会得到解释——也就是说,您通过更改tmpboard来更改board。如果 Java 的规则对此不明确(对我来说不是),您可以通过更改tmpboard中的某些内容然后检查board本身来进行测试。 -
@Jongware 是的 board tmpboard = board 给了我一份副本。我在每次迭代后都打印了电路板和 tmpboard,你似乎是对的。董事会也会发生变化,即使它不应该发生变化
-
这是因为 Java 走上了
tmpboard = board字面意思的路线!事实上,既然它们是“平等的”,改变一个也会改变另一个。创建一个新的空板并复制各个单元格。 -
谢谢你,你是神。我不知道这件事。现在可以了!!
标签: java for-loop methods conways-game-of-life