调试生活游戏,Java

时间:2013-12-12 18:34:24

标签: java eclipse debugging logic conways-game-of-life

我正在尝试重现Game of Life,但我有一个错误。细胞根据设计诞生,但它们不会死亡。这使我感到困惑,因为我杀死细胞的策略与生成细胞的策略相同。这是控制台输出的一部分,'x'表示活细胞,' - '表示死细胞。

---------
---------
---------
---xx----
----x----
----x----
----xx---
---------
---------

---------
---------
---------
---xx----
----xx---
---xx----
----xx---
---------
---------

---------
---------
---------
---xxx---
----xx---
---xx----
---xxx---
---------
---------

相关的代码:

public class Life {

final static int WIDTH = 9, HEIGHT = 9;

void start(){

    // scanning input file

    char[][][] board =  new char[WIDTH][HEIGHT][maxAllowedGenerations];
    board = getInitialBoard(initialBoardString, maxAllowedGenerations, board);

    for (int generation = 1; generation < maxAllowedGenerations; generation++){
        for (int y = 0; y < HEIGHT; y++)
            for (int x = 0; x < WIDTH; x++){

                int numberOfNeighbours = getNumberOfNeighbours(x, y, generation - 1 , board);

                if (board[x][y][generation - 1] == '-' && numberOfNeighbours == 3)
                    board[x][y][generation] = 'x';

                else if (board[x][y][generation - 1] == 'x' && numberOfNeighbours < 2)
                    board[x][y][generation] = '-';

                else board[x][y][generation] = board[x][y][generation - 1];


                if (board[x][y][generation] == 'x')
                    ui.place(x, y, LifeUserInterface.ALIVE);
                else
                    ui.place(x, y, LifeUserInterface.DEAD);

                out.print(board[x][y][generation]);
            }
            out.println();
        }
    }
    out.println("Max number of generations reached");
    System.exit(0);             
}

2 个答案:

答案 0 :(得分:2)

我同意@elyashiv - 如果您将char[][][] board更改为SomeEnum[][][] board,并SomeEnum定义了值为LIVE_CELLDEAD_CELL的内容可读的。

此外,没有空字符''。空String只是一个String,长度为零(即没有字符),但是''没有意义。您可以使用null,但之后您必须放弃原始char声明并使用Character,因为原语不能null 1}}。

尽管如此,使用枚举来表示数据要好得多。如果你愿意,你甚至可以让你的枚举看起来像这样你可以像这样代表你的X和空字符:

public enum SomeEnum {
    LIVE_CELL("X"),
    DEAD_CELL("");

    public final displayString;

    SomeEnum(String displayString) {
        this.displayString = displayString;
    }    
}

然后,对于您的显示,您可以在代码中引用SomeEnum.LIVE_CELL.displayString

答案 1 :(得分:1)

发现两个错误!其中一个是你不可能发现的,因为我没有发布它所包含的代码:我是[x] [y] [g]的单元格。我在考虑[x] [y] [g - 1]是一个邻居,但那当然是我!我不是我自己的邻居。

另一个错误实际上有点令人尴尬。我遗漏了规则2 ...&gt;。&lt;

我也意识到我应该发布生命游戏的规则,而不是假设你们都知道它们,或者你们会费心去研究它们。现在有点晚了,但无论如何我会发布它们以防你感兴趣。另外,对于对自组织感兴趣的人,我真的推荐wiki article

规则:

  1. 活细胞&lt; 2个活着的邻居死了,好像是孤独的。
  2. 活细胞&gt; 3个活着的邻居死了,仿佛人口过剩。
  3. 活细胞2 || 3个活着的邻居活到下一代。
  4. 有3个活着的邻居的死亡细胞复活,好像通过繁殖一样。
  5. 感谢您的所有输入!