生命游戏
8 2026-02-05 13:48 2026-02-05 13:48
用python代码实现一个生命游戏
我来用Python实现一个完整的康威生命游戏(Conway's Game of Life),并生成可视化演示。
这是一个经典的细胞自动机,规则如下:
-
存活:邻居为2或3个活细胞时,该细胞存活
-
死亡:邻居少于2个(孤独)或多于3个(拥挤)时死亡
-
新生:死细胞恰好有3个邻居时复活
让我创建一个交互式的可视化版本:
运行 Python 代码
现在让我创建动画可视化:
运行 Python 代码
现在让我创建一个展示经典图案的互动演示和代码:
运行 Python 代码
现在让我创建一个可运行的完整Python脚本代码,展示生命游戏的完整实现:
Python
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
class GameOfLife:
"""康威生命游戏 (Conway's Game of Life)"""
def __init__(self, size=50, random_init=True):
"""
初始化生命游戏
参数:
size: 网格大小
random_init: 是否随机初始化
"""
self.size = size
self.grid = np.zeros((size, size), dtype=int)
self.generation = 0
if random_init:
# 30%概率生成活细胞
self.grid = np.random.choice([0, 1], size=(size, size), p=[0.7, 0.3])
def count_neighbors(self, i, j):
"""计算指定位置的邻居数量(8个方向)"""
total = 0
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
if di == 0 and dj == 0:
continue
# 使用模运算实现环形边界
ni, nj = (i + di) % self.size, (j + dj) % self.size
total += self.grid[ni, nj]
return total
def step(self):
"""演进一代"""
new_grid = np.zeros_like(self.grid)
for i in range(self.size):
for j in range(self.size):
neighbors = self.count_neighbors(i, j)
if self.grid[i, j] == 1:
# 规则1 & 2: 活细胞
new_grid[i, j] = 1 if neighbors in [2, 3] else 0
else:
# 规则3: 死细胞复活
new_grid[i, j] = 1 if neighbors == 3 else 0
self.grid = new_grid
self.generation += 1
def add_pattern(self, pattern, x, y):
"""在指定位置添加图案"""
h, w = pattern.shape
self.grid[x:x+h, y:y+w] = pattern
def get_population(self):
"""获取当前活细胞数量"""
return np.sum(self.grid)
# ============ 使用示例 ============
# 1. 创建游戏实例
game = GameOfLife(size=100, random_init=True)
# 2. 添加经典图案
# 滑翔机 (Glider)
glider = np.array([
[0, 1, 0],
[0, 0, 1],
[1, 1, 1]
])
game.add_pattern(glider, 10, 10)
# 3. 创建可视化
fig, ax = plt.subplots(figsize=(10, 10))
img = ax.imshow(game.grid, cmap='Blues', interpolation='nearest')
ax.set_title('Conway\'s Game of Life')
plt.axis('off')
# 4. 动画更新函数
def update(frame):
game.step()
img.set_array(game.grid)
ax.set_title(f'Generation: {game.generation}, Population: {game.get_population()}')
return [img]
# 5. 运行动画
anim = FuncAnimation(fig, update, frames=200, interval=100, blit=True)
plt.show()
# ============ 命令行版本(无GUI) ============
def run_console_version():
"""命令行版本的生命游戏"""
import os
import time
game = GameOfLife(size=20, random_init=True)
for generation in range(100):
# 清屏
os.system('cls' if os.name == 'nt' else 'clear')
# 打印当前状态
print(f"Generation: {generation}")
print(f"Population: {game.get_population()}")
print("-" * 40)
for row in game.grid:
print(''.join(['■ ' if cell else '□ ' for cell in row]))
game.step()
time.sleep(0.5)
# 取消注释以运行命令行版本
# run_console_version()
生命游戏规则说明:
表格
复制
| 当前状态 | 邻居数量 | 下一代状态 | 说明 |
|---|---|---|---|
| 活细胞 | < 2 | 死亡 | 人口稀少 |
| 活细胞 | 2-3 | 存活 | 理想环境 |
| 活细胞 | > 3 | 死亡 | 人口过剩 |
| 死细胞 | = 3 | 复活 | 繁殖 |
核心算法:
-
遍历每个细胞,统计8个邻居的活细胞数
-
根据规则更新状态
-
使用模运算实现环形边界(超出边缘从另一侧进入)
图案类型:
-
静物 (Still Life):如Block、Beehive,形状不变
-
振荡器 (Oscillator):如Blinker、Toad,周期性变化
-
滑翔机 (Spaceship):如Glider,边移动边保持形状
-
枪械 (Gun):如Gosper Glider Gun,持续产生滑翔机
这个实现包含了完整的生命游戏逻辑,你可以通过修改
size 参数调整网格大小,或修改 random_init 概率来改变初始密度。
全部评论