继 Biods 算法后,我们继续来看看还有哪些有趣的简单的算法,今天介绍的是康威生命游戏
历史渊源
生命游戏的灵感来源于冯·诺依曼在1940年代提出的“自我复制机器”理论。冯·诺依曼试图设计一种能在网格中复制自身的抽象机器,但模型过于复杂。
康威希望简化这一概念,最终创造了规则更简单、却能产生丰富行为的生命游戏。
- 生命,细胞繁衍与死亡的过程
- 游戏,强调依赖初始状态演化的特性
核心规则
场所: 一个无限大的二维方格网格上进行
细胞的生/死,一个格子代表一个细胞,格子亮起代表生,暗下代表死
-
出生死细胞若拥有恰好3个活邻居 ,则下一轮变为活细胞。
-
生存活细胞若拥有2个或3个活邻居 ,则继续存活。
-
死亡
- 孤独活细胞若邻居数≤1,则死于孤立。
- 拥挤活细胞若邻居数≥4,则死于过度拥挤。
可能演化出的稳定或动态结构
- 静态稳定结构(Still Lifes)
形状在演化中保持不变,例如
- 方块2×2的活细胞块。
- 蜂巢六边形结构。
- 周期振荡结构(Oscillators)
周期性地循环变化,例如:
- 闪烁灯水平或竖直的3个细胞,在1代后变为竖直或水平。
- 脉冲星周期为3的复杂振荡器。
- 移动结构(Spaceships)
整体在网格中移动,例如:
- 滑翔机每4代沿对角线移动一格。
- 轻型飞船移动更快的经典结构。
- 无限生长结构
如“滑翔机枪”,能持续产生新的滑翔机,展示系统的无限扩展潜力。
核心代码展示
def step(grid) -> list[list[int]]:
# 计算下一代(标准康威生命游戏规则)
rows = len(grid)
cols = len(grid[0]) if rows else 0
next_grid = [[0 for _ in range(cols)] for _ in range(rows)]
for r in range(rows):
for c in range(cols):
live_neighbors = 0
# 统计 8 邻域存活数(不越界,且不算自己)
for dr in (-1, 0, 1):
rr = r + dr
if rr < 0 or rr >= rows:
continue
for dc in (-1, 0, 1):
if dr == 0 and dc == 0:
continue
cc = c + dc
if 0 <= cc < cols:
live_neighbors += grid[rr][cc]
# 规则 1:活细胞在 2 或 3 个邻居时继续存活,其余则死亡
if grid[r][c] == 1:
next_grid[r][c] = 1 if live_neighbors in (2, 3) else 0
# 规则 2:死细胞在恰好 3 个邻居时复活,否则保持死亡
else:
next_grid[r][c] = 1 if live_neighbors == 3 else 0
结果展示

康威生命游戏以极简的规则揭示了“简单规则产生复杂行为”的深层原理,连接了数学、计算机科学与哲学。它不仅是一个有趣的模拟实验,更是理解复杂系统、计算理论和人工生命的重要窗口。
