近来整理之前的笔记,无意中看到了早期写的game of life程序,发现其代码大都已经老旧。 如Python版本之前还是基于2.7实现的,现在已普遍切换到3.7了,ReactJS版本依赖的包过老,有的还有安全问题。 于是干脆重新清理了一下。在这个过程中,再次玩了下经典的自动细胞机 - 康威生命游戏,添加了一个golang实现的终端版本。

细胞自动机

细胞自动机的各类实验出于一种对寻找大自然终极简单规律的理想。就像很多优美的数学公式那样简单。最早的细胞自动机有冯.诺依曼在20世纪50年代左右提出,用来模拟生物细胞的自我复制。20世纪70年代,英国数学家康威发明了生命游戏,从此细胞自动机开始被很多人所认识。

细胞自动机的特点是,在一个N维的世界,每个格子代表一个生命,它有有限种状态,每个格子时间t的状态由时间t-1的状态唯一决定,所有的格子按照统一的规则演进。

生命游戏

康威定义的规则非常简单,在一个二维的世界里,每个细胞只有生和死两种状态,它下一轮的状态取决于这一轮周围的8个邻居的状态,简单规则如下:

  • 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
  • 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。
  • 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
  • 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)

参考代码

game of life

Web运行示例

下面是一个执行示例,你也可以访问Online Demo

Web示例说明

上面这个例子借助D3JS来实现画图和刷新的功能,index.d3.html文件中通过调用gol.d3.js文件中定义的GameOfLife类来初始化棋盘上所有格子的状态,并通过nextRound方法得到它下一个迭代的状态。 然后通过一个定时任务,调用getLives方法,将每次迭代后的数据传递给d3,通过d3来更新svg。

终端运行示例

以下为一个golang版本在终端运行的示例: