猫和老鼠都是各位的童年回忆吧,相信各位没有人没看过吧,汤姆一直抓不到杰瑞,通过python来实现汤姆抓杰瑞吧
实现流程
首先实现游戏的步骤:
1.创建一个游戏场所
2.创造游戏角色
3.用键盘控制杰瑞逃跑
4.汤姆自动追逐
5.游戏结束,显示逃跑时间
导入模块
turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形
import turtle #导入海龟工具库
import time #导入时间工具包
import random #导入随机工具包
创建追逐场地以开场文字
1.新建一个海龟取名为writer
2.改变画笔颜色,变成棕色
3.然后把它隐藏掉
4.再然后让它抬笔
5.走到游戏的中间
6.写下TOM & JERRY,居中对齐,然后我选了一个字体,字号用50号,变成粗体
7.在下面(0,-50)的地方加上一行小字,写下READY? 3,2,1,GO!格式和上面一样,唯一不同的就是把字体的大小改成20
playground = turtle.Screen()
#取一个名字叫playground,新建一屏幕,把屏幕给到playground这个变量
writer = turtle.Turtle()
writer.color("brown")
writer.hideturtle()
writer.penup()
writer.home()
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", 20, 'bold'))
time.sleep(3)
writer.clear()
#让这个屏幕沉睡3秒,然后清空屏幕
创建游戏角色
到这儿,我们要做的事情其实就是召唤两只海龟,并且把海龟的形状改成猫和老鼠
tom.gif与jerry.gif是图片,我们可以到网上找猫与老鼠的图片,改名字改成和源代码一样的就好了(记得放在同路径下!!)
先把tom抬起来 然后让他走到随机的位置,随机到x轴(-200,200)y轴(-200,200)
再把jerry抬起来 然后让他走到随机的位置,随机到x轴(-200,200)y轴(-200,200)
playground.register_shape('tom.gif')
playground.register_shape('jerry.gif')
# 我们在playground这个游戏场地注册一下这两个形状
tom = turtle.Turtle()
tom.shape('tom.gif') # 改成我们刚刚注册的图片
tom.penup()
tom.goto(random.randint(-200, 200), random.randint(-200, 200))
jerry = turtle.Turtle()
jerry.shape('jerry.gif') # 改成我们刚刚注册的图片
jerry.speed(0)
jerry.penup()
jerry.goto(random.randint(-200, 200), random.randint(-200, 200))
用键盘控制杰瑞逃跑(定义函数)
首先我们先指出4个行为,上下左右,我们用def来定义4个行为
我们用setheading这个函数,设置当前朝向为angle角度
向上看是90度,移动20个像素
向下是270度,移动20个像素
向左是180度,移动20个像素
向右是0度,移动20个像素
在playground这个游乐场里面绑定,相当于告诉playground说按下这4个键,那你就要做什么样的动作. 我们用onkey,用onkey表达的意思就是当什么键给按下的时候. 然后把up这个函数和我们想要的键盘绑定在一起,后面3个也一样
# 定义函数
def up():
jerry.setheading(90)
jerry.forward(20)
# 向上看是90度,移动20个像素
def down():
jerry.setheading(270)
jerry.forward(20)
# 向下是270度,移动20个像素
def left():
jerry.setheading(180)
jerry.forward(20)
#向左是180度,移动20个像素
def right():
jerry.setheading(0)
jerry.forward(20)
#向右是0度,移动20个像素
playground.onkey(up, 'Up')
playground.onkey(down, 'Down')
playground.onkey(left, 'Left')
playground.onkey(right, 'Right')
# 要把这四个行为和键盘上的四个按键绑定在一起
playground.listen()
#listen 监听,我们要告诉这个playground,这几个键给按下了就要做这些事情,让它监听着这个键盘的动向。
汤姆自动追逐
因为tom需要不停的追不停的追,所以整个动作是一个持续不断的循环。tom要怎么样最快抓住Jerry呢,就是面朝jerry一直向前移动
1.就是让tom面朝jerry
2.让tom移动
首先我们要获得Jerry和tom的位置。我们用海龟工具库里的towards(朝向)获取Jerry的位置, 用setheading设置当前朝向为Jerry的位置方向。把tom的角度改成这个角度。 然后让tom往前走5个像素,这个可以决定游戏的难度,像素越大游戏难度越难。
while True:
tom.setheading(tom.towards(jerry))
tom.forward(6)
if tom.distance(jerry) < 10: #判断
end = time.time()
playground.clear() # 清空屏幕
游戏结束,显示逃跑时间
第一行我们先让jerry归位
写下GAME OVER,居中对齐,字体,字号用50号,变成粗体
在下面(0,-50)的地方加上一行小字 写下YOU SURVIVED SECONDS
居中对齐,选了一样的字体,字号用20号,变成粗体
Python里面,我们可以用time时间这个工具包做到同样的事情,我们把这个工具包导入。 然后,我们在游戏开始的地方掐个表,游戏开始的位置是在这个循环开始前,我们定义start等于time.time(),掐个表,然后游戏结束就是Jerry被抓住的时候,再掐一个表结束时间。
jerry.goto(0, 0)
jerry.write("GAME OVER", align='center', font=("Comic Sans MS", 50, 'bold'))
jerry.goto(0, -50)
jerry.write("YOU SURVIVED {:.1f} SECONDS".format(end - start),align='center', font=("Comic Sans MS", 20, 'bold'))
start = time.time()
end = time.time()
为了做到游戏效果,我们进一步修改程序,把tom和jerry在游戏结束的时候显示在画面上
把tom抬起来 让他走到合适的位置
(-50,-70 ) 用stamp给他打一个印章,让tom印在屏幕上 Jerry也是一样的
把它放(50,-70)用stamp给他打一个印章,让jerry印在屏幕上
tom.pu()
tom.goto(-50, -70)
tom.stamp()
jerry.pu()
jerry.goto(50, -70)
jerry.stamp()
源码展示(图片导入记得改,不然会报错)
import turtle
import time
import random
def up():
jerry.setheading(90)
jerry.forward(20)
def down():
jerry.setheading(270)
jerry.forward(20)
def left():
jerry.setheading(180)
jerry.forward(20)
def right():
jerry.setheading(0)
jerry.forward(20)
playground = turtle.Screen()
playground.register_shape('tom.gif')
playground.register_shape('jerry.gif')
playground.onkey(up, 'Up')
playground.onkey(down, 'Down')
playground.onkey(left, 'Left')
playground.onkey(right, 'Right')
playground.listen()
writer = turtle.Turtle()
writer.color("brown")
writer.hideturtle()
writer.penup()
writer.home()
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", 20, 'bold'))
time.sleep(3)
writer.clear()
tom = turtle.Turtle()
tom.shape('tom.gif')
tom.penup()
tom.goto(random.randint(-200, 200), random.randint(-200, 200))
tom.pendown()
tom.pensize(3)
tom.color('blue')
jerry = turtle.Turtle()
jerry.shape('jerry.gif')
jerry.speed(0)
jerry.penup()
jerry.goto(random.randint(-200, 200), random.randint(-200, 200))
jerry.color('brown')
start = time.time()
while True:
tom.setheading(tom.towards(jerry))
tom.forward(6)
if tom.distance(jerry) < 10:
end = time.time()
playground.clear()
jerry.goto(0, 0)
jerry.write("GAME OVER", align='center', font=("Comic Sans MS", 50, 'bold'))
jerry.goto(0, -50)
jerry.write("YOU SURVIVED {:.1f} SECONDS".format(end - start),align='center', font=("Comic Sans MS", 20, 'bold'))
tom.pu()
tom.goto(-50, -70)
tom.stamp()
jerry.pu()
jerry.goto(50, -70)
jerry.stamp()
break
elif tom.distance(jerry) > 90:
tom.forward(30)
turtle.done()
这段代码完成之后,游戏还可以加多一些功能,比如开始的按钮,再来一把的按钮