英國數學家約翰·何頓·康威在1970年發明了 the game of life,今天番茄加速就來分享下如何利用python實現生命遊戲,規則如下:
每個細胞有兩種狀態 - 存活或死亡
每個細胞與以自身為中心的周圍八格細胞產生互動
當前細胞為存活狀態時,當周圍的存活細胞低於2個時(不包含2個),該細胞變成死亡狀態。(模擬生命數量稀少)
當前細胞為存活狀態時,當周圍有2個或3個存活細胞時,該細胞保持原樣。
當前細胞為存活狀態時,當周圍有超過3個存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)
當前細胞為死亡狀態時,當周圍有3個存活細胞時,該細胞變成存活狀態。(模擬繁殖)
拿個例子闡述上述狀態,如下種子時代:
[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]
坐標[0,2]為一個存活的細胞,因為周圍細胞個數為2,所以繁衍後依然存活;
坐標[1,2]的存活細胞,因為周圍有4個存活細胞,所以繁衍後死亡;
坐標[0,1]死亡細胞,因為周圍恰好有3個存活細胞,所以[0,1]處出現生命,
繁衍一代後的,完整圖如下:
[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]
...
能到第幾代結束呢?借用 Python 模擬了生命遊戲,整個代碼一共 60 行。
首先生成生命網格:
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)]
獲得細胞的鄰域:
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
生成下一代完整的生命網格:
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)
以上就是幾個核心的函數,下面主函數:
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))
終止狀態:所有網格細胞狀態都為0