如何计算 Conway 的 3D 生命游戏的下一次迭代?

How do I calculate the next iteration for Conway's Game of Life in 3D?

我正在编写一个脚本,它生成一个包含 3D 立方体位置的字典 space,计算每个立方体的邻居,然后根据 Conway's Game of Life 中的规则计算新的迭代。我的网格是偶数元组的字典,如下所示:

grid = {(0, 0, 0): True, (0, 0, 2): True, (2, 0, 0): True, (2, 0, 2): True, (0, 2, 0): True, (0, 2, 2): True, (2, 2, 0): True, (2, 2, 2): True}

TrueFalse表示单元格是alive还是dead.

为了计算每个立方体的摩尔邻居,我编写了以下函数:

# Calculates the neighbors of a cell
def get_neighbors(grid, x,y,z):
    count = 0
    for pos in (
        # List out all possible neighbours of cell
        (x-2,y-2,z-2),
        (x-2,y-2,z),
        (x-2,y-2,z+2),
        (x-2,y,z-2),
        (x-2,y,z),
        (x-2,y,z+2),
        (x-2,y+2,z-2),
        (x-2,y+2,z),
        (x-2,y+2,z+2),
        (x,y-2,z-2),
        (x,y-2,z),
        (x,y-2,z+2),
        (x,y,z-2),
        (x,y,z+2),
        (x,y+2,z-2),
        (x,y+2,z),
        (x,y+2,z+2),
        (x+2,y-2,z-2),
        (x+2,y-2,z),
        (x+2,y-2,z+2),
        (x+2,y,z-2),
        (x+2,y,z),
        (x+2,y,z+2),
        (x+2,y+2,z-2),
        (x+2,y+2,z),
        (x+2,y+2,z+2)):
        if pos in grid:
            # If the neighbour is alive, add 1 to the count
            if grid[pos] == True:
                count += 1
    return count

# Checks if a cell is alive
def is_alive(grid, x,y,z):
    if (x,y,z) in grid:
        if grid[(x,y,z)] == True:
            return True
    return False

这会正确输出邻居的数量以及 returns 给定的元组是否具有 TrueFalse。为了计算下一次迭代并包含生命游戏的规则,我写道:

# Calculates the next iteration of the game
def next_iteration(grid):
    new_grid = {}
    length = len(grid)
    # Iterate through the grid with range step size of 2, 
    # since we only have even numbers in the tuples.
    for x in range(0,length, 2):
        for y in range(0,length, 2):
            for z in range(0,length, 2):
                # Get the number of neighbors of the cell
                neighbors = get_neighbors(grid, x,y,z)
                if is_alive(grid, x,y,z):
                    # If the cell is alive, check if it should die
                    if neighbors < 2:
                        new_grid[(x,y,z)] = False
                    elif neighbors > 3:
                        new_grid[(x,y,z)] = False
                    else:
                        new_grid[(x,y,z)] = True
                else:
                    # If the cell is dead, check if it should be alive
                    if neighbors == 3:
                        new_grid[(x,y,z)] = True
                    else:
                        new_grid[(x,y,z)] = False
    return new_grid

但是,如果我生成一个 2x2x2 网格并尝试计算迭代三次,我会得到 this(仅附加输出的一部分),其中 everythingFalse。好像不太对。

我的代码哪里做错了?是我没有正确计算邻居,还是没有正确检查规则?

如何正确实现这个 3D 生命游戏?

我的完整脚本是here

您的代码实际上有时会产生一些 True 值 - 取决于初始配置。但是几乎所有的值都是 False,因为在每次迭代中你都在扩展网格,包括许多远离任何活细胞的细胞,所以它们的值必须是 False。内容如下:

  • 您从 8 个单元格的网格开始,坐标由 0 或 2 给出。
  • 第一次迭代后,您获得一个网格,其中包含 4**3 = 64 个坐标为 0、2、4 和 6 的单元格。只有坐标为 0、2 和 4 的单元格才能存活。
  • 经过 2 次迭代后,网格由坐标由 0 到 63 之间的所有偶数给出的细胞组成。只有坐标为 0、2、4 和 6 的细胞才可能存活。由 32**3 = 32768 个单元格组成的网格中有 64 个这样的单元格。
  • 3 次迭代后,网格将有 16384**3 = 4398046511104 个单元格,代码将因内存不足而崩溃。