手把手用Python做个猫捉老鼠的小游戏吧?
如果你连他俩都不认识,说明你还小~
大家周末好?,又到了周末看动画片,打游戏,敲代码??的美好宅时光了?
接下去,请允许我隆重介绍本期FunPy101的主角们,他们就是???
?汤姆和杰瑞?
左边的灰色小猫?名叫Tom汤姆,是一只被主人惯坏了的家猫。右边的棕色小老鼠?名叫Jerry杰瑞,是汤姆的邻居。
他俩每天的生活都是围绕着汤姆?企图抓住杰瑞的故事而展开,当然随之而来的还有各种家中物品的大破坏?
大部分情况下,汤姆的计划都没办法骗过聪明的杰瑞,结果反而让自己吃了苦头?
不过有时,得意过头的杰瑞也会不小心中了汤姆的下怀?
偶尔的偶尔,他俩也会和谐得像是亲密朋友?
你知道吗,从1939年他俩第一次出镜?以来,这对欢喜冤家已经追逐嬉闹80年了!他们带给我们(也许不包括你们哦~)的欢乐多的数也数不清?
那这周的代码时光呢,就让我们一块用Python做一个猫捉老鼠的小游戏?,重现一下这俩家伙日常追逐却又互相享受?的画面吧。
对了☝,如果你还没有看过这个动画片,那可千万别在完成代码前播放哦,真的太好看了,你会入迷的?
设计思路?
温馨提示:这次的游戏需要我们对Python和Turtle模块有一定的基础。限于篇幅,文章只分享关键代码。完整的代码需要大家自己动动脑筋或者后台私信啦?
首先,我们先来看看游戏效果✨
看完了效果,暂停文章思考两分钟
⏳⏳
是不是脑子里已经有了思路?,只差一些关键的代码了?
没错,游戏的思路很简单,一共就那么几步:
创建追逐场地及开场文字
产生汤姆和杰瑞,随机出现在屏幕上
用键盘控制杰瑞移动
汤姆自动寻找最近的路线捉杰瑞
如果汤姆足够靠近杰瑞了,那么杰瑞被抓住
游戏结束,显示杰瑞逃跑了多少秒
那么好,接下去就让Rookie手把手?,教你每一步都是怎么做的吧!
详细步骤?
1. 创建追逐场地及开场文字
游戏场地部分,我们使用turtle.Screen()
创建一个游戏屏幕。
playground = turtle.Screen()
而文字部分则很简单,之前的文章也有很多例子,使用turtle里的write
方法就好了
如果你喜欢我的字体?,喏,拿去用吧~
writer = turtle.Turtle()writer.color('brown')writer.ht()writer.pu()writer.goto(0, 0)writer.write("TOM & JERRY", align='center', font=('Comic Sans MS', 50,'bold'))writer.goto(0, -50)writer.write("READY? 3, 2, 1, GO!", align='center', font=('Comic Sans MS', 25,'bold')) time.sleep(3)writer.clear()
2. 产生汤姆和杰瑞,随机出现在屏幕上
这儿我们做的事情其实就是召唤了两只海龟?,并且把海龟的形状改成了猫和老鼠。
我们就拿杰瑞来举例吧☝
首先,你要先从网上找一个自己喜欢的,大小在64x64像素以内的图片(太大了会占满游戏屏幕)。当然也可以像我一样直接到图标网站(比如www.iconfont.cn)去下载相关图标,简单省事?
下载完图标以后,把它放到和游戏代码同样的文件夹里,并且记得把图标重命名为jerry.gif
。
为啥要用gif作为后缀,没办法,turtle只支持这个格式?
然后我们把这个图标告诉上一步创建的游戏场地,以便我们能召唤杰瑞。
playground.register_shape('jerry.gif')jerry = turtle.Turle()jerry.shape('jerry.gif')
最后,我们使用随机random
这个工具包?,把杰瑞移动到场地上的随机位置就好啦。
3. 用键盘控制杰瑞移动
这是之前没有提到过的功能,我们稍微讲一讲。如何用键盘⌨控制杰瑞呢,我们需要让整个游戏场地监听玩家手上的键盘。说白了,就是让Python竖着耳朵?听你下达指令,一旦收到指令就立即按指令办事?
所以首先我们要创建一系列的键盘指令?,比如当键盘里的向上按钮被按下时就让杰瑞往上逃跑?
我们创建一个函数,取名成up,这就是一个简单的指令,功能为让杰瑞向上跑20个像素。
def up(): jerry.setheading(90) jerry.forward(20)
然后我们把函数和键盘里的向上按钮捆绑?在一起,并向游戏场地。这一步相当于告诉游戏场地的相关人员,我把指令放在这了,当键盘上的向上按钮被按下时,你就照着指令办事。
playground.onkey(up, 'Up')
最后,我们命令游戏场地相关人员,注意认真听?,可千万别错过指令了。
playground.listen()
其余的键盘操作,左右下都是同理。
4. 汤姆自动寻找最近的路线捉杰瑞
汤姆可不笨,它会用最短的路线去捉杰瑞。什么是最短路线呢?当然是连接他俩的直线了。
我们的做法很简单,控制汤姆让他面朝杰瑞,然后大步往前走就行了?。怎么转变朝向呢?诶,刚好,Turtle里有个好用的办法叫towards,本身就是“朝向“的意思。我们使用tom.towards(jerry)
就可以计算杰瑞距离汤姆所在的方位,然后通过setheading
让汤姆?面朝这个方向,最后向前走一定的距离(比如每次前进5个像素)就可以了。
因为汤姆需要不断做这些事情?,所以记得在外加一层while
循环。具体代码如下
while True: tom.setheading(tom.towards(jerry)) tom.forward(5)
5. 如果汤姆足够靠近杰瑞了,那么杰瑞被抓住
要算出汤姆和杰瑞之间的距离,只要利用汤姆和杰瑞的坐标,使用简单的勾股定理?就能计算出来了。
假设汤姆和杰瑞的坐标分别为(x1, y1) 和 (x2, y2),那么他俩的距离写成Python代码就是((x1 - x2)**2 + (y1 - y2)**2)**0.5
不过感谢Turtle,提供了一个更加简单的计算方法,即使用distance
函数。
比如,我们要写”当汤姆距离杰瑞小于10个像素时,杰瑞就被抓住了“,我们就可以这样写✍
if tom.distance(jerry) < 10: print("got you!")
6. 游戏结束,显示杰瑞逃跑了多少秒
恭喜你?,这是最后一步啦,这一步和第一步显示开场文字类似,只不过我们要多显示一个杰瑞逃跑的时间⏰
如何获得这个时间呢?我们可以在游戏开始前掐个表?,在杰瑞被抓住的时候再掐个表?,两个表之间的差就是杰瑞存活了多少秒。
跟时间有关的操作,找time
这个工具包就对了?
import timestart = time.time() # 掐个表作为开始end = time.time() # 掐个表作为结束total_time = end - start # 总时间等于结束减去开始
代码简单易懂,但是想想看,这几行代码分别该放在哪呢?
大功告成,不知道这些提示你们消化了没有?你能独立完成这个猫捉老鼠的小游戏吗?如果想让游戏变得简单或是困难,你知道要修改哪些参数吗?要是有不明白的,可别害羞,积极举手提问哦✋
最后,让我们一起伴随着熟悉的配乐,再来感受一把游戏的乐趣吧!