生命游戲

生命游戲的宇宙是一個無限的,其中細胞的二維正交網(wǎng)格,每個細胞處于兩種可能的狀態(tài)之一,即活著死亡(分別是人口稠密無人居住)。每個細胞與它的八個鄰居相互作用,這八個鄰居是水平,垂直或?qū)窍噜彽募毎?。在每一步中,都會發(fā)生以下轉(zhuǎn)換:

  1. 任何有兩個以上活著的鄰居的活細胞都會死亡,好像是在人口下一樣。
  2. 任何有兩三個活著的鄰居的活細胞都會生活在下一代。
  3. 任何有三個以上活著的鄰居的活細胞都會死亡,就好像人口過剩一樣。
  4. 任何具有三個活的鄰居的死細胞都會變成一個活細胞,就像是通過繁殖一樣。

其效果如下圖:

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ù)更新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容