康威生命游戏Python实现
02 Jul 2017 |
Python
对康威的生命游戏很感兴趣,想试下用Python实现。很巧在实验楼上看到了这个项目。
康威生命游戏
康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
内容描述
生命游戏是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。
规则
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
- 人口过少:当周围低于2个(不包含2个)存活细胞时, 本单元活细胞死亡。
- 稳定:当周围有2个或3个存活细胞时, 本单元细胞保持原样。
- 人口过剩:当周围有3个以上的存活细胞时,本单元活细胞死亡。
- 繁殖:当周围有3个存活细胞时,本单元细胞存活/活化。
在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构。形状和秩序经常能从杂乱中产生出来。对于生成的形状和秩序我们称作 pattern。或者在这里,我们也把它称作 creature。
算法思路
我们使用矩阵来记录我们的游戏世界,其中单位值为 0 代表细胞死亡。单位值为 1 代表细胞存活。
def next_generation():
nbrs_count = sum(np.roll(np.roll(pygame.world, i, 0), j, 1)
for i in (-1, 0, 1) for j in (-1, 0, 1)
if (i != 0 or j != 0))
由于我们的游戏世界是上下左右循环的,所以将矩阵往8个方向进行循环移位得到8个新矩阵,将8个新矩阵相加就能够得到每个细胞周围的活细胞数量的矩阵了。
np.roll
操作就是循环移位操作。np.roll(X, i, 0)
中的 X 代表输入矩阵,i 代表移位的大小,0 代表移位的维度,np.roll(X, 1, 0)
代表矩阵下移一格,np.roll(X, 1, 1) 代表右移一格,if (i != 0 or j != 0))
是为了将原矩阵从计算中去除。
通过活细胞数量矩阵根据更新规则更新我们的世界。因为矩阵单位只有两种状态,这里我们只考虑存活态就可以了。注意到存活的条件:
- 稳定:当周围有2个或3个存活细胞时, 本单元细胞保持原样。
- 繁殖:当周围有3个存活细胞时,本单元细胞存活/活化。
即细胞周围数量等于3 或者 本单元细胞存活的同时周围有2个存活细胞的时候。本单元细胞将在下一代存活(也可看作繁衍)。即:
(nbrs_count == 3) | (X & (nbrs_count == 2))
游戏操作
- R键 :重置世界
- 回车键 :进行演化
- 空格键 :暂停演化
- 鼠标左键 :增添一个细胞
- 鼠标右键 :销毁一个细胞
代码实现
效果显示
参考资料
实验楼 -Python实现康威生命游戏
Conway’s Game of Life