Java 生活的游戏,方法是行不通的

Java 生活的游戏,方法是行不通的,java,for-loop,methods,conways-game-of-life,Java,For Loop,Methods,Conways 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

我不确定自己是否变得疯狂,但这就是我的问题所在:

我编写了《生命的游戏》的程序,有一个“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;
}

即使i=1和j=3应该是2而不是1。正如您所看到的,countalive(board,1,3)方法可以工作,但在for循环中,它给了我一个不同的结果。您能找到我的错误吗?

您正在迭代过程中更改单元格的有效性。您需要做的是为下一代准备一个单独的阵列,并根据这一代进行更新,然后在完全查看当前一代后交换它们。

我认为我们可能还需要查看您的测试
板的状态。但是值得一提的是,您正在访问
(Y,X)
,这让我感到奇怪(惯例是
(X,Y)
,否?)这行
线路板tmpboard=Board给你一份当前板的副本?如果
tmpboard==board
,您的结果可能会得到解释——也就是说,您通过更改
tmpboard
来更改
board
。如果Java的规则对此不清楚(我不清楚),您可以通过在
tmpboard
中更改某些内容,然后检查
board
本身来进行测试。@Jongware Yes board tmpboard=board给了我一份副本。每次迭代后,我都会打印电路板和tmpboard,您似乎是对的。该板也会发生变化,尽管它不应该发生变化,因为Java从字面上理解了
tmpboard=board
!事实上,既然他们是“平等的”,改变一个也会改变另一个。创建一个新的空板,并复制单个单元格。谢谢你,你是上帝。我不知道这件事。现在它工作了!!遗憾的是,没有,我在tmpboard中更改了alivnes,但在未更改的板中照顾邻居。我从来没有改变董事会,我只改变它的副本(tmpboard)并返回副本编辑:好的,似乎你是对的。我不知道为什么,但是最初的changesan数组是java中的一个对象。如果将指针
board
指向该数组并创建
tmpBoard
,则它们都指向同一数组。这就是为什么你需要一份真品。
2
i = 1j = 1 1
i = 1j = 2 1
i = 1j = 3 1
i = 1j = 4 1
i = 1j = 5 0
...