【问题标题】:Game of Life, method doesnt work人生游戏,方法不行
【发布时间】: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


【解决方案1】:

您在迭代过程中改变了细胞的活力。您需要做的是为下一代创建一个单独的数组并基于这一代进行更新,然后在您完全查看当前代后交换它们。

【讨论】:

  • 遗憾的是,我更改了 tmpboard 中的 alivnes,但在未更改的板上照顾邻居。我从不换板,我只改变它的副本(tmpboard)并返回副本编辑:好的,看起来你是对的。不知道为什么,原来的也变了
  • 数组是java中的对象。如果您有指向该数组的指针board 并创建tmpBoard,它们都指向同一个数组。这就是为什么你需要一个真正的副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多