本帖最后由 木子呢 于 2021-11-9 16:45 编辑
Mind+ Python编程入门系列课程—— 第三课 龟龟赛跑
一、学习背景 经过上节课的学习,我们已经进一步了解了 python语言以及海龟绘图,学习了python中的库 、对象、数据类型、算术运算符等知识,也学会了利用 turtle库中的函数来创建对象并实现模拟3D星空的效果。那么在本节课上,我们将进一步学习python知识,结合前两节课的内容创作一个更加有趣的实践项目。让我们拭目以待吧!
二、 学习目标 本实践项目通过编写 python程序来设计一个龟龟赛跑的小游戏。
知识目标: 1、理解 python中的 条件表达式
2、掌握多行注释、列表索引、while循环、if...else语句的使用方法
技能目标: 1、掌握在屏幕上创建文本输入窗口的方法
2、掌握设计龟龟赛跑游戏的方法
三、 学习准备 1、电脑
2、mind+编程软件
四、 学习实践 在本项目中,我们需要创建两个由浅入深的 python程序 ,使多个小海龟进行赛跑,并对其结果进行预测。
1、创建屏幕并猜测获胜的小海龟。
2、添加小海龟并设定游戏中小海龟赛跑规则。
任务 1:创建屏幕程序设计 在这个程序中,我们将创建一个屏幕并猜测小海龟赛跑的获胜者,通过它,我们可以复习 turtle库创建屏幕的方法 。为此,我们将分三步完成,首先是分析任务,之后进行程序的编写,最后运行程序并观察效果。
1、任务 分析 在这个任务中,我们首先需要创建一个屏幕对象,并设定好它的宽度、高度、屏幕标题、屏幕背景颜色。由于要猜测龟龟赛跑的获胜者,因此我们在屏幕上创建一个文本输入窗口。又由于各个小海龟是以颜色来区分的,因而我们在猜测时输入小海龟的颜色即可。同时,我们可将输入的猜测结果在终端界面中显示出来。
整体上,我们将采用顺序结构的方式编写程序。具体流程如下:
2、程序编写 在正式编写程序代码之前,我们首先要创建一个项目文件及 python程序文件。
STEP1:创建与保存项目文件
启动 Mind+,另存项目并命名为“龟龟赛跑”。
STEP2:创建与保存python文件
创建一个 python程序文件“任务一.py”,双击打开。
STEP3:编写程序
import turtle#导入turtle库
screen = turtle.Screen()#把turtle库中Screen()函数赋值给screen作为一个屏幕对象,后面都用screen来代表
width,height = 500,400#设置屏幕宽和高
screen.setup(width,height)#以指定宽和高创建屏幕
screen.title("龟龟赛跑")#设置屏幕标题
screen.bgcolor("black")#设置屏幕背景为黑
#通过screen对象提供的textinput()方法创建text输入界面,并将输入内容存放到变量中
userguess = screen.textinput(title="Make your guess", prompt="Which turtle will ? Enter a color:")
print(userguess)#打印出写入的内容
screen.exitonclick()#点击屏幕退出 复制代码
3、程序运行 STEP1:点击运行程序
我们看到弹出了一个标题为 “龟龟赛跑”的黑色屏幕以及一个标题为“Make your guess”的文 本 输入 窗口 , 提示我们输入颜色来猜测哪 只 小海龟将获胜。
STEP2:输入颜色,点击ok进行确认
这里,我们可以输入 “red”,“orange”,“yellow”,“green”,“blue”,“indigo”,“violet”七种颜色中的任意一个。
STEP3:观察终端显示
点击 ok键后就会在终端中打印出我们输入的颜色, 说明 我们成功告诉了计算机对于龟龟赛跑 结果的猜测。
对象链接
bgcolor () 方法
功能说明 bgcolor () 方法能设置屏幕的背景颜色
使用方法 屏幕 对象 . bgcolor ( “ color ” ) ,引号内为具体的颜色
举例说明 程序中, screen.bgcolor("black") , 表示 设置屏幕背景为黑色。
textinput ()方法
功能说明 textinput ()方法能 为用户 创建 一个 文本 输入窗口 。
使用方法 屏幕对象.textinput( title=“” , prompt=“” ) , 其中,title后的引号内写入窗口的标题,prompt后的引号内写入的是给用户的提示。这两个关键点是必不可少的。
举例说明 程序中, userguess = screen.textinput(title="Make your guess", prompt="Which turtle will ? Enter a color:") , 表示创建 一个 标题为“ Make your guess ”的文 本 输入 窗口 , 给用户的 提示内容为“ Which turtle will ? Enter a color: ” , 同时将用户后续输入的内容存放在变量userguess中。
任务 2:龟龟赛跑程序设计 在这个程序中,我们将在屏幕上添加不同颜色的小海龟,并设定龟龟赛跑的规则。这里,我们依旧将分三步创建程序。首先是分析任务,之后进行程序的编写,最后运行程序并观察效果。
1、任务分析 在上一个任务中,我们已经为小海龟们创建了一个竞跑的场地(屏幕),接下来我们将创建七个不同颜色的小海龟对象并设定好他们的起止点,之后设定赛跑的规则。
整体上,我们采用顺序结构的方式进行,流程图如下,
首先,我们创建一个空列表用于后续存放七个小海龟对象,由于小海龟之间仅存在颜色上的区别,因此,我们可再创建一个列表用于存放颜色。
之后我们以列表循环的方式创建海龟对象,在每一次循环中,选择一个颜色赋给创建的一个小海龟对象,使其移动到指定位置后存放入海龟列表中。其中,我们可以使每个小海龟的横坐标相同,纵坐标依次从下方开始递增,最终排成一列。流程图如下左图,效果如下右图,
接下来我们要判断比赛的开始与否,只有我们在输入窗口写入猜测的获胜者后再开始比赛。这里我们可以通过建一个变量来存放是否进行比赛的结果。这一部分我们通过单分支结构实现,流程图如下左图。
在进行比赛时,我们要设定海龟的移动及比赛结束的判定,当跑出右侧屏幕时我们就结束比赛,清空屏幕,并检测猜测的结果是否正确。
同时,为了确保每次获胜的小海龟不唯一,这里我们将小海龟每一步的移动距离设为随机。
由于比赛规则针对的是所有的小海龟,因此上述操作我们需要放在海龟列表中循环执行。
又因为比赛规则在进行赛跑时要始终成立,于是我们对于规则部分整体上使用条件循环编写,流程图如下左图。其中,获胜者检测部分可采用双分支结构实现,流程图如下右图,
2、程序编写 STEP1:创建与保存python文件
新建一个 python程序文件“任务二.py”,双击打开。
STEP2:编写程序
import turtle#导入turtle库
import random#导入随机数库
#创建屏幕
screen = turtle.Screen()#通过turtle库中Screen()函数创建一个屏幕作为一个对象并赋值给变量screen,后面都用screen来表示
width,height = 500,400 #设置屏幕宽和高
screen.setup(width,height)#以指定宽和高创建屏幕
screen.title("龟龟赛跑")#设置屏幕标题
screen.bgcolor("black")#设置屏幕背景为黑
#screen方法提供的text输入界面#将输入内容存放到变量中
userguess = screen.textinput(title="Make your guess", prompt="Which turtle will ? Enter a color:")
print(userguess)#打印出写入的内容
#创建海龟对象
colors=["red","orange","yellow","green","blue","indigo","violet"]#创建颜色存放在colors列表中
all_turtles=[]#创建空列表以保存海龟对象
for color in colors:#循环
t=turtle.Turtle(shape='turtle')#通过turtle库中的Turtle()函数创建一个海龟作为一个对象并赋值给t变量,后面都用t来表示
t.penup()#抬笔
t.fillcolor(color)#设定海龟颜色
#我们需要从屏幕的左边开始跑,所以一开始要把每只海龟放在最左边,X坐标大概-230,Y坐标从下-90往上30个坐标放一个
t.goto(-230,colors.index(color)*30-90)
all_turtles.append(t)#以列表中的颜色复制小海龟
#赛跑设定
race=False#进行比赛(否)
if userguess:#窗口已输入
race=True#进行比赛(是)
"""循环跑,每只海龟每次随机跑0-10的距离,直到一只海龟跑到终点边界,海龟本身的宽度是40,
所以到达边界的时候是 250-40/2=230,到达边界之后再执行清屏等操作"""
while race:
for turtle in all_turtles:#列表循环
if turtle.xcor() > 230:#跑出屏幕右侧
race = False#停止比赛
screen.clear()#清屏
screen.bgcolor("black")#设置屏幕背景为黑
winner_color=turtle.fillcolor()#存储获胜海龟的颜色
if winner_color == userguess:#如果猜对了
print(f"You've win! The {winner_color} turtle is the winner")#打印结果
else:#否则
print(f"You've lost! The {winner_color} turtle is the winner")#打印结果
rand_distance = random.randint(0,10)#每只海龟每次随机跑0-10的距离
turtle.forward(rand_distance)#设置前进距离
screen.delay(0)#延时设为0避免卡顿
screen.exitonclick()#点击屏幕退出 复制代码
3、程序运行
STEP1: 运行程序
在输入猜测的颜色并确认后,小海龟便开始跑起来,到达终点后则消失 。
STEP2:观察终端界面
在一只小海龟到达终点后,最终的竞猜结果就会在终端界面中显示出来。
知识链接
条件表达式
知识描述 这里的条件表达式,就是用来判断条件是否成立的语句,条件成立返回数值“1 ” ,表示真,条件不成立返回数值“0”,表示假。
知识积累
多行注释
功能说明 python中,并没有一个单独的多行注释标记,而是将跨行注释语句包含在一对三引号( ''' ...... ''' )或者("""......""")之间。对于这样的代码,解释器将忽略。由于这样的代码可以分为多行编写,所以也作为多行注释。
使用方法
"""
注释内容1
注释内容2
"""
举例说明 程序中,
"""循环跑,每只海龟每次随机跑0-10的距离,直到一只海龟跑到边界 , 海龟本身的宽度是40,
所以到达边界的时候是 250-40/2=230到达边界之后就清屏"""
表示 对后续程序的解释说明。
列表的索引
功能说明 index()函数用于从列表中找出某个值 ( 对象 ) 第一个匹配项的索引位置。
使用方法 列表.index(对象)
举例说明 程序中 , t.goto(-230,colors.index(color)*30-90) ,表示 在colors列表中找出第一个color对象的索引位置,并以此作为小海龟的纵坐标。这里,第一个小海龟的纵坐标为0*30-90,第二个为1*30-90,第三个为2*30-90,依次类推,最终将小海龟排成一列。
while 循环
功能说明 while循环又称为条件循环,是通过一个条件来控制是否要继续反复执行循环体中的语句。
流程图示意
使用方法
while < 条件表达式 >:
<循环体>
当条件表达式的返回值为真时,则重复执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。
举例说明 平时在学校中上课时,直到下课铃声响起我们才会下课,否则铃声未响我们就一直上课。这里,“下课铃声未响起”就是条件表达式,“上课”的就是循环体。
程序中, while race: , 其中race有True和False两种值,当race返回的值为True,则表示条件成立,执行后续循环体中龟龟赛跑规则的设定,当race返回的值为假时则不执行循环。
i f ...else 语句
功能说明 if...else语句体现的是python程序控制结构中的双分支结构,用于进行只有两种情况下的条件判断,if表示“如果”,else表示“否则”,如果满足条件则执行 <语句块1> ,否则执行 <语句块2> 。
流程示意图
[size=9.0000pt] 使用方法
if <条件表达式>:
<语句块1>
else:
<语句块2>
这里的语句块1是条件成立时执行的操作,语句块2是条件不成立时要执行的操作。 值得注意的是要在“if”和“else”的语句后添加冒号。
举例说明 程序中,
if winner_color == userguess: #如果猜对了
print(f"You've win! The {winner_color} turtle is the winner")#打印文字
else:
print(f"You've lost! The {winner_color} turtle is the winner")#打印文字
表示如果获胜的小海龟与猜测结果一致,就打印输出猜对了,否则打印输出猜错了。
格式化字符串
功能说明 python的print输出字符串前面加f表示格式化字符串,加f后可以在字符串里面使用“{}”括起来的变量和表达式,。
使用方法 print(f“{变量}”)
举例说明 程序中, print(f"You've win! The {winner_color} turtle is the winner") ,加了“f”后,可以将变量“ winner_color ”中存储的获胜小海龟的颜色打印出来。
对象链接
clear () 方法
功能说明 c lear() 方法能 清空屏幕
使用方法 屏幕 对象 . clear ()
举例说明 程序中, screen.clear() , 表示 将屏幕上的内容清空掉 。
乐一乐
至此,龟龟赛跑小游戏的项目我们就完成啦,赶紧拉上小伙伴一起来试一试吧,看看大家需要多少次才能猜中小海龟的获胜者呢?
五、巩固提高
项目回顾 本节课我们利用海龟绘图 turtle库,创建了一个屏幕 及七个不同颜色的小海龟,之后设置比赛的起止点及规则,设计出了一个龟龟赛跑的小游戏。
知识小结 程序
条件表达式、多行注释、列表的索引、while循环、if...else语句
项目拓展 利用本节课设计的龟龟赛跑小游戏,想一想,如何优化才能提高我们猜测的命中率呢?当猜测正确时,我们是否可以给它添加一些有趣的彩蛋(比如清屏后绘制一个五角星)呢?让我们自己来设计一下吧!
附录 附录 1拓展任务参考 程序 ( 提高猜测准确率 +彩蛋功效 )
import turtle#导入turtle库
import random#导入随机数库
#创建屏幕
screen = turtle.Screen()#通过turtle库中Screen()函数创建一个屏幕作为一个对象并赋值给变量screen,后面都用screen来表示
width,height = 500,400 #设置屏幕宽和高
screen.setup(width,height)#以指定宽和高创建屏幕
screen.title("龟龟赛跑")#设置屏幕标题
screen.bgcolor("black")#设置屏幕背景为黑
#screen方法提供的text输入界面#将输入内容存放到变量中
userguess = screen.textinput(title="Make your guess", prompt="Which turtle will ? Enter a color:")
print(userguess)#打印出写入的内容
#创建海龟对象
colors=["red","green","blue"]#创建颜色存放在colors列表中
all_turtles=[]#创建空列表以保存海龟对象
for color in colors:#循环
t=turtle.Turtle(shape='turtle')#通过turtle库中的Turtle()函数创建一个海龟作为一个对象并赋值给t变量,后面都用t来表示
t.penup()#抬笔
t.fillcolor(color)#设定海龟颜色
#我们需要从屏幕的左边开始跑,所以一开始要把每只海龟放在最左边,X坐标大概-230,Y坐标从下-90往上30个坐标放一个
t.goto(-230,colors.index(color)*30-90)
all_turtles.append(t)#以列表中的颜色复制小海龟
#赛跑设定
race=False#进行比赛(否)
if userguess:#窗口已输入
race=True#进行比赛(是)
"""循环跑,每只海龟每次随机跑0-10的距离,直到一只海龟跑到终点边界,海龟本身的宽度是40,
所以到达边界的时候是 250-40/2=230,到达边界之后再执行清屏等操作"""
while race:
for turtle in all_turtles:
if turtle.xcor() > 230:#跑出屏幕右侧
race = False#停止比赛
screen.clear()#清屏
screen.bgcolor("black")#设置屏幕背景为黑
winner_color=turtle.fillcolor()#存储获胜海龟的颜色
if winner_color == userguess:#如果猜对了
print(f"You've win! The {winner_color} turtle is the winner")#打印结果
turtle.penup()#抬笔,画笔移动时不绘制图形
turtle.goto(-50,0)#移动到(-50,0)坐标位
turtle.pendown()#落笔,画笔移动时绘制图形
turtle.speed(10)#设置画笔速度
turtle.begin_fill()#开始填充
turtle.pencolor('red')#设置画笔颜色为红色
turtle.fillcolor('yellow')#设置填充颜色为黄色
#绘制过程
for i in range(5):#循环五次
turtle.forward(120)#前进120像素
turtle.right(144)#右转144度
turtle.end_fill()#填充完毕
turtle.hideturtle()#隐藏海龟画笔
else:#否则
print(f"You've lost! The {winner_color} turtle is the winner")#打印结果
rand_distance = random.randint(0,10)#每只海龟每次随机跑0-10的距离
turtle.forward(rand_distance)#设置前进距离
screen.delay(0)#延时设为0避免卡顿
screen.exitonclick()#点击屏幕退出 复制代码