Python 康威的生命游戏在滑翔机枪设计中表现不佳

Python Conway's Game of Life not behaving properly for glider gun design

我正在尝试在 Python 中复制康威的生命游戏。 可以在此处找到此模拟的规则及其正常工作的版本:https://bitstorm.org/gameoflife/

在我的版本中,当我在开始时随机分配细胞为活细胞时,它似乎表现正常,classic 无定形细胞团在屏幕上扩展。

然而,当我复制 "glider gun" 排列(也可以在链接的网站上看到)时,细胞没有正确更新:结构轻微衰减,然后细胞的运动保持停滞。

这让我相信我的代码中存在逻辑错误 - 任何帮助将不胜感激!

这是我的 Cell class 中更新的代码部分 它的生存基于它的neighbors(它周围的八个细胞):

def update(self, neighbors):
    numAliveNeighbors = 0
    for neighbor in neighbors:
        if neighbor.isAlive:
            numAliveNeighbors+=1

    if numAliveNeighbors <= 1 or numAliveNeighbors >=4:
        self.isAlive = False
    elif not self.isAlive and numAliveNeighbors is 3:
        self.isAlive = True

这是我的代码部分,它找到每个 cell 的所有 neighbors 并对它们调用 update 方法:

for row in range(len(cells)):
    for column in range(len(cells[row])):
            neighbors = []
            for tempRow in range (row-1, row + 2):
                for tempColumn in range (column-1, column + 2):
                    if tempRow >= 0 and tempRow < len(cells):
                        if tempColumn >= 0 and tempColumn < len(cells[tempRow]):
                            if not(tempRow is row and tempColumn is column):
                                neighbors.append(cells[tempRow][tempColumn])
            cells[row][column].update(neighbors)

就地更新

您正在进行就地更新;也就是说,您单独更新每个单元格。您需要做的是创建一个克隆网格,每次在迭代中更新单元格时,更新克隆网格,然后将游戏板设置为克隆网格。否则,单元格将根据当前迭代进行更新,这没有意义。

你可以这样做:

def isAlive(alive, neighbours):
    return (alive and 2 <= neighbours <= 3) or (not alive and neighbours == 3)

def update(cells):
    grid = [[0] * len(row) for row in cells]
    for row in range(len(cells)):
        for col in range(len(cells[row])):
            neighbours = 0
            for tr in range(row - 1, row + 2):
                for tc in range(col - 1, col + 2):
                    if (tr != row or tr != col) and cells[tr][tc]:
                        neighbours += 1
            grid[row][col] = isAlive(cells[row][col], neighbours)
return grid

然后你可以循环调用cells = update(cells)