《八猫联动初体验》_来自游戏海龟模块的问候

如本文章标有价格,需议价或其它事情商议请加微信pythonxia

《八猫联动初体验》是用Python的游戏海龟模块制作的一个小程序。

在这个作品中使用了游戏海龟模块!英文名是gameturtle,话说什么是游戏海龟模块呢?原来,这个模块是一个“秘密”的模块。是笔者全新开发的一个用于制作游戏的模块。它支持像素级碰撞检测,使用简单,主要配合tkinter模块来开发制作有趣的游戏。

这个模块在《Python海龟宝典》下册原理篇中有详细的使用说明。如果你读懂了《Python海龟宝典》下册原理篇,那么就能自己开发一个gameturtle模块了。

读者可能又会问《Python海龟宝典》又是什么?《Python海龟宝典》也是笔者编写的。它分为上下两册,上册是超过200例的用原生的turtle模块制作的各种小案例,如动画,小游戏,绘画艺术等。

Python海龟宝典

下册则深入剖析了turtle模块内部,并且推出了自己的一个叫gameturtle的模块。只要你顺着作者的思路,相信你也能成为Python创意编程大师。

图片

我们这里讲的《八猫联动初体验》这个作品,

就是用gameturtle模块编写的。如果你的电脑没有安装gameturtle模块,是无法运行的。可喜的是,这个模块的源代码已经开源。任何人都能安装下载它,查看并阅读它的源代码以便学习。安装它很简单,用cmd打开管理员窗口,然后输入 pip install gameturtle 即可。

python pip install gameturtle

在gameturtle模块中,定义了一个叫GameTurtle的类,别名叫Sprite。使用Sprite类至少要带上画布参数,所以要建窗口和画布。

下面是一个简单的示例代码。

from gameturtle import *

root = Tk()
cv =Canvas(width=480,height=360)
cv.pack()

a = Sprite(cv)

程序最后一句没有写root.mainloop()这行代码,所以还可以直接在IDLE Shell中输入测试代码。

读者可以输入a.fd(100,a.forward(100),a.bk(100,a.rt(90),a.lt(90)等进行测试。这些和turtle模块基本一致。

不过最大不同是坐标系的不同。所以如果输入a.distance(100,100),返回的是161.24515496597098时不要惊讶。

tkinter canvas coordinate system
tkinter canvas coordinate system

因为tkinter画布坐标系以左上角为原点,而海龟诞生时默认在画布中央,所以这个时候它的坐标并不是(0,0)。在本例中,由于画布宽度是480,高度是360,所以海龟的坐标是(240,180)。

可能有人会问,上面的程序并没有导入tkinter模块的Tk和Canvas命令,但在程序中却可以直接使用,这是怎么回事呢?

这是由于在gameturtle模块中已经导入了!而在本程序第一行代码又是使用了*号,所以它会一股脑儿把所有在gameturtle曾经导入过的命令都导进来。

更好的办法是写from gameturtle import Sprite。这个时候,读者就要手工导入Tk和Canvas这两个命令(类)了。

为了显示多帧动画,下面的程序告诉了你,如何给Sprite命令传递多帧图像,从而生成具有多帧造型角色。

python multi frame costumes
python multi frame costumes

首先,有一个叫res的文件夹,它下面存储了从0.png到15.png的图像。

然后我们要把它们的相对路径(程序和res目录同一个文件夹)全部加载进来,用下面的代码:

frames = [f"res/{i}.png" for i in range(16)]

这是一行列表推导式,运行它就能把图像的相对路径全部放在列表中。

接着,用Image.open打开每张图(在gameturtle已经导入的pillow模块)。

代码就像下面这样:

ims = [Image.open(im) for im in frames]

由于我们要建8个角色,并且把它们全部放在cats列表中,所以用下面的代码:

cats = [Sprite(cvs[i],ims) for i in range(8)]

在Sprite类中,第一个参数是画布,其它参数的名字依次是:
frames,pos,visible,heading=0,tag。

frames表示造型帧图,可以传递一个图形,也能传递一个列表或元组。这些图形要是pillow模块中的图形对象。也就是要用Image.open或者Image.new或者Image.fromarray这几个命令加载的图表对象。

pos参数表示坐标,visible参数表示可见性,heading参数表示默认的方向。

tag参数表示角色的标签,这是为了便于分组。

最后为了让每只猫不断地原地踏步,让它们在无限循环中不断切换造型即可。

所有代码示例如下所示:

"""
八猫联动初体验.py
这个程序使用gameturtle模块,生成8块画布,在每块画布上生成一只小猫。

"""
try:
    from gameturtle import *
except:
    import subprocess
    p = subprocess.Popen(["pip","install","gameturtle"],shell=True)
    from tkinter import messagebox
    t ='风火轮编程提示:'
    p = '''没有找到gameturtle模块,程序无法运行。\n
程序会自动进行安装,如果重新启动程序后还无法运行。\n
请手动安装gameturtle模块,方法:\n用cmd命令打开管理员窗口,\n然后输入pip install gameturtle\n
如果还是不知道操作,请加李兴球微信pythonxia提供技术支持。\n
gameturtle模块详细说明,请见《Python海龟宝典》下册原理篇。'''
    messagebox.showwarning(t,p)

root = Tk()
root.title('八猫联动初体验by李兴球')
colors = ['red','orange','yellow','green',
          'cyan','blue','purple','pink']

cvs = []
for counter in range(len(colors)):
    i = counter // 4                                     # 行号
    j = counter % 4                                      # 列号
    cv = Canvas(width=120,height=120,bg=colors[counter]) # 建画布
    cv.grid(row=i,column=j)                              # 布局  
    cvs.append(cv)                                       # 放表中
    

frames = [f"res/{i}.png" for i in range(16)]   # 猫的每帧造型图
ims = [Image.open(im) for im in frames]        # 用Image.open加载到内存
cats = [Sprite(cvs[i],ims) for i in range(8)]  # 生成8个角色
[cat.setrotmode(1) for cat in cats[4:] ]       # 后4个设定旋转模式为左右翻转
[cat.right(180) for cat in cats[4:] ]          # 后4个向后转

while True:
    [c.nextshape() for c in cats ]             # 每只猫切换造型         
    root.update()                              # 更新显示
    time.sleep(0.01)                           # 等待0.01秒

需要本程序所有源代码和素材,请关注公众号:李兴球Python,回复8catrun,即可得到下载网址。

本站所有作品,教程等皆为原创,版权所有。只供个人及单位内部研究使用,对外展示或传播必需经本站同意,且注明来自本站。培训机构等用本站资源培训学生,需经本站授权。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。入住QQ群:225792826 和爱好者共同交流,并且能下载免费提供的Python资源(需提供真实姓名才可入群)
李兴球的博客_Python创意编程技术前沿_pygame » 《八猫联动初体验》_来自游戏海龟模块的问候
scratch

学本领,探索更大的世界!

李兴球博客 风火轮编程主页