有趣代码:马里奥吃蘑菇

 


1、Matplotlib生成动画

Matplotlib 不仅可以绘图, 还可以生成动画。负责生成动画的函数是 FuncAnimation, 使用前需先将其导入:

from matplotlib.animation import FuncAnimation

指定位置嵌入图片

控制图片的位置和大小是由 originextent 两个参数来实现的。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')
复制代码

效果如下:

 

可用图片:

                                    

 

                                                    

 

 

 

 

 

 

posted @   taohuaxiaochunfeng  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示

目录导航