为什么我要实施Conway';java中的生活游戏不起作用?

为什么我要实施Conway';java中的生活游戏不起作用?,java,algorithm,conways-game-of-life,Java,Algorithm,Conways Game Of Life,我正在开发一个程序来演示康威的人生游戏。我写的算法看起来简单而有意义,尽管JRE似乎不适合我。每个单元格对象都有两种状态,指示它是否处于活动状态和活动状态。简单地说,只有当算法迭代单元格二维数组的所有成员时,才会激活单元格。这是程序最重要的方面,因为程序需要知道所有单元的先前状态。最后,当邻居检查算法发现一个单元(活着或不活着)被3个单元包围时,就会产生一个新的单元 我通过查看周围的单元是否处于活动状态来计算单个单元的邻居数。所以当一个新的细胞诞生时,它没有考虑。它按预期工作 我看不到我的算法有

我正在开发一个程序来演示康威的人生游戏。我写的算法看起来简单而有意义,尽管JRE似乎不适合我。每个单元格对象都有两种状态,指示它是否处于活动状态和活动状态。简单地说,只有当算法迭代单元格二维数组的所有成员时,才会激活单元格。这是程序最重要的方面,因为程序需要知道所有单元的先前状态。最后,当邻居检查算法发现一个单元(活着或不活着)被3个单元包围时,就会产生一个新的单元

我通过查看周围的单元是否处于活动状态来计算单个单元的邻居数。所以当一个新的细胞诞生时,它没有考虑。它按预期工作

我看不到我的算法有什么问题

更新

我发现邻居检查算法在我全新的process()方法中产生了错误的数据。另外,我改变了游戏背后的基本算法。我开始使用两个单独的2D布尔数组,而不是同时保存两个状态的单个数组。这让事情变得容易多了。然而,该项目继续提供有趣和不受欢迎的数据

private void process(){
    boolean[][] temp = new boolean[BOARD_LENGTH][BOARD_LENGTH];

    for(int i=0; i<cells.length; i++)
        for(int j=0; j<cells[i].length; j++){
            if(i == 5 && j == 5)
                System.out.println(getNeighborNumbers(i,j));//THIS IS WHERE I NOTICED THE PROBLEM. OUTSIDE THİS process() method, getNeighborNumbers() method works flawlessly, though when it comes here, things get interesting. 
            if(getNeighborNumbers(i,j) < 2 || getNeighborNumbers(i,j) > 3 )
                temp[i][j] = false;
            else if(cells[i][j] = true && getNeighborNumbers(i,j) == 2)
                temp[i][j] = true;
            else if(getNeighborNumbers(i,j) == 3)
                temp[i][j] = true;
        }


    for(int i=0; i<cells.length; i++)
        for(int j=0; j<cells.length; j++)
            cells[i][j] = temp[i][j];

    /*
    System.out.println("5,4 " + getNeighborNumbers(5,4) +" "+ cells[5][4]);
    System.out.println("5,5 " + getNeighborNumbers(5,5) +" "+ cells[5][5]);
    System.out.println("5,6 " + getNeighborNumbers(5,6) +" "+ cells[5][6]);
    System.out.println("6,5 " + getNeighborNumbers(6,5) +" "+ cells[6][5]);
    System.out.println("6,6 " + getNeighborNumbers(6,6) +" "+ cells[6][6]);
    */

}


private int getNeighborNumbers(int i, int j){
    int neighbors = 0;

    if(i>0 && j>0 && cells[i-1][j-1] == true)
        neighbors++;
    if(i>0 && cells[i-1][j] == true)
        neighbors++;
    if(i>0 && j+1< BOARD_LENGTH && cells[i-1][j+1] == true)
        neighbors++;
    if(j>0 && cells[i][j-1] == true)
        neighbors++;
    if(j+1<BOARD_LENGTH && cells[i][j+1] == true)
        neighbors++;
    if(i+1<BOARD_LENGTH && j>0 && cells[i+1][j-1] == true)
        neighbors++;
    if(i+1 <BOARD_LENGTH && cells[i+1][j] == true)
        neighbors++;
    if(i+1<BOARD_LENGTH && j+1<BOARD_LENGTH && cells[i+1][j+1] == true)
        neighbors++;

    return neighbors;
}
private void进程(){
布尔值[][]临时值=新布尔值[BOARD_LENGTH][BOARD_LENGTH];
对于(int i=0;i0&&cells[i-1][j]==true)
邻居++;
如果(i>0和&j+1<电路板长度和单元[i-1][j+1]==true)
邻居++;
如果(j>0&&cells[i][j-1]==true)
邻居++;

如果(j+1您正在更改单元格,则不使用上一次迭代的单元格状态


换句话说,您需要存储上一个“板”的状态,并使用它创建一个新板。

大量代码;绝对没有提到它是什么或没有正确执行?编辑将删除大约90%的无关代码转储,不要鼓励像这样无用的修复我的代码转储简单地说,只有当算法迭代单元格二维数组的所有成员时,才会激活单元格。"--激活仅基于以前的状态发生。Maarten是对的,当您的代码更改状态时,下一位使用更改的状态,而不是副本的以前状态。您创建一个副本,然后这样做以创建板的新激活状态。而不是简单地在扫描行中对板进行迭代,从而破坏状态我确实在某种程度上使用了上一次迭代的状态。邻居计数算法只考虑活动单元格,并且只有在算法完成工作后,单元格才会变为活动单元格。事实上,@BurakGüneş,从我看来这不是真的。你调用
getneighbornumbers
,然后改变该单元格,然后再次调用该匿名方法,然后更改状态,……除非
GetNeighborNumbers
保留了一份董事会的防御性副本(未显示在本文中),这会带来麻烦。你也不会显示
RefreshState
,因此我认为没有人能帮上忙。@BurakGüneş,是的,根据你现在编辑的Maarten的答案,我想这显然是正确的。康威的人生游戏必须使用上次的一份棋盘副本和新的棋盘副本来完成。这很像一个卷积运算。你只能通过一种奇怪的方式向上和向右移动来完成你正在做的事情。但很明显,你正在用扫描线信息破坏数据。