生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即活着或死亡(分别是人口稠密和无人居住)。每个细胞与它的八个邻居相互作用,这八个邻居是水平,垂直或对角相邻的细胞。在每一步中,都会发生以下转换:
- 任何有两个以上活着的邻居的活细胞都会死亡,好像是在人口下一样。
- 任何有两三个活着的邻居的活细胞都会生活在下一代。
- 任何有三个以上活着的邻居的活细胞都会死亡,就好像人口过剩一样。
- 任何具有三个活的邻居的死细胞都会变成一个活细胞,就像是通过繁殖一样。
其效果如下图:
其主要实现逻辑代码出自Effective Python一书中。不过原代码中的生命游戏是静止的,把每一代分别打印出来,没有动画效果,我增加部分代码,实现在终端的动画效果。
#原代码是通过ColumnPrinter 类实现打印的,我去掉这个类,增加下面两个函数
#这是随机在二维控件内生成初始存活细胞
def random_alive(k, x=9, y=9):
xy = [(i,j) for i in range(x) for j in range(y)]
grid = Grid(x, y)
for i,j in random.sample(xy, k):
grid.assign(i, j, ALIVE)
return grid
#主函数,运行这个生命游戏,其动画效果是通过控制光标移动到初始位置来实现的。
def main(x,y,k):
os.system('clear')
grid = random_alive(k, x=x, y=y)
clear = '\x1b[{}A\x1b[{}D'.format(x,y)
print(grid, end='')
sim = simulate(grid.height, grid.width)
while 1:
time.sleep(.1)
grid = live_a_generation(grid, sim)
print(clear)
print(grid, end='')
time.sleep(.1)
print(clear)
if __name__ == '__main__':
main(150,200,3050)
控制光标位置是通过ANSI转义符实现的,如"x1b[nA"实现光标上移n行。不过这在win10下不用,linux下可以。关于生命游戏更多详细内容请查看Conway's Game of Life
写的仓促,后续更新。