fryptus 2023-05-05 20:49 采纳率: 50%
浏览 47

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-07 08:35
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 5月5日

悬赏问题

  • ¥15 模块化生产的路径规划哪种算法更合适?
  • ¥15 如何在animate html5文档任意位置实现文本输入功能?
  • ¥15 电机正反转电路设计中,mos管的关断问题,求原因。
  • ¥15 关于#sql#的问题:怎么找出所有同时多张有效保单的车架号
  • ¥15 KFC账号下单提示拒绝操作
  • ¥20 HC32F460串口发送仅能接到一个数据
  • ¥15 求解答一下是否可以修改一个软件运行时生成的文件内部内置的文件创建时间?
  • ¥20 WIN10蓝屏问题!
  • ¥15 Mac经常自动关机,再次打开后提示“电脑因出现问题而重新启动”
  • ¥60 使用ovito软件怎么得到金属玻璃的自由体积