“生命游戏”(Conway’s Game of Life)是由数学家约翰·康威提出的一种零玩家游戏。它是一个细胞自动机,由一组简单的规则决定每个细胞的状态。以下是用Python实现“生命游戏”的代码示例:
Python代码实现
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def initialize_grid(size):
"""初始化游戏的网格,随机设置细胞状态(0为死,1为生)"""
return np.random.choice([0, 1], size*size, p=[0.8, 0.2]).reshape(size, size)
def update_grid(grid):
"""根据生命游戏规则更新网格"""
# 创建一个副本,用于计算邻居
new_grid = grid.copy()
size = grid.shape[0]
# 遍历每个细胞
for i in range(size):
for j in range(size):
# 计算该细胞周围的活细胞数
total = int((
grid[i, (j-1)%size] + grid[i, (j+1)%size] +
grid[(i-1)%size, j] + grid[(i+1)%size, j] +
grid[(i-1)%size, (j-1)%size] + grid[(i-1)%size, (j+1)%size] +
grid[(i+1)%size, (j-1)%size] + grid[(i+1)%size, (j+1)%size]
))
# 生命游戏规则
if grid[i, j] == 1:
if (total < 2) or (total > 3):
new_grid[i, j] = 0 # 死亡
else:
if total == 3:
new_grid[i, j] = 1 # 诞生
return new_grid
def animate(frame, grid, plot):
"""更新动画帧"""
grid[:] = update_grid(grid)
plot.set_data(grid)
return plot,
def run_game_of_life(size=50, interval=200):
"""运行生命游戏"""
grid = initialize_grid(size)
fig, ax = plt.subplots()
plot = ax.imshow(grid, cmap='binary')
ani = animation.FuncAnimation(fig, animate, fargs=(grid, plot), frames=10, interval=interval, save_count=50)
plt.show()
# 运行游戏
run_game_of_life(size=50, interval=200)
代码说明
-
initialize_grid(size)
: 生成一个随机的初始网格,网格中的每个细胞随机设置为活(1)或死(0)。 -
update_grid(grid)
: 根据生命游戏的规则更新网格状态:- 规则1: 任何活细胞,如果有两个或三个邻居仍然存活,否则它将死亡。
- 规则2: 任何死细胞,如果有恰好三个邻居活着,则该细胞诞生。
-
animate(frame, grid, plot)
: 这个函数是用来逐帧更新动画的。 -
run_game_of_life(size=50, interval=200)
: 这是运行游戏的主要函数,它设置了网格大小和动画帧之间的间隔时间。最终会显示一个动画,演示生命游戏的过程。
运行代码
当你运行run_game_of_life()
函数时,将会显示一个动态的图像,展示细胞的生与死的演化过程。size
参数决定网格的大小,interval
参数控制动画的速度。