当前位置: 首页 > 知识库问答 >
问题:

如何在不弄乱计数器的情况下杀死活细胞并使活细胞复活?康威生命游戏中的逻辑错误

钱和安
2023-03-14

我正在用Java编写Conway的生活游戏,在代码中遇到了一个逻辑错误。如果您不熟悉游戏,以下是基本规则:

生命的游戏是一个简单的模拟,发生在一个网格的细胞。每个细胞可以是活的,也可以是死的,并且它与相邻的细胞相互作用(水平、垂直或对角)。在每次迭代中,都会做出决定,看看活细胞是否存活,或者死细胞是否存活。算法如下:

如果一个细胞是活的:如果它有少于两个活着的邻居,它会因为孤独而死亡。如果它有两个或三个活着的邻居,它会活到下一代如果它有三个以上活着的邻居,它会因为人口过剩而死亡。

如果一个细胞是死的:如果它正好有三个活着的邻居,它会因为繁殖而变得活着。

到目前为止,我掌握的死细胞和活细胞计数代码如下:

// Go through each dead cell and check all neighboring cells to see if it 
// will be revived
// reviveDeadCells()

neighborCount = 0;
for (y = 0; y , 15; y++ ) {
    for (x = 0; x < 15; x++) {
        if (board[x][y] = 0 ) {
            for ( i = x - 1; i = x + 1; i ++ ) {
                for (j = y - 1; j = y + 1; j ++) {
                    if (board[i][j] = 1 ) {
                        neighborCount = neighborCount + 1;
                    }
                }
                if (neighborCount = 4) {
                    board[i][j] = 1;
                }
            }
        }
    }
}





// Go through each live cell and see if it should be executed
// killLiveCell()

for (y = 0; y , 15; y++ ) {
    for (x = 0; x < 15; x++) {
        if (board[x][y] = 1 ) {
            for ( i = x - 1; i = x + 1; i ++ ) {
                for (j = y - 1; j = y + 1; j ++) {
                    if (board[i][j] = 1 ) {
                    neighborCount = neighborCount + 1;
                }
            }
        if (neighborCount < 3) || (nieghborCount > 4) {
            board[x][y] = 0;
        }
    }
} 

我现在意识到这段代码的问题在于存在逻辑错误。首先,我要计算死亡细胞的所有相邻细胞,然后计算有多少是活的。然后,如果正好有3个活着的邻居,我会让他们复活。唯一的问题是它现在会影响活细胞相邻细胞的计数器。如何在不影响另一个的计数器的情况下,同时改变死去和活着邻居的活细胞?我有一种感觉,我有所有的代码,但我可能不得不把它移动到for循环的某个地方。我只是不知道我需要把它放在哪里来纠正这个错误。任何帮助都将不胜感激,谢谢。

共有1个答案

锺离昂然
2023-03-14

而不是杀死/复活的单元格,然后,存储坐标的单元格将改变状态元组中的一个新列表。有很多方法可以做到这一点,但作为一个例子;

// Create a simple tuple class for the co-ordinates
Class CoordPair(){
    int x;
    int y;

    CoordPair(int x, int y){
        this.x = x;
        this.y = y;
    } 
}

// In your code, use Hash Set to prevent having two copies of the Coordinates
HashSet<CoordPair> changeSet = new HashSet<CoordPair>();
...
            if (neighborCount = 4) {
                CoordPair changePair = new CoordPair(i,j);
                changeSet.add(changePair);
            }
...
// After identifying all the changing pairs on the board
for(CoordPair pair : changeSet){
    board[pair.x][pair.y] ^= 1; //XOR to flip the value
}
 类似资料:
  • 我试图为康威的生活游戏写一个计数邻居方法。如果一个死细胞与2或3个活细胞相邻,它应该会活过来。然而,我的代码没有正确计算所有的邻居。如果我给输入坐标(10, 10), (10, 11), (10, 12)这将产生 该程序将下一代打印为 坐标在(10,11)和(11,11)。但是,在(9,11)也应该有一个点。我知道问题发生在这个函数中,对于点(9,11),函数不包括3个邻居。

  • 我正在制作康威的生活游戏,就像几乎所有其他初学者一样。我的主要问题是我不知道如何执行游戏规则,这些规则是:一个有三个活邻居的死细胞变成活细胞,一个有一个活邻居的活细胞变成死细胞,一个有三个以上活邻居的活细胞变得死了。我以前从未操纵过矩阵,所以我不知道从哪里开始。我所在的类还不允许我们使用非静态方法,而且我们也不能使用java库。这是我目前所拥有的: 我现在收到的输出是我最初一代游戏所需要的。我想我

  • 我已经在谷歌表单中创建了一个自定义表单。当用户按键盘上的[Enter]或[Tab]时,表单上数据字段的顺序与我想跳转到(下一个单元格)的顺序不同。是否有一个方法可以在工作表上使用(不使用谷歌应用程序脚本),我可以指定移动到下一个单元格。

  • 我的问题很难描述,所以我会尽可能简洁地解释。 在康威的《生活游戏》中,假设我有一张这样的地图: 与其在每个单元格上循环,包括不可能相关的死单元格,不如让我将第0代中的每个活单元格放在

  • 我有一个有三个活动的应用程序。第一活动,第二活动,第三活动。 在第一个活动中有一个按钮,它启动第二个活动。在第二个活动中,有两种方法可以转到第三个活动。但是有一个方法有代码: 两个变体都使用此代码片段。 此代码在-12秒内自动运行 我的问题是:当用户按下Back键时,ThirdActivity会打开,但几秒钟后,ThirdActivity会从第一个变体再次打开。 那么,如何完全终止一个活动,使其在

  • 我的项目涉及一个带有自定义表格模型的JTable。因为我希望用户能够修改表中的每个单元格,所以我选择让我的自定义TableModel(CSVModel)扩展DefaultTableModel。然而,由于某些原因,当我试图编辑表中的单元格时,CSVModel会抛出一个异常。我得到的唯一提示来自堆栈跟踪的最后一行: java线程“AWT-EventQueue-0”中出现异常。lang.ArrayInd