如何用FuncAnimation实现康威生命游戏动画并导出MP4文件
原代码错误点
- 没有导入
matplotlib.animation模块 FuncAnimation默认会将当前帧序号作为第一个参数传入更新函数,你写的conway_step参数顺序不匹配- 更新函数没有修改画布上的图像对象,也没有返回需要重绘的元素
- 没有配置导出MP4所需的writer参数
完整可运行修改版代码
import matplotlib.pyplot as plt import numpy as np from matplotlib.animation import FuncAnimation, FFMpegWriter def initialize(size): # 移除原函数里的弹窗逻辑,统一由动画模块控制渲染 return np.random.choice([0, 1], size*size, p=[0.8, 0.2]).reshape(size, size) def conway_step(frame, img, grid, size): new_grid = np.zeros_like(grid) for x in range(size): for y in range(size): total = sum([grid[(x+i) % size, (y+j) % size] for i in range(-1, 2) for j in range(-1, 2)]) if grid[x, y] == 1 and total-1 in (2, 3): new_grid[x, y] = 1 elif grid[x, y] == 0 and total == 3: new_grid[x, y] = 1 else: new_grid[x, y] = 0 # 更新画布上的图像数据 img.set_data(new_grid) # 同步更新grid供下一帧计算使用 grid[:] = new_grid[:] # 返回修改后的渲染元素,开启blit优化时必须返回 return img, def conway(size=100, frames=30, interval=200, save_mp4=False): grid = initialize(size) fig, ax = plt.subplots(figsize=(8,8)) # 隐藏坐标轴更美观,用黑白配色符合生命游戏显示习惯 ax.axis('off') img = ax.imshow(grid, cmap='binary') ani = FuncAnimation( fig, conway_step, fargs=(img, grid, size), # 传递给更新函数的额外参数 frames=frames, # 总动画帧数 interval=interval, # 帧间隔,单位毫秒 blit=True # 开启局部重绘优化,大幅提升流畅度 ) # 导出MP4逻辑,需要提前安装ffmpeg并配置到系统环境变量 if save_mp4: writer = FFMpegWriter(fps=1000/interval) ani.save('conway_game.mp4', writer=writer, dpi=150) plt.show() return ani if __name__ == "__main__": # save_mp4设为True即可导出MP4文件到当前目录 conway(size=100, frames=30, interval=200, save_mp4=False)
注意事项
- 导出MP4需要提前安装ffmpeg工具,各操作系统都可以通过对应包管理器直接安装,配置到系统环境变量后即可正常调用
- 可以通过修改
frames参数调整总动画时长,修改interval参数调整动画播放速度 - 如果不需要导出视频,只需要在线预览,可以删除FFMpegWriter相关的代码逻辑
内容的提问来源于stack exchange,提问作者Brais Romero
相关产品推荐
相关产品推荐

