生命游戲的宇宙是一個無限的,其中細胞的二維正交網(wǎng)格,每個細胞處于兩種可能的狀態(tài)之一,即活著或死亡(分別是人口稠密和無人居住)。每個細胞與它的八個鄰居相互作用,這八個鄰居是水平,垂直或?qū)窍噜彽募毎?。在每一步中,都會發(fā)生以下轉(zhuǎn)換:
- 任何有兩個以上活著的鄰居的活細胞都會死亡,好像是在人口下一樣。
- 任何有兩三個活著的鄰居的活細胞都會生活在下一代。
- 任何有三個以上活著的鄰居的活細胞都會死亡,就好像人口過剩一樣。
- 任何具有三個活的鄰居的死細胞都會變成一個活細胞,就像是通過繁殖一樣。
其效果如下圖:

123.gif
其主要實現(xiàn)邏輯代碼出自Effective Python一書中。不過原代碼中的生命游戲是靜止的,把每一代分別打印出來,沒有動畫效果,我增加部分代碼,實現(xiàn)在終端的動畫效果。
#原代碼是通過ColumnPrinter 類實現(xiàn)打印的,我去掉這個類,增加下面兩個函數(shù)
#這是隨機在二維控件內(nèi)生成初始存活細胞
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
#主函數(shù),運行這個生命游戲,其動畫效果是通過控制光標(biāo)移動到初始位置來實現(xiàn)的。
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)
控制光標(biāo)位置是通過ANSI轉(zhuǎn)義符實現(xiàn)的,如"x1b[nA"實現(xiàn)光標(biāo)上移n行。不過這在win10下不用,linux下可以。關(guān)于生命游戲更多詳細內(nèi)容請查看Conway's Game of Life
寫的倉促,后續(xù)更新。