生命游戏

21 2026-02-05 13:48 2026-02-05 13:48

用python代码实现一个生命游戏

我来用Python实现一个完整的康威生命游戏(Conway's Game of Life),并生成可视化演示。
这是一个经典的细胞自动机,规则如下:
  • 存活:邻居为2或3个活细胞时,该细胞存活
  • 死亡:邻居少于2个(孤独)或多于3个(拥挤)时死亡
  • 新生:死细胞恰好有3个邻居时复活
让我创建一个交互式的可视化版本:
 
运行 Python 代码
 
 
现在让我创建动画可视化:
 
运行 Python 代码
 
tool result image 1
 
现在让我创建一个展示经典图案的互动演示和代码:
 
运行 Python 代码
 
tool result image 1
 
现在让我创建一个可运行的完整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个邻居的活细胞数
  • 根据规则更新状态
  • 使用模运算实现环形边界(超出边缘从另一侧进入)
图案类型
  1. 静物 (Still Life):如Block、Beehive,形状不变
  2. 振荡器 (Oscillator):如Blinker、Toad,周期性变化
  3. 滑翔机 (Spaceship):如Glider,边移动边保持形状
  4. 枪械 (Gun):如Gosper Glider Gun,持续产生滑翔机
这个实现包含了完整的生命游戏逻辑,你可以通过修改 size 参数调整网格大小,或修改 random_init 概率来改变初始密度。

 

 

 

 

 

 

 

 

 

 

 

 

全部评论

·