使用 Python 練習(xí)一個經(jīng)典的小游戲,附60行完整代碼下載

三步加星標(biāo)
??你好,我是 zhenguo
? ?今晚使用 Python 練習(xí)一個經(jīng)典的游戲:the game of life
英國數(shù)學(xué)家約翰·何頓·康威在1970年發(fā)明了 the game of life,在生命游戲中,對于任意細(xì)胞,規(guī)則如下:
每個細(xì)胞有兩種狀態(tài) - 存活或死亡
每個細(xì)胞與以自身為中心的周圍八格細(xì)胞產(chǎn)生互動
當(dāng)前細(xì)胞為存活狀態(tài)時,當(dāng)周圍的存活細(xì)胞低于2個時(不包含2個),該細(xì)胞變成死亡狀態(tài)。(模擬生命數(shù)量稀少)
當(dāng)前細(xì)胞為存活狀態(tài)時,當(dāng)周圍有2個或3個存活細(xì)胞時,該細(xì)胞保持原樣。
當(dāng)前細(xì)胞為存活狀態(tài)時,當(dāng)周圍有超過3個存活細(xì)胞時,該細(xì)胞變成死亡狀態(tài)。(模擬生命數(shù)量過多)
當(dāng)前細(xì)胞為死亡狀態(tài)時,當(dāng)周圍有3個存活細(xì)胞時,該細(xì)胞變成存活狀態(tài)。(模擬繁殖)
拿個例子闡述上述狀態(tài),如下種子時代:
[0,?0,?1,?0,?0]
[0,?1,?1,?0,?0]
[0,?0,?1,?1,?0]
[0,?1,?1,?1,?0]
[0,?0,?0,?0,?0]
坐標(biāo)[0,2]為一個存活的細(xì)胞,因?yàn)橹車?xì)胞個數(shù)為2,所以繁衍后依然存活;
坐標(biāo)[1,2]的存活細(xì)胞,因?yàn)橹車?個存活細(xì)胞,所以繁衍后死亡;
坐標(biāo)[0,1]死亡細(xì)胞,因?yàn)橹車『糜?個存活細(xì)胞,所以[0,1]處出現(xiàn)生命,
繁衍一代后的,完整圖如下:
[0,?1,?1,?0,?0]
[0,?1,?0,?0,?0]
[0,?0,?0,?0,?0]
[0,?1,?0,?1,?0]
[0,?0,?1,?0,?0]
第二代:
[0,?1,?1,?0,?0]
[0,?1,?1,?0,?0]
[0,?0,?1,?0,?0]
[0,?0,?1,?0,?0]
[0,?0,?1,?0,?0]
...
能到第幾代結(jié)束呢?借用 Python 模擬了生命游戲,整個代碼一共 60 行。
首先生成生命網(wǎng)格:
def?get_board(size,?alive_cons):
????return?[[1?if?(i,?j)?in?alive_cons?else?0
?????????????for?j?in?range(size)]
????????????for?i?in?range(size)]
獲得細(xì)胞的鄰域:
def?get_neighbors(con):
????x,?y?=?con
????neighbors?=?[(x?+?i,?y?+?j)
?????????????????for?i?in?range(-1,?2)
?????????????????for?j?in?range(-1,?2)
?????????????????if?not?i?==?j?==?0]
????return?neighbors
判斷下一代是否存活:
def?is_alive_con(con,?alive_cons):
????alive_neighbors?=?calculate_alive_neighbors(con,?alive_cons)
????if?(alive_neighbors?==?3?or
????????????(alive_neighbors?==?2?and?con?in?alive_cons)):
????????return?True
????return?False
生成下一代完整的生命網(wǎng)格:
def?new_step(alive_cons):
????board?=?itertools.chain(*map(get_neighbors,?alive_cons))
????new_board?=?set([con
?????????????????????for?con?in?board
?????????????????????if?is_alive_con(con,?alive_cons)])
????return?list(new_board)
以上就是幾個核心的函數(shù),下面主函數(shù):
def?main():
????size?=?5
????board?=?[(0,?2),?(1,?1),?(1,?2),?(2,?2),?(2,?3),?(3,?1),?(3,?2),?(3,?3)]
????print_board(get_board(size,?board))
????for?_?in?range(10):
????????board?=?correct_cons(size,?new_step(board))
????????print_board(get_board(size,?board))
終止?fàn)顟B(tài):所有網(wǎng)格細(xì)胞狀態(tài)都為0
生命游戲的完整代碼,下載請微信我,備注:生命游戲
