Conway's Game of Life

这个游戏我实现过Java版、C#版、Processing版,这次实现的Rust版。以前的思路是逐格统计邻居数,现在采用的8方向视图统计邻居数。其外从朋友处得知,还可以采用卷积统计邻居数。

首先介绍下这个游戏吧

  1. 这个游戏是无需玩家参与的自动演进游戏。
  2. 游戏在一个正交网格的无限棋盘上进行。
  3. 每个网格内有一个细胞,处于Dead或者Alive状态。细胞的横、竖、斜共8个相邻网格为其邻居。
  4. 当存活细胞的存活邻居数小于2时,存活细胞死亡。称为人口稀少。
  5. 当生存细胞的生存邻居数等于2或者3时,生存细胞继续存活。
  6. 当生存细胞的生存邻居数大于3时,生存细胞死亡。称为人口过剩。
  7. 当死亡细胞的生存邻居数等于3时,死亡细胞复活。

这个游戏的有限棋盘版本,我在本科的时候帮人写作业,实现过Java版、C#版、Processing版,这次实现的是Rust版。

这个游戏的实现有三个思路:

  1. 逐个网格统计周围的邻居数,生成下一周期的棋盘。
  2. 外围包一圈死亡细胞,把8个方向的1偏移视图加起来得到邻居数视图,联合当前状态生成下一周期棋盘。
  3. 以[[1,1,1],[1,0,1],[1,1,1]]为KERNEL进行卷积得到邻居数视图,联合当前状态生成下一周期棋盘。

我采用的是第2个思路,Source Code。代码始终按照功能和流程两种概念划分:功能代码中有复杂的结构以及临时变量等;流程代码每一个函数调用就是一个流程步骤。main.rs作为调用入口的,包含了调用流程,亦即加载->迭代->展示这个流程。lib.rs为棋盘辅助函数的集中导出点。