python开发元胞自动机之Game of Life
一、Game of Life 生命游戏
1. 简介
生命游戏是英国数学家John Conway在1970年发明的细胞自动机。它最初于1970年10月在《科学美国人》杂志中马丁·葛登(Martin Gardner,1914年11月21日-2010年5月22日。又译:马丁·加德纳)的“数学游戏”专栏出现。
生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。实际中,你可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过高,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过低,世界中又会被生命充满而没有什么变化。实际中,这个数目一般选取2或者3;这样整个生命世界才不至于太过荒凉或拥挤,而是一种动态的平衡。
2. 游戏规则
活细胞周围的细胞数如果小于2个或多于3个则会死亡;(离群或过度竞争导致死亡)
活细胞周围如果有2或3个细胞可以继续存活;(正常生存)
死细胞(空格)周围如果恰好有3个细胞则会诞生新的活细胞。(繁殖)
二、实现思路
利用Python面向对象编程,定义三个类:
Cell类,用于创建单个元胞对象,根据其邻居元胞的生命状态判断它的生死。
CellGrid类,定义整体的网格大小,遍历循环每个元胞计算其下一时刻的状态。
Game类,用到pygame模块,用于在屏幕上绘制网格以及元胞,并设定迭代的频率。
定义一个main函数作为程序入口,在执行函数时需要注意顺序,先执行计算邻居存活数的函数 circulate_nbcount(),再执行根据规则判断元胞生命状态的函数 circulate_rule。
三、代码部分
import random
class Cell :
"""
细胞类,单个细胞
"""
def __init__ ( self, ix, iy, is_live) :
self. ix = ix
self. iy = iy
self. is_live = is_live
self. neighbour_count = 0
def __str__ ( self) :
return "[{},{},{:5}]" . format ( self. ix, self. iy, str ( self. is_live) )
def calc_neighbour_count ( self) :
count = 0
pre_x = self. ix - 1 if self. ix > 0 else 0
for i in range ( pre_x, self. ix+ 1 + 1 ) :
pre_y = self. iy - 1 if self. iy > 0 else 0
for j in range ( pre_y, self. iy+ 1 + 1 ) :
if i ==