fryptus 2023-05-05 18:54 采纳率: 50%
浏览 15

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条回答 默认 最新

报告相同问题?

问题事件

  • 修改了问题 5月5日
  • 修改了问题 5月5日
  • 创建了问题 5月5日

悬赏问题

  • ¥20 已知坐标,换成MATLAB可以用的数据
  • ¥50 写segy数据text时出错
  • ¥15 这个python五子棋代码的每一句意思是什么啊
  • ¥15 求一段隐藏代码,隐藏一些内容
  • ¥15 汇川EASY521plc电子凸轮
  • ¥15 C++ 如何判断设置快捷键来实现隐藏/显示窗口
  • ¥15 关于#材料工程#的问题:有没有具有电子阻挡层和空穴阻挡层的电池仿真silvaco代码例子或者其他器件具有阻挡层例子的silvaco代码(最好还有相关文献)
  • ¥60 基于MATLAB的TAOD算法
  • ¥15 Groimp使用疑问
  • ¥15 MDK–ARM里一直找不到调试器