MATLAB简单生命游戏仿真系统 (Game of Life Simulation)
本项目是一个基于MATLAB环境开发的康威生命游戏(Conway's Game of Life)全功能可视化仿真程序。程序采用高效的矩阵运算和卷积操作来实现元胞自动机的演化逻辑,支持多种初始图案配置、实时动态展示以及种群数量的统计分析。
项目简介
康威生命游戏是一种零玩家游戏,其演化过程完全由初始状态决定。本项目在一个二维网格上模拟细胞的生死演化,旨在通过直观的图形界面展示复杂系统的涌现现象。系统不仅展示了细胞的动态变化,还实时同步绘制种群数量趋势图,并具备数据保存功能。
主要功能特性
1. 核心算法高效实现
- 卷积演化逻辑:放弃了低效的双重循环遍历,利用MATLAB强大的矩阵运算能力,通过二维卷积(
conv2)配合特定的3x3邻域核,一次性计算全网格每个细胞周围的存活邻居数量。 - 向量化状态更新:严格遵循生命游戏的四条基本规则(死/生切换),通过逻辑索引(Logical Indexing)快速生成下一代网格状态,显著提升了包括100x100甚至更大规模网格的计算速度。
2. 多样的初始化配置
程序内部支持三种初始化模式,用户可通过修改顶部参数进行选择:
- 随机模式:根据设定的密度(默认0.4)随机生成存活细胞。
- 高斯帕滑翔机枪 (Gosper Glider Gun):加载经典的能够持续发射滑翔机的循环图案(需足够网格空间)。
- 脉冲星 (Pulsar):加载周期为3的经典振荡器图案,自动置于网格中心。
3. 双重视图可视化
系统通过创建包含两个子图的图形界面(GUI)来展示仿真过程:
- 网格视图:使用
imagesc 函数绘制细胞矩阵。采用自定义配色(白色背景表示死亡,绿色表示存活),并利用 CData 属性更新机制实现流畅的动画效果,而非低效的重绘。 - 统计视图:实时绘制随时间变化的“进化代数 vs 存活细胞数”曲线,帮助用户分析种群的稳定性与周期性。
4. 数据统计与输出
- 实时监控:在界面标题栏实时显示当前代数(Generation)和存活总数(Population)。
- 结果保存:仿真结束后,系统会自动将最终的网格状态矩阵和完整的种群历史数据保存为
game_of_life_result.mat 文件,便于后续复盘或分析。
算法与代码实现细节
本项目主要包含在一个主函数文件 main.m 中,其内部逻辑结构如下:
参数配置与初始化
- 无需交互式输入,直接在代码头部定义了网格尺寸(
gridRows/gridCols)、初始密度、最大迭代步数和动画刷新间隔。 - 使用
switch-case 结构处理不同的初始化模式,对于特定图案(如滑翔机枪),通过辅助函数 insertPattern 将预设矩阵嵌入到主网格中。
核心演化循环
- 邻居计算:定义卷积核
[1 1 1; 1 0 1; 1 1 1],对当前网格进行 same 卷积,精准计算每个细胞周围的活细胞数。 - 规则应用:
*
维持:当前状态为1 且 邻居数为2或3。
*
繁殖:当前状态为0 且 邻居数为3。
*
死亡:其他所有情况(模拟人口过少或过剩)。
- 状态更新:通过逻辑运算(OR)合并上述条件生成下一代网格。
动态绘图优化
- 在循环外初始化绘图对象(Image对象和Plot对象)。
- 在循环内仅更新对象的底层数据(
CData 以及 XData/YData),并调用 drawnow 刷新缓冲区。这种方法比在每一帧重复调用 imagesc 或 plot 效率高出数倍,确保了动画的流畅性。
交互与控制
- 程序主要通过设置最大迭代步数自动运行。
- 图形窗口绑定了键盘回调函数,虽然仿真主要自动进行,但预留了按键暂停/继续的逻辑接口。
使用方法
- 启动仿真:直接运行
main 函数即可启动系统。 - 调整参数:如需修改网格大小、初始图案类型或动画速度,请直接编辑代码文件头部的
User Configuration 区域(例如将 initMode 改为 2 可查看滑翔机枪图案)。 - 观察过程:
* 左侧窗口显示细胞的动态演化。
* 右侧窗口显示种群数量的实时变化曲线。
- 结束与结果:仿真将在达到最大步数或用户关闭窗口时停止,并会在命令行输出总耗时,同时在当前目录下生成结果数据文件。
系统要求
- MATLAB R2016a 或更高版本(主要依赖基础矩阵运算及绘图函数)。
- 不需要额外的工具箱支持。