如何计算 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}
True
或False
表示单元格是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 给定的元组是否具有 True
或 False
。为了计算下一次迭代并包含生命游戏的规则,我写道:
# 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(仅附加输出的一部分),其中 everything 是 False
。好像不太对。
我的代码哪里做错了?是我没有正确计算邻居,还是没有正确检查规则?
如何正确实现这个 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 个单元格,代码将因内存不足而崩溃。
我正在编写一个脚本,它生成一个包含 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}
True
或False
表示单元格是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 给定的元组是否具有 True
或 False
。为了计算下一次迭代并包含生命游戏的规则,我写道:
# 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(仅附加输出的一部分),其中 everything 是 False
。好像不太对。
我的代码哪里做错了?是我没有正确计算邻居,还是没有正确检查规则?
如何正确实现这个 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 个单元格,代码将因内存不足而崩溃。