python实现猫抓老鼠

  • Post author:
  • Post category:python



猫和老鼠都是各位的童年回忆吧,相信各位没有人没看过吧,汤姆一直抓不到杰瑞,通过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()


这段代码完成之后,游戏还可以加多一些功能,比如开始的按钮,再来一把的按钮



版权声明:本文为weixin_56043516原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。