python元胞自动机程序动画显示报错

一段python代码,实现元胞自动机,生命游戏

出现如图报错,创建变量ani后,依然没能保存动画进行显示

代码如下

import sys, argparse
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.colors import ListedColormap

#设置显示颜色
yeah = ('purple', 'yellow')
camp = ListedColormap(yeah)
#设置元胞状态255生,0死
ON = 255
OFF = 0
vals = [ON, OFF]

#随机生成N*N网格
def randomGrid(N):
    return np.random.choice(vals, N * N, p = [0.2, 0.8]).reshape(N, N) #分别以0.2, 0.8的概率将vals的值填入N*N网格

#初始添加滑翔机
def addGlider(i, j, grid):
    glider = np.array([[0, 0, 255], [255, 0, 255], [0, 255, 255]]) #滑翔机
    grid[i: i + 3, j: j + 3] = glider #设置3*3区域的起始状态
    return 0

#更新元胞状态
def update(frameNum, img, grid, N):
    newGrid = grid.copy() #生成一个与grid一致的网格
    #判断8个邻居的状态,统计ON状态的元胞的总数,取余:边界折返,更新元胞状态
    for i in range(N):
        for j in range(N):
            total = int((
                grid[i, (j - 1) % N] + grid[i, (j + 1) % N] +
                grid[(i + 1), j % N] + grid[(i - 1), j % N] +
                grid[(i + 1), (j - 1) % N] + grid[(i + 1), (j + 1) % N] +
                grid[(i - 1), (j - 1) % N] + grid[(i - 1), (j + 1) % N]
            ) / 255)
            if grid[i, j] == ON:
                if(total < 2) or (total > 3):
                    newGrid[i, j] = OFF
            else:
                if total == 3:
                    newGrid[i, j] = ON
    img.set_data(newGrid) #更新图形数据
    grid[ : ] = newGrid[ : ] #更新Grid
    return img

#程序运行参数设置
def main():
    parser = argparse.ArgumentParser(description = "Run life game simulation")
    parser.add_argument('--grid-size', dest = 'N', required = False) #网格大小
    parser.add_argument('--mov-file', dest = 'movfile', required=False) #.mov文件名
    parser.add_argument('--interval', dest = 'interval', required=False) #视频每帧更新间隔ms
    parser.add_argument('--glider', action = 'store_true', required=False) #以滑翔机开始
    parser.add_argument('--gosper', action = 'store_true', required=False) #unkonwn
    args = parser.parse_args()
    N = 100 #grid默认值
    if args.N and int(args.N) > 8:
        N = int(args.N)
    updateInterval = 50 #默认刷新间隔
    if args.interval:
        updateInterval = int(args.interval)
    grid = np.array([])
    if args.glider:
        grid = np.zeros(N * N).reshape(N, N) #初始化N*N,0
        addGlider(1, 1, grid) #初始化滑翔机
    else:
        grid = randomGrid(N) #初始化N*N
    fig, ax = plt.subplots(facecolor = 'pink') #创建fig图形对象,ax坐标轴对象,设置背景颜色为粉色
    img = ax.imshow(grid, cmap = camp, interpolation = 'nearest') #返回,用于访问图像的对象
    ani = animation.FuncAnimation(fig, update, fargs = (img, grid, N), frames = 10,
                                  interval = updateInterval, save_count = 50) #创建动画
    if args.movfile:
        ani.save(args.movfile, fps = 30, extra_args = ['-vcodec', 'libx264']) #将视频文件保存到指定路径
    plt.show()
    return 0

main()

img

img

img