有趣代码:马里奥吃蘑菇
1、Matplotlib生成动画
Matplotlib 不仅可以绘图, 还可以生成动画。负责生成动画的函数是 FuncAnimation, 使用前需先将其导入:
from matplotlib.animation import FuncAnimation
指定位置嵌入图片
控制图片的位置和大小是由 origin 和 extent 两个参数来实现的。origin 有 “upper” 和 “lower” 两个取值,决定了图片是正着的还是倒着的。extent=(L, R, B, T) 则决定了图片的边界坐标,L, R, B, T 分别代表了图片的最左端,最右端,最底端,最上端的坐标。
下面一个 demo 演示了如何设置图片的指定位置。超级马里奥位于一个 10x10的格子中,他需要从左下角走到右上角,从而吃到能让自己变大变强的蘑菇。
1 import matplotlib.pyplot as plt
2 from matplotlib.animation import FuncAnimation
3 import numpy as np
4 from PIL import Image
5
6 # 读取图片
7 mario_img = Image.open('mario.png')
8 mushroom_img = Image.open('mushroom.png')
9
10 # 设置画布
11 fig, ax = plt.subplots()
12 plt.axis('off')
13
14 ax.set_xlim(-0.5, 10.5)
15 ax.set_ylim(-0.5, 10.5)
16
17 ax.vlines(np.arange(11), 0, 10)
18 ax.hlines(np.arange(11), 0, 10)
19
20 # 画蘑菇
21 mushroom = ax.imshow(mushroom_img, extent=(9, 10, 9, 10))
22
23 # 画马里奥
24 mario_x = 1
25 mario_y = 1
26 mario = ax.imshow(mario_img, extent=(mario_x - 1, mario_x, mario_y - 1, mario_y))
27
28
29 def move():
30 global mario_x, mario_y
31 if mario_x == 10 == mario_y: # 吃到蘑菇了噢
32 mario_x = mario_y = 1
33 return True
34 elif mario_x == 10:
35 mario_y += 1
36 elif mario_y == 10:
37 mario_x += 1
38 else:
39 if np.random.random() < 0.5:
40 mario_x += 1
41 else:
42 mario_y += 1
43
44 return False # 还没吃到蘑菇呢!
45
46
47 def init():
48 pass
49
50 def update(frame):
51 mario.set_extent((mario_x - 1, mario_x, mario_y - 1, mario_y))
52
53 # 若吃到蘑菇则隐藏蘑菇,避免两张图片重叠,更好看一点
54 if move():
55 mushroom.set_alpha(0)
56 else:
57 mushroom.set_alpha(1)
58
59
60
61 ani = FuncAnimation(fig, update, frames=range(180), blit=False, interval=300,
62 repeat=False, init_func=init)
63
64 ani.save('mario_like_mushroom.gif')
效果如下:
可用图片:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律