我正在用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循环移动到某个地方。我只是不知道确切地需要在哪里放置它来纠正此错误。任何帮助将不胜感激,谢谢。

最佳答案

与其在某个地方杀死/恢复该单元,不如将要改变状态的单元的坐标存储为新列表中的元组。有很多方法可以做到这一点,但仅举一个例子。

// 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
}

关于java - 您如何杀死活细胞并恢复活细胞而不弄乱柜台?康威生命游戏中的逻辑错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53094715/

10-09 00:25