以下谈到的项目在GitHub:shuaitq/Game-of-Life可以找到全部源码

生命游戏

康威生命游戏(英语:Conway’s Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。它最初于1970年10月在《科学美国人》杂志上马丁·葛登能的“数学游戏”专栏出现。 ——维基百科

维基百科链接Conway’s Game of Life

简而言之就是,在一个二维空间内每一个格子就是一个「细胞」,每个细胞存在着两种状态,生和死,并通过一定的规则进行演算的结果。

规则

最为经典的「B3S23」

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

就这样简单的规则和初始状态决定了生命游戏的发展。

各种各样的生命

生命游戏项目

这个项目是用来进行生命游戏的模拟,这已经是第二版了。第一版的时候采用的是Json格式文件存储生命游戏的初始状态和各种参数,所有的想要用的生命都要去网上找到图然后输入到Json文件中,很麻烦

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "height":1080,                  
    "width":1920,                   
    "time":100,                     迭代次数
    "path":"photo/",                图片存放位置
    "rand":true,                    是否随机
    "rules":[0,0,1,2,0,0,0,0,0],    规则
    "screen":[[0,0,0,0,0,0],        页面初始化参数
              [0,0,1,1,0,0],
              [0,1,0,0,1,0],
              [0,0,1,1,0,0],
              [0,0,0,0,0,0]]
}

而在这一次重构时发现了rle通用文件格式,已经有大量以rle格式存储的生命文件,于是选择了取消Json文件,改用rle文件,多余的参数采用getopt进行读取。关于rle文件的具体解析过程可以看上一篇博客

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#N Quasar
#O Robert Wainwright
#C A period 3 oscillator found in August 1971 that is quite similar to
#C the pulsar.
#C www.conwaylife.com/wiki/index.php?title=Quasar
x = 29, y = 29, rule = B3/S23
10b3o3b3o10b2$8bo4bobo4bo8b$8bo4bobo4bo8b$8bo4bobo4bo8b$10b3o3b3o10b2$
8b3o7b3o8b$2b3o2bo4bo3bo4bo2b3o2b$7bo4bo3bo4bo7b$o4bobo4bo3bo4bobo4bo$
o4bo17bo4bo$o4bo2b3o7b3o2bo4bo$2b3o19b3o2b2$2b3o19b3o2b$o4bo2b3o7b3o2b
o4bo$o4bo17bo4bo$o4bobo4bo3bo4bobo4bo$7bo4bo3bo4bo7b$2b3o2bo4bo3bo4bo
2b3o2b$8b3o7b3o8b2$10b3o3b3o10b$8bo4bobo4bo8b$8bo4bobo4bo8b$8bo4bobo4b
o8b2$10b3o3b3o!

当时第一版的时候重点使用了多线程和异步化存储来优化性能,第二版取消了这些优化,转而使用淳朴的单线程一方面是我发现计算性能并不是瓶颈,瓶颈主要在硬盘IO上,另一方面是我懒。所以这次的重点放在了rle文件的解析上面,毕竟只要支持了rle文件就再也不用手动编写生命游戏的生命模板了(逃

主要改变

  • 能够读取通用rle模式文件
  • 使用方法 ./Game.out -p [RLE文件目录] -t [模拟次数]
  • 支持标准规则表示法B3/S23
  • 使用PPM图片格式作为输出

感谢

感谢LifeWiki完整的各种资料,包括且不限于:

  1. 完整的RLE文件格式文档。
  2. 巨量的RLE模式文件总计2000+,和各个模式的资料。

参考