# game_of_life **Repository Path**: i66game/game_of_life ## Basic Information - **Project Name**: game_of_life - **Description**: 生命游戏 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-09 - **Last Updated**: 2025-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 生命游戏设计文档 ## 项目概述 "生命游戏"(Conway's Game of Life)是一个零玩家的细胞自动机游戏,由英国数学家约翰·康威在1970年发明。游戏在一个二维网格上进行,每个单元格代表一个细胞,可以处于"活"或"死"两种状态。细胞根据周围八个相邻细胞的状态,按照特定规则演化。 本项目使用Python的Pygame库实现生命游戏,提供图形界面和交互功能。 ## 游戏规则 1. 任何一个活细胞如果周围有2或3个活细胞,则在下一代保持活状态 2. 任何一个活细胞如果周围少于2个活细胞,则在下一代死亡(模拟"孤独死") 3. 任何一个活细胞如果周围超过3个活细胞,则在下一代死亡(模拟"拥挤死") 4. 任何一个死细胞如果周围正好有3个活细胞,则在下一代变为活细胞(模拟"繁殖") ## 项目结构 ``` game_of_life/ ├── main.py # 主程序入口 ├── game.py # 游戏逻辑核心 ├── ui.py # 用户界面组件 ├── config.py # 配置参数 ├── utils.py # 工具函数 ├── assets/ # 资源文件夹 │ ├── fonts/ # 字体文件 │ └── images/ # 图像资源 └── patterns/ # 预设图案 ├── glider.txt ├── blinker.txt └── ... ``` ## 界面设计 游戏界面分为三个主要区域: 1. **网格区域**:显示细胞网格,用户可以通过点击来改变细胞状态 2. **控制面板**:包含各种控制按钮和滑块 3. **数据显示区**:显示游戏统计数据和状态信息 ### 界面布局示意图 ``` +--------------------------------------------------+ | | | | | +------------------+ | | | | 控制面板 | | | | | | | | | | [开始] [暂停] | | | 网格区域 | | [清除] [随机] | | | | | [保存] [加载] | | | | | | | | | +------------------+ | | | | | | +------------------+ | | | | 数据显示区 | | | | | | | | | | 代数: 0 | | | | | 活细胞: 0 | | | | | 速度: 10 步/秒 | | | | | | | | | +------------------+ | | | | +--------------------------------------------------+ ``` ## 功能设计 ### 1. 网格区域功能 - **细胞交互**:用户可以点击网格中的细胞来切换其状态(活/死) - **拖动绘制**:用户可以按住鼠标并拖动来快速绘制多个细胞 - **缩放功能**:使用鼠标滚轮或缩放按钮调整网格大小 - **平移功能**:按住鼠标中键或特定键可拖动查看网格的不同部分 ### 2. 控制面板功能 - **开始/停止按钮**:启动或停止游戏演化 - **暂停/继续按钮**:暂停当前演化或从暂停状态继续 - **清除按钮**:清除网格,将所有细胞设为死亡状态 - **随机按钮**:随机生成初始细胞状态 - **速度控制**:调整游戏演化的速度(每秒更新次数) - **步进按钮**:手动推进一代演化 - **网格大小调整**:改变网格的尺寸(如 50x50, 100x100 等) - **预设图案**:加载预定义的经典图案(如滑翔机、振荡器等) - **保存/加载**:保存当前状态或加载之前保存的状态 ### 3. 数据显示区功能 - **代数计数器**:显示当前演化的代数 - **活细胞计数**:显示当前活细胞的数量 - **速度显示**:显示当前的演化速度 - **状态信息**:显示游戏的当前状态(运行中、暂停、停止) - **坐标显示**:显示鼠标悬停位置的网格坐标 ## 详细技术设计 ### 1. 模块设计 #### config.py 配置模块,包含所有可配置参数: ```python class Config: # 窗口设置 WINDOW_WIDTH = 1200 WINDOW_HEIGHT = 800 GRID_SIZE = 80 # 网格大小(单位:像素) CELL_SIZE = 10 # 细胞大小(单位:像素) # 颜色设置 BACKGROUND_COLOR = (50, 50, 50) GRID_COLOR = (100, 100, 100) CELL_COLOR = (255, 255, 255) BUTTON_COLOR = (80, 80, 80) BUTTON_HOVER_COLOR = (100, 100, 100) TEXT_COLOR = (255, 255, 255) # 游戏设置 DEFAULT_SPEED = 10 # 默认每秒更新次数 MIN_SPEED = 1 MAX_SPEED = 60 # UI设置 BUTTON_WIDTH = 120 BUTTON_HEIGHT = 40 BUTTON_MARGIN = 10 PANEL_WIDTH = 200 # 右侧面板宽度 ``` #### game.py 游戏核心逻辑: ```python class Cell: def __init__(self, x: int, y: int, alive: bool = False): self.x = x self.y = y self.alive = alive self.next_state = alive class GameLogic: def __init__(self, width: int, height: int): self.width = width self.height = height self.grid = [[Cell(x, y) for x in range(width)] for y in range(height)] self.generation = 0 self.running = False self.paused = False def methods: - update() # 更新一代 - toggle_cell(x, y) # 切换细胞状态 - clear() # 清空网格 - randomize() # 随机填充 - get_alive_count() # 获取活细胞数量 - save_state(filename) # 保存状态 - load_state(filename) # 加载状态 ``` #### ui.py 用户界面组件: ```python class Button: def __init__(self, x, y, width, height, text, callback): self.rect = pygame.Rect(x, y, width, height) self.text = text self.callback = callback self.hovered = False def methods: - draw(surface) # 绘制按钮 - handle_event(event) # 处理事件 - update() # 更新状态 class GridView: def __init__(self, game_logic, rect): self.game_logic = game_logic self.rect = rect self.offset_x = 0 self.offset_y = 0 self.scale = 1.0 def methods: - draw(surface) # 绘制网格 - handle_event(event) # 处理事件 - screen_to_grid(x, y) # 屏幕坐标转网格坐标 - grid_to_screen(x, y) # 网格坐标转屏幕坐标 class ControlPanel: def __init__(self, game_logic, rect): self.game_logic = game_logic self.rect = rect self.buttons = [] self.speed_slider = None def methods: - draw(surface) # 绘制控制面板 - handle_event(event) # 处理事件 - update() # 更新状态 class DataDisplay: def __init__(self, game_logic, rect): self.game_logic = game_logic self.rect = rect def methods: - draw(surface) # 绘制数据显示 - update() # 更新显示数据 ``` #### main.py 主程序入口: ```python class GameOfLife: def __init__(self): self.config = Config() self.game_logic = GameLogic(80, 60) self.screen = pygame.display.set_mode((self.config.WINDOW_WIDTH, self.config.WINDOW_HEIGHT)) self.grid_view = GridView(...) self.control_panel = ControlPanel(...) self.data_display = DataDisplay(...) def methods: - run() # 主游戏循环 - handle_events() # 处理所有事件 - update() # 更新游戏状态 - draw() # 绘制所有内容 ``` ### 2. 类之间的交互 1. **事件流**: ``` pygame事件 -> GameOfLife.handle_events() -> 分发到GridView/ControlPanel/DataDisplay -> 可能触发GameLogic的相应方法 ``` 2. **更新流**: ``` GameOfLife.update() -> GameLogic.update()(如果游戏运行中) -> 更新UI组件状态 ``` 3. **渲染流**: ``` GameOfLife.draw() -> 按顺序调用各组件的draw()方法 -> pygame.display.flip() ``` ### 3. 数据结构 1. **网格数据**: - 使用二维列表存储Cell对象 - 每个Cell对象包含位置和状态信息 2. **状态保存格式**: ```json { "generation": 0, "width": 80, "height": 60, "cells": [[0,0,1,0...], [0,1,0,0...], ...] } ``` ### 4. 性能优化策略 1. **网格更新优化**: - 维护活细胞位置的集合 - 只检查活细胞周围的细胞 - 使用双缓冲避免更新冲突 2. **渲染优化**: - 只重绘发生变化的区域 - 使用surface缓存静态UI元素 - 网格缩放时使用pygame.transform.scale 3. **事件处理优化**: - 使用事件过滤器减少不必要的事件处理 - 实现简单的事件队列管理 - 自定义规则:允许用户修改生命游戏规则 - 多种视觉主题:提供不同的颜色方案 - 历史记录:回放之前的演化过程 - 无限网格:实现理论上无限大的网格 - 统计图表:显示活细胞数量随时间的变化图表 ## 用户交互流程 1. 用户启动程序,看到空白网格和控制面板 2. 用户可以通过点击绘制初始细胞状态,或使用随机/预设按钮 3. 用户点击"开始"按钮,游戏开始演化 4. 在演化过程中,用户可以: - 点击"暂停"暂时停止演化 - 调整速度滑块改变演化速度 - 点击"停止"完全停止演化并允许编辑 5. 用户可以随时保存当前状态或加载之前的状态 ## 开发路线图 1. **阶段一**:核心功能实现 - 基本网格和细胞逻辑 - 简单的开始/停止控制 - 基本的用户交互 2. **阶段二**:完整UI和基础功能 - 完整的控制面板 - 数据显示区 - 保存/加载功能 3. **阶段三**:高级功能和优化 - 预设图案库 - 性能优化 - 扩展功能 ## 技术栈 - **Python 3.x**:主要编程语言 - **Pygame**:图形和用户界面库 - **NumPy**(可选):用于高效的数组操作 - **Pickle/JSON**:用于保存和加载游戏状态