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()
Python 数据分析与数据可视化(一)Python 开发环境搭建与编码规范
Python 数据分析与数据可视化(二)数据类型、运算符与内置函数
Python 数据分析与数据可视化(三)列表、元组、字典、集合与字符串
Python 数据分析与数据可视化(四)文件操作
Python 数据分析与数据可视化(五)线性代数基本知识
Python 数据分析与数据可视化(六)numpy 数组和矩阵运算
Python 数据分析与数据可视化(七)pandas数据分析实战
Python 数据分析与数据可视化(八)sklearn机器学习实战
Python 数据分析与数据可视化(工具篇)课程所需扩展库安装
Python 数据分析与数据可视化(实践篇)泰坦尼克号旅客生存预测