【Python】鼠标、按键绑定画布,完成一个蛇追海龟的游戏项目

这篇博客介绍了如何使用Python通过绑定鼠标点击和键盘事件,实现一个‘蛇追海龟’的游戏。详细讲解了事件的概念,如何绑定鼠标点击获取坐标,以及键盘事件的绑定,包括键盘控制画笔移动。最后,分析了游戏的设计流程和关键实现方法,如坐标方位角和距离计算。

目录

1.画布绑定鼠标点击事件

1.1.什么是事件?

1.2.如何让画布绑定鼠标点击事件?画布如何绑定鼠标点击位置?

2.画布绑定键盘事件 

2.1.画布简单绑定键盘事件

​ 2.2.键盘上的上下左右分别控制画笔的前进,后退,左转,右转

3.鼠标点击事件和键盘事件同时存在(可以同时用鼠标或用键盘控制画笔)

4.使用鼠标和键盘事件,创建一个“蛇追海龟”的游戏


1.画布绑定鼠标点击事件

1.1.什么是事件?

是指可以被控件识别的操作。例如:鼠标的单击和双击被称为鼠标点击事件,还有键盘事件。

1.2.如何让画布绑定鼠标点击事件?画布如何绑定鼠标点击位置?

使用onclick()方法可以解决这两个问题。

screen.onclick(fun) #需要一个函数fun作为参数

解释onclick()方法源码:

def onclick(fun):
    主体:获取鼠标点击时x,y的坐标
    return fun(x,y)
import turtle
turtle.shape('turtle')
screen=turtle.Screen() #获取画布
screen.bgcolor('yellow') #设置画布背景颜色
#fun里面的函数体是可以自己定义的
def fun(x,y):
	print(x,y)
	turtle.goto(x,y)
'''
onclick可以获取鼠标点击x,y的坐标值,里面是一个参数fun,
fun也可以是别的函数名,但一定要有两个参数x,y,
因为每次单击鼠标都会调用一次onclick,然后onclick返回一个x,y值,然后调用fun(x,y)
'''
screen.onclick(fun)
screen.mainloop() #使画布运行完之后不要关闭

运行结果:

鼠标单击到拿一处,就获取一个坐标值,然后调用fun(x,y) 函数 

2.画布绑定键盘事件 

2.1.画布简单绑定键盘事件

import turtle
turtle.shape('turtle')
screen=turtle.Screen() #获取画布
screen.bgcolor('yellow') #设置画布背景颜色
#onkey方法需要两个参数,onkey(fun,key)一个是函数fun,另外一个是键盘上的键位key
#函数fun不需要参数
def fun():
	screen.bgcolor('red') 
screen.onkey(fun,'r')#当按下r键,就执行fun,严格区分大小写
#设置不同的函数就可以做到执行不同的效果
def fun1():
	turtle.forward(100)
def fun2():
	turtle.circle(100)
screen.onkey(fun1,'a')
screen.onkey(fun2,'b')
screen.listen() #鼠标单击画布,设置焦点,,开始收集键盘事件,如果没有本行代码,按下r键是没有反应的,单击画布开始执行
screen.mainloop()

按下r键,画布变成红色

按下a,b键位,可以执行fun1,fun2函数

 2.2.键盘上的上下左右分别控制画笔的前进,后退,左转,右转

import turtle
turtle.shape('turtle')
screen=turtle.Screen() #获取画布
screen.bgcolor('yellow') #设置画布背景颜色
#自定义前后左右键位分别对应执行的函数
def up():
	turtle.forward(50)
def back():
	turtle.backward(50)
def left():
	turtle.left(90)
def right():
	turtle.right(90)
#调用onkey函数
screen.onkey(up,'Up')
screen.onkey(back,'Down')
screen.onkey(left,'Left')
screen.onkey(right,'Right')
#单击鼠标焦点开始获取键盘事件
screen.listen()
#运行完毕后不关闭screen窗口
screen.mainloop()

3.鼠标点击事件和键盘事件同时存在(可以同时用鼠标或用键盘控制画笔)

使用默认参数,可以让onclick和onkey都使用函数fun,因此下面代码可以通过鼠标点击屏幕让海龟前进50,也可以通过按键盘上的‘r'键:

import turtle
screen=turtle.Screen()
turtle.speed(0)
def fun(x=None,y=None): #使用默认参数
    turtle.forward(50)
screen.onclick(fun)
screen.listen()
screen.onkey(fun,'r')
screen.mainloop()

4.使用鼠标和键盘事件,创建一个“蛇追海龟”的游戏

咱们初次接触项目,保留一个概念,就是流程:

项目---->分解问题---->分析解决问题的流程---->代码实现,以后接触到更多编程,就会了解到软件开发流程,软件测试流程等。

蛇追海龟游戏设定:

设定一个初始位置,蛇和海龟有一定距离,海龟使用键盘移动,蛇自动追踪海龟。

 问题分析:

1.键盘如何控制海龟移动

2.蛇如何实现追踪海龟的位置

3.如何防止海龟跑出一定范围的画布

4.游戏难度和游戏得分如何设计

 本程序中使用到的方法:

1.xcor(),ycor()获取画笔的x,y坐标值

2.sethesading() 朝着坐标方位角改变方向,每次都以x正轴默认开始,顺时针负角度,逆时针正角度

3.towards()方法是获取两个画笔之间的坐标方位角值

4.distance()方法是获取两画笔之间的距离

import turtle
#键盘控制海龟移动
t=turtle.Pen() #设置一个海龟
s=turtle.Pen() #设置一条蛇
t.shape('turtle') #把海龟画笔造型改为‘海龟’
#设定初始位置
t.penup()
t.goto(200,200)
#限定海龟的移动范围,xcor获取画笔的x坐标,ycor获取画笔的y坐标,为了不使代码重复,我们使用一个函数来解决问题
def checkbound(z):
    if(z.xcor()>200):
        z.goto(200,z.ycor())
    if(z.xcor()<-200):
        z.goto(-200,z.ycor())
    if(z.ycor()>200):
        z.goto(z.xcor(),200)
    if(z.ycor()<-200):
        z.goto(z.xcor(),-200)
#键盘上下左右键位绑定函数,控制海龟的移动
screen=turtle.Screen()
def up():
    checkbound(t) #调用函数防止海龟超出范围
    t.setheading(90)
    t.forward(30)
def down():
    checkbound(t)
    t.setheading(270)
    t.forward(30)
def left():
    checkbound(t)
    t.setheading(180)
    t.forward(30)
def right():
    checkbound(t)
    t.setheading(0)
    t.forward(30)
#设置蛇追踪海龟
while True:
    screen.onkey(up,'Up')
    screen.onkey(down,'Down')
    screen.onkey(left,'Left')
    screen.onkey(right,'Right')
    #设置画布监听键盘事件开始
    screen.listen()
    s.speed(5)
#towards方法可以获取两只画笔直线的坐标方位角,setheading方法是朝坐标方位角改变方向,以x正轴为默认初始方向
#distance方法可以获取两只画笔之间的直线距离
#当蛇和海龟的距离小于30时,循环结束
    s.setheading(s.towards(t))
    s.forward(10)
    if(s.distance(t)<=30):
        turtle.write('游戏结束,蛇赢了')
        break
#设置不让画布关闭
screen.mainloop()

这个程序中,不单击屏幕键盘也可以操作海龟移动,因为蛇会自动移动,让键盘监听到了事件。

我们接下来自己思考如何设定难度分级和游戏得分吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值