221浏览
查看: 221|回复: 2

Mind+Python turtle 课程——06 小海龟走迷宫

[复制链接]
本帖最后由 木子呢 于 2021-9-16 18:24 编辑

第六课 小海龟走迷宫


功能介绍
经过前面课程的学习,我们已经学会了利用turtle库的Screen函数创建出一个炫酷的3D星空学会了随机数函数、if语句、while循环等知识的运用。在这节课,我们将在屏幕的基础上添加鼠标外设,首先我们先添加迷宫背景及起始点,之后实现鼠标控制小海龟走出迷宫的功能。课程会分为两个任务的形式进行,下表为课程任务及涉及到的知识点。

实现功能
知识点
任务一:添加迷宫背景及起止点
turtle库基础函数使用
任务二:添加鼠标控制功能
布尔类型、条件判断、鼠标控制函数的使用、逻辑运算符的使用

景图片下载:
链接:https://pan.baidu.com/s/1NkWgpmbwwixKAr5miJuwfA
提取码:lxdb
项目实践
任务一:添加迷宫背景及起止点
1、任务分析
在上节课的学习内容中,我们学会了通过Screen()创建一个炫彩的3星空这节课,我们首先将回顾一下Screen()函数的用法,创建一个指定宽度和高度的背景屏幕,之后在屏幕上导入迷宫图并绘制出小海龟及起止点。

2、编写程序
代码如下:
from turtle import *#导入turtle库中所有工具
#绘制背景------------------------------------------
screen = Screen()#赋值screen对象
width,height = 800,720#设定宽度和高度
screen.setup(width,height)#以设定好的宽度和高度来创建屏幕
screen.title("小海龟走迷宫")#设定屏幕标题
screen.bgcolor("white")#设定屏幕背景色
screen.bgpic('迷宫4.gif')#添加迷宫背景图
screen.delay(0)#这里要设延时为0,否则很卡
#绘制海龟------------------------------------------
t = Turtle('turtle')#创建一个海龟
t.shapesize(0.8)#设定海龟尺寸大小
t.speed(0)#设定海龟速度为最大
t.color('blue')#设定海龟颜色为蓝色
t.penup()#抬笔
t.goto(0,0)#使海龟移动到指定位置作为起点
t.write("起点",font=('微软雅黑', 14, 'normal'))#设定海龟所在为起点
#绘制终点------------------------------------------
yuan = Turtle('circle')#创建一个圆作为终点标志
yuan.shapesize(0.7)#设定圆的尺寸大小[size=12.0000pt],默认值的0.7倍
yuan.color('red')#设定圆的颜色为红色
yuan.penup()#抬笔
yuan.goto(-300,120)#使圆移动到指定位置[size=12.0000pt],作为迷宫的终点
yuan.write("终点",font=('微软雅黑', 14, 'normal'))#添加终点标记
done()#用来停止画笔绘制,但绘图窗体不关闭
3、运行效果
运行此段程序,我们可以看到弹出了一个迷宫背景的屏幕,屏幕的中心位置是迷宫的起点,一只蓝色的小海龟蓄势待发,而屏幕的左侧道路交汇处则是我们的终点。

图片1.png
4、代码释义
4.1turtle库中各类Turtle()函数的使用

#绘制海龟------------------------------------------
t = Turtle('turtle')#创建一个海龟
t.shapesize(0.8)#设定海龟尺寸大小
t.speed(0)#设定海龟速度为最大
t.color('blue')#设定海龟颜色为蓝色
t.write("起点",font=('微软雅黑',[size=12.0000pt] 14,[size=12.0000pt] 'normal'))#设定海龟所在为起点
#绘制终点------------------------------------------
yuan = Turtle('circle')#创建一个圆作为终点标志
yuan.shapesize(0.7)#设定圆的尺寸大小
yuan.color('red')#设定圆的颜色为红色
yuan.penup()#抬笔
yuan.goto(-300,120)#使圆移动到指定位置
yuan.write("终点",font=('微软雅黑', 14, 'normal'))#添加终点标记

4.1.1代码解释

程序中,t和yuan是我们新创建的两个变量,而Turtle()命令我们可以理解为turtle库中的函数。在这里,我们将Turtle()函数创建的海龟赋值给变量t,后面的Turtle()都用t来表示,而将创建的圆赋值给变量yuan,后面的相关操作都用yuan来表示。之后我们使用turtle自带的函数库实现相应的功能,具体的实现过程如下:
① 使用shapesize()命令设定海龟和圆的尺寸大小
② 使用color()命令设定颜色
③ 使用speed()命令设定移动速度
④ 使用penup()命令设定抬笔
⑤ 使用goto()命令来移动到指定位置
⑥ 最后使用write()命令来书写的文字。

4.1.2使用方法

t = Turtle('turtle')#创建一个海龟
yuan = Turtle('circle')#创建一个圆作为终点标志

通过Turtle()函数,我们能创建各种不同的形状,当然,这些形状是在我们的turtle库中已有的,我们只是通过Turtle()函数将它调用出来而已。Turtle()函数使用格式如下:t= Turtle('shape')

其中,t是我们新建的变量,用来存放后续创建的形状。单引号内的“shape”表示各种不同的形状,比如在单引号内输入“turtle”,就可以创建一个海龟形状,输入“circle”,就可以创建一个圆出来。

4.1.3注意事项

通过Turtle()函数创建的形状,我们依然可以把它当作画笔,它仍然具有画笔的基础功能,比如移动到指定位置,提笔,设定移动速度等。同时,我们还可以设定它的尺寸大小,颜色等。在使用时有些细节需要注意:

t.shapesize(0.8)#设定海龟尺寸大小
yuan.shapesize(0.7)#设定圆的尺寸大小

之前我们已经将通过Turtle()函数创建的形状存放到变量中,因此,这里我们只要以“变量.shapesize(number)”的格式来设定尺寸大小即可。这里的number表示一个具体的数字,比如:“变量.shapesize(1)”表示设定形状为默认大小,比如:“变量.shapesize(0.5)”表示设定形状为默认大小的一半。

t.color('blue')#设定海龟颜色为蓝色
yuan.color('red')#设定圆的颜色为红色

这里,我们可以通过“变量.color(‘colour’)”的形式来设定图形的颜色,单引号内的“colour”就指代了各种颜色,比如:“变量.color(‘red’)”表示设定图形的颜色为红色,比如:“变量.color(‘blue’)”表示设定图形的颜色为蓝色。

t.write("起点",font=('微软雅黑',[size=12.0000pt] 14,[size=12.0000pt] 'normal'))#设定海龟所在为起点
yuan.write("终点",font=('微软雅黑', 14, 'normal'))#添加终点标记

这里,我们通过“变量.write(“comment”,font=('字体颜色', 字体大小, '字体规格'))”的形式来设定书写的内容及属性。其中,双引号内的“comment”表示书写的具体文字内容,而单引号内输入的分别是字体的颜色,大小和规格。比如:
变量.write("起点",font=('微软雅黑', 14, 'normal'))表示书写的文字内容为“起点”,字体为微软雅黑,字号为14,规格为正常体。

任务二:鼠标控制小海龟走迷宫
1、任务分析

经过任务一的学习,我们已经绘制出了一个白色屏幕并导入了迷宫的背景图及起止点。那么接下来让我们尝试通过鼠标来控制小海龟走出迷宫吧!在此之前我们需要了解电脑窗口、画布和坐标的关系。如下图:

图片2.png

假设我们现在鼠标所在的位置是图中的(x,y)坐标,那么我们该如何获得这个的坐标值呢?
首先我们是可以通过计算机很容易的获取鼠标在屏幕上的坐标,只要调用相关函数就好,我们假设获取的坐标值为(mx,my)。

图片3.png

其次我们还可以通过计算机获取画布到计算机屏幕最左边的距离和画布到计算机屏幕最上边的距离,分别设为rxry(注意画布的边框宽度是2)。

图片4.png

之后通过计算我们可以获得鼠标和画布的距离值分别为bxby

图片5.png

bx=mx-rx-2
by=my-rx-2
最后我们假设画布的宽为width,高为height,然后用计算得到的bx减去画布宽值的一半从而得到画布中x坐标,用画布高值的一半减去by从而得到画布中y的坐标。

图片6.png

X=bx - screen.window_width() //2
Y=screen.window_height() //2 - by
2、编写程序
代码如下:

from turtle import *#导入turtle库中所有工具
#绘制背景------------------------------------------
screen = Screen()#赋值screen对象
width,height = 800,720#设定宽度和高度
screen.setup(width,height)#以设定好的宽度和高度来创建屏幕
screen.title("小海龟走迷宫")#设定屏幕标题
screen.bgcolor("white")#设定屏幕背景色
screen.bgpic('迷宫4.gif')#添加迷宫背景图
screen.delay(0)#这里要设延时为0,否则很卡
#绘制起点------------------------------------------
t = Turtle('turtle')#创建一个海龟
t.shapesize(0.8)#设定海龟尺寸大小
t.speed(0)#设定海龟速度为最大
t.color('blue')#设定海龟颜色为蓝色
t.penup()#抬笔
t.goto(0,0)#使海龟移动到指定位置作为起点
t.write("起点",font=('微软雅黑', 14, 'normal'))#设定海龟所在为起点
#绘制终点------------------------------------------
yuan = Turtle('circle')#创建一个圆作为终点标志
yuan.shapesize(0.7)#设定圆的尺寸大小
yuan.color('red')#设定圆的颜色为红色
yuan.penup()#抬笔
yuan.goto(-300,120)#使圆移动到指定位置[size=12.0000pt],作为迷宫的终点
yuan.write("终点",font=('微软雅黑', 14, 'normal'))#添加终点标记
#    """获取鼠标指针的坐标"""
root = screen._root#获取根窗口对象
cv = screen._canvas#获取画布对象
while True:#永久循环
    mx = root.winfo_pointerx()#鼠标指针相对于计算机屏幕的x坐标
    my = root.winfo_pointery()#鼠标指针相对于计算机屏幕的y坐标
[size=12.0000pt]
    rx = cv.winfo_rootx()#画布到计算机屏幕最左边距离
    ry = cv.winfo_rooty()#画布到计算机屏幕最上边距离
    bx = mx - rx - 2#画布边框宽度是2,所以要减去2
    by = my - ry - 2#画布边框高度是2,所以要减去2

    x = bx - screen.window_width() //2#转换成在海龟画图坐标系中x坐标
    y = screen.window_height() //2 - by#转换成在海龟画图坐标系中y坐标
[size=12.0000pt]
    if x>=-300 and x<=-290 and y<=120 and y>=110:#如果海龟到了终点侧
        yuan.write("      到啦",font=('微软雅黑', 14, 'normal'))#提示到达
        done()#用来停止画笔绘制,但绘图窗体不关闭
    else:#否则
        t.goto(x,y)#使海龟移动到指定坐标
        #screen.update()#刷新屏幕显示
    if x>=0 and x<=10 and y>=0 and y<=10:#如果海龟到了起点
        t.pendown()
        t.write("      可以开始啦",font=('微软雅黑', 14, 'normal'))#提示到达
3、运行效果

点击运行程序,我们首先将鼠标放到中间起点位置时会弹出“可以开始啦”,之后移动鼠标生成海龟移动路线图,当小海龟到达终点时也会弹出提示“终点到啦”。让我们试一试找出最短达到终点的线路吧!

图片7.png

代码中其它的内容我们就不一一介绍了,我们主要介绍一些之前没有用过的函数及内容,主要涉及布尔类型的使用、键盘控制函数的使用以及if.......else.......判读语句和逻辑判断语句的使用。

4、代码释义
4.1代码中布尔类型的使用

while[size=12.0000pt] True:#永久循环

4.1.1代码释义
在上节课的内容中,我们使用while 1”的形式来表示永久循环,这里我们通过另一种形式“while True”来表示。之前提过,while循环中的条件表达式,是用来判断条件是否成立的语句,条件成立返回数值“1,表示真,条件不成立返回数值“0”,表示假。这里,我们同样也省略了表达式,用关键字True直接来表示返回值始终为真。这也是我们常见的可以用来表示永久循环的一种方法。

4.1.2什么是布尔类型
布尔类型是基本数据类型的一种,主要用来表示真或假的值。在python中,关键字True和False就是两个布尔值。前者表示真,后者表示假。Python中的布尔值也可以转换为数值,其中True表示1,而False表示0。

4.1.3什么是基本数据类型
python中,我们编写的代码程序都是数据,为了便于计算机识别,我们将存储在python中的数据划分为多种类型。例如,常用的数字类型有“13”,“250”。布尔类型“true”,“false”。字符串类型“aaaa”,“hello world”等。

4.2代码中键盘函数的使用

[size=12.0000pt]root[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] screen._root#获取窗口对象
cv[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] screen._canvas#获取画布对象
while[size=12.0000pt] True:#永久循环
    m[size=12.0000pt]x[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] root.winfo_pointerx()#鼠标指针相对于计算机屏幕的x坐标
    m[size=12.0000pt]y[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] root.winfo_pointery()#鼠标指针相对于计算机屏幕的y坐标
    rx[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] cv.winfo_rootx()#画布到计算机屏幕最左边距离
    ry[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] cv.winfo_rooty()#画布到计算机屏幕最上边距离
    b[size=12.0000pt]x[size=12.0000pt] [size=12.0000pt]= m[size=12.0000pt]x[size=12.0000pt] [size=12.0000pt]-[size=12.0000pt] rx[size=12.0000pt] [size=12.0000pt]-[size=12.0000pt] [size=12.0000pt]2#画布边框宽度是2,所以要减去2
    b[size=12.0000pt]y[size=12.0000pt] [size=12.0000pt]= m[size=12.0000pt]y[size=12.0000pt] [size=12.0000pt]-[size=12.0000pt] ry[size=12.0000pt] [size=12.0000pt]-[size=12.0000pt] [size=12.0000pt]2#画布边框高度是2,所以要减去2
    [size=12.0000pt]x[size=12.0000pt] [size=12.0000pt]= b[size=12.0000pt]x[size=12.0000pt] [size=12.0000pt]-[size=12.0000pt] screen.window_width()[size=12.0000pt] //2#转换成在海龟画图坐标系中x坐标
    [size=12.0000pt]y[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] screen.window_height()[size=12.0000pt] //2[size=12.0000pt] [size=12.0000pt]- b[size=12.0000pt]y#转换成在海龟画图坐标系中y坐标

调用screen()库中的方法来获取窗口对象和画布对象,在程序运行过程中不断的获取鼠标指针相对于计算机屏幕的坐标变化。

4.3代码中if...else语句的使用

if x>=-300 and x<=-290 and y<=120 and y>=110:#如果海龟到了终点侧
        yuan.write("      到啦",font=('微软雅黑', 14, 'normal'))#提示到达
        done()#用来停止画笔绘制,但绘图窗体不关闭
else:#否则
        t.goto(x,y)#使海龟移动到指定坐标
if x>=0 and x<=5 and y>=0 and y<=5:#如果海龟到了起点
        t.pendown()#落笔
        t.write("      可以开始啦",font=('微软雅黑', 14, 'normal'))#提示到达

4.3.1代码解释
这里我们利用if...else语句来判断小海龟是否走出了迷宫达到终点,再用一个if语句判断小海龟是否从起点开始,因为起点和终点的坐标分别为(0,0)和(-300,120),所以我们判断时只需给出一个合适的范围即可作为判断条件,此程序中我们选择x轴坐标在-290到-300,y轴坐标在110到120作为终点的标准。选择x轴坐标在0到5,y轴坐标也在0到5作为起点的标准。当然以上数据都可以按照时间情况进行修改。如果小海龟到达了终点,那么我们就让小海龟停下来并书写语言提示。而如果小海龟未到终点,我们就使小海龟继续随着鼠标移动。另一个if语句是判断海龟是否从起点出发,如果是就开始留下行迹路径。

4.3.2if与if...else条件判断语句的区别
if语句与if...else语句都是条件判断语句,在上节课我们已经了解了if语句的使用,在需要进行判断的情况只有一个时,我们使用if语句,而当遇到只能二选一的条件时,我们就要使用if...else语句来实现了。这里if表示如果,else表示否则。我们还是举几个生活中常见的例子:

1. 如果闹钟响了,我们就起床;否则,我们继续睡觉。
2. 如果下课铃声响了,我们就下课;否则,我们继续上课。
3. 如果输入的用户名和密码正确,提示登录成功;否则,提示密码错误。
以上例子中,“如果”和“否则”就是相对立的两种情况。

4.3.3if...else语句使用方法
if 条件表达式:
    语句块
else:
    语句块

图片8.png
if...else 语句的执行流程图

这里的条件表达式就是要进行判断的条件,而语句块则是满足条件后要进行的操作。

4.3.4 and逻辑运算符

if x>=-300 and x<=-290 and y<=120 and y>=110:#如果海龟到了终点侧
......
if x>=0 and x<=5 and y>=0 and y<=5:#如果海龟到了起点
......
辑运算符的作用是把语句连接成更复杂的复杂语句。程序中我们使用多个and连接多个判断条件,只有他们都为真是才能执行判断条件内的语句。例如,假设有两个逻辑命题,分别是“正在下雨”和“我在屋里”,我们可以将它们组成复杂命题“正在下雨,并且我在屋里,只有两个条件都为真时,命题才为真。

逻辑运算符表格
例子
名称
结果
a and b
And(逻辑与

如果 a 与 b 都为true,结果为true。当其中一个为false时,结果为false
A or b
Or(逻辑或)

只有当两个同时为false,结果为false,否则结果为true
!a
Not(逻辑非)
如果a不为true,结果为true
项目小结
本节课我们通过turtle库的Screen函数Turtle函数创建了一个迷宫及小海龟,之后借助鼠标移动来控制我们的小海龟走出了迷宫。通过这个项目,我们进一步熟悉了turtle绘图工具的使用,也学习了基本数据类型布尔类型、if...else条件判断语句和逻辑运算符的使用。那么在这节课学习的基础上,结合鼠标的控制,想一想,除了移动鼠标控制小海龟外,我们还能有什么方式控制小海龟走迷宫呢?

项目扩展
结合turtle库的exitonclick()函数的使用原理,尝试通过单机鼠标来控制小海龟走出迷宫吧!你觉得鼠标移动控制与单机控制哪种方式更舒服呢?

参考程序
from[size=12.0000pt] turtle[size=12.0000pt] import[size=12.0000pt] [size=12.0000pt]*#导入turtle库中所有工具
#绘制背景------------------------------------------
[size=12.0000pt]screen[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] Screen()#赋值screen对象
width,height[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] 800,720#设定宽度和高度
screen.setup(width,height)#以设定好的宽度和高度来创建屏幕
screen.title("小海龟走迷宫")#设定屏幕标题
screen.bgcolor("white")#设定屏幕背景色
screen.bgpic('迷宫4.gif')#添加迷宫背景图
screen.delay(0)#这里要设延时为0,否则很卡
#绘制起点------------------------------------------
[size=12.0000pt]t[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] Turtle('turtle')#创建一个海龟
t.shapesize(0.8)#设定海龟的尺寸大小
t.speed(0)#设定海龟速度为最大
t.color('black')#设定海龟颜色为黑
t.write("起点",font=('微软雅黑', 14, 'normal'))#设定海龟所在为起点
#绘制终点------------------------------------------
yuan[size=12.0000pt] [size=12.0000pt]=[size=12.0000pt] Turtle('circle')#创建一个圆作为终点
yuan.shapesize(0.7)#设定圆的尺寸大小
yuan.color('red')#设定圆的颜色为红色
yuan.penup()#抬笔
yuan.goto(-300,120)#使圆移动到指定位置
yuan.write("终点",font=('微软雅黑',[size=12.0000pt] 14,[size=12.0000pt] 'normal'))#添加终点标记
screen.onclick(t.goto)#使海龟移动到鼠标左键单机处
done()#用来停止画笔绘制,但绘图窗体不关闭
参考效果
图片9.png

附件:
6、小海龟走迷宫.rar (2.59 MB, 下载次数: 10)

追梦的少年  中级技师

发表于 2021-9-19 07:24:14

6666666666
回复

使用道具 举报

清晨微风  学徒

发表于 2021-9-22 14:32:50

创意十足
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail