本帖最后由 木子呢 于 2021-4-28 11:58 编辑
Python编程入门系列课程——第二课 模拟星空
一、学习背景
经过上节课的学习,我们已经了解了python语言以及海龟绘图,学习了python中的库、注释、变量、函数等知识,也学会了利用turtle库中的各个函数来绘制五角星。那么在本节课上,我们将进一步学习python知识,并做一个更加有趣的实践项目。让我们拭目以待吧!
二、学习目标
本实践项目通过编写python程序来模拟一个动态的星空。
知识目标:1、理解python中的对象、循环结构 2、掌握python中常见的数据类型、算术运算符以及比较运算符 3、掌握for循环、if语句、常见随机数函数的使用方法
技能目标:1、掌握使用turtle库中的Screen()函数创建屏幕的方法 2、掌握使用turtle库中的Turtle()函数创建星星并使其飘动的方法
三、学习准备
1、电脑 2、mind+编程软件
四、学习实践
在本项目中,我们需要创建三个层层递进,由浅入深的python程序。并在最终实现模拟动态星空的效果。 1、创建一个带背景图片的屏幕。 2、在屏幕上添加星星。 3、使星星飘动起来,模拟出动态星空的效果。
任务1:创建屏幕程序设计在这个程序中,我们将创建一个带背景图片的屏幕,通过它,我们可以了解turtle库创建屏幕的方法。为此,我们将分三步完成,首先是分析任务,之后进行程序的编写,最后运行程序并观察效果。
1、任务分析在这个任务中,我们需要创建一个屏幕并导入一张浩瀚银河的图片作为背景,为后续添加星星作准备。首先,我们需要创建一个屏幕对象,之后为屏幕对象设定好相应的宽度、高度、屏幕标题、屏幕背景和屏幕延迟。这里,我们所设定的屏幕的宽和高要适中,屏幕标题和背景图片要能体现星空的主题性。 整体上,我们将采用顺序结构的方式编写程序。具体流程如下,
2、程序编写在正式编写程序代码之前,我们首先要创建一个项目文件及python程序文件。 STEP1:创建与保存项目文件 启动Mind+,另存项目并命名为“模拟星空”。 STEP2:创建与保存python文件 创建一个python程序文件“任务一.py”,双击打开。
STEP3:编写程序
- import turtle#导入turtle库
- screen = turtle.Screen()#通过turtle库中Screen()函数创建一个屏幕作为一个对象并赋值给变量screen,后面都用screen来表示
- width,height = 700,500#设定宽度和高度
- screen.setup(width,height)#以设定好的宽高来创建屏幕实体
- screen.title("模拟3D星空")#设定屏幕标题
- screen.bgpic('浩瀚银河.gif')#添加背景图
- screen.delay(0)#屏幕延迟,设为0避免卡顿
- screen.exitonclick()#点击退出屏幕
复制代码
3、程序运行运行程序,我们看到:弹出了一个标题为“模拟3D星空”的屏幕,屏幕的背景是一幅浩瀚银河图。(导入图片的具体步骤见附录1)
知识链接 | 对象 知识描述 对象是一个抽象的概念,英文称作“object”,表示任何存在的事物。 通常对象可以被划分为两个部分即静态部分和动态部分,静态部分被称为“属性”,任何对象都具备客观存在且不可忽略的自身属性,如一个人的性别。动态部分称为“方法”,指的是对象的行为,即对象执行的动作,如人可以行走、睡觉。 在python中,一切皆为对象,即不仅是具体的事物称之为对象,字符串、库等也都是对象。 | 数据类型 知识描述 python中的数据按照其本身的特征可以分为若干种不同的类型,比如整型、浮点型、字符串型等。整型和数学中的整数概念一致,包括正整数、负整数和零。浮点型与数学中的实数概念一致,表示带小数的类型。字符串型是字符的序列表示,由一对引号构成(单引号或双引号),可以通过索引访问字符串中的特定位置的字符。 知识实例 程序中,width,height = 700,500,这里的“700”、“500”,就是整型。而screen.title("模拟3D星空"),这里双引号内的文字就是字符串型。 |
知识积累 | 对象的创建 功能说明 在python中,对象可以通过库中的一些函数来创建。 使用方法 库名称.函数名() 举例说明 程序中,screen = turtle.Screen(),表示通过turtle库中的Screen()函数创建了一个屏幕对象并命名为screen。 | 对象的使用 功能说明 创建好对象后,我们可以使用其相应的属性和方法。每个对象都有许多方法,每个不同的方法能实现不同的功能效果。 使用方法 对象.方法名(),对象.属性名() 举例说明 程序中,screen.title(),表示使用屏幕对象screen的title方法,又screen.bgpic(),表示使用屏幕对象screen的bgpic方法。 |
Turtle链接 | Screen()函数 功能说明 turtle库中的Screen()函数能创建屏幕对象。 使用方法 turtle.Screen() 举例说明 程序中,screen = turtle.Screen(),表示通过turtle库中Screen()函数创建一个屏幕作为一个对象并赋值给变量screen,后面都用screen来表示。 |
对象链接 | setup()方法 功能说明 setup()方法能创建指定宽度和高度的屏幕实体 使用方法 屏幕对象.setup(宽度,高度) 举例说明 程序中,screen.setup(700,500),表示创建宽为700,高为500的屏幕。 | title()方法 功能说明 title()方法能设置屏幕的标题 使用方法 屏幕对象.title(“标题内容”) 举例说明 程序中,screen.title("模拟3D星空"),表示设定屏幕的标题为“模拟3D星空”。 | bgpic()方法 功能说明 bgpic()方法能给屏幕添加背景图片 使用方法 导入图片的具体步骤见附录1 举例说明 程序中,screen.bgpic('浩瀚银河.gif'),表示导入了一张名为“浩瀚银河”、格式为“GIF”的图片作为屏幕背景。 | delay()方法 功能说明 delay()方法能给屏幕设定延迟效果 使用方法 屏幕对象.delay(延迟值),延迟值的以毫秒为单位 举例说明 程序中,screen.delay(0),表示为屏幕设定绘画延迟,设为0能避免卡顿。 | exitonclick()方法 功能说明 exitonclick()方法可以实现点击屏幕任意位置退出的效果 使用方法 屏幕对象.exitonclick() 举例说明 程序中,screen.exitonclick(),表示点击退出屏幕。 |
|
| 任务2:添加星星程序设计在这个程序中,我们将在屏幕的右侧随机添加一个个小星星。这里,我们将分三步创建程序。首先是分析任务,之后进行程序的编写,最后运行程序并观察效果。
1、任务分析在上一个任务中,我们已经创建了一个银河背景的屏幕,这里,我们需要在屏幕右侧添加一个个星星并使其随机出现在屏幕的右侧,为后续设定星星的飘动作准备。 由于距离遥远星星在夜空中显得非常小,因此,我们只需创建一个形状尺寸非常小的圆对象来表示星星即可,并设定好它的颜色与位置。又由于星星在夜空中的数量非常庞大,因此,我们需再创建一个星空列表并将星星不停得克隆复制200次,存放到星空列表中。
整体上,我们依旧将采用顺序结构的方式编写程序。具体流程如下,
对于其中扩充星星并存放到星空列表中这一部分,我们将采用循环结构的方式来编写程序,如下,
2、程序编写STEP1:创建与保存python文件 新建一个python程序文件“任务二.py”,双击打开。 STEP2:编写程序 - import turtle#导入turtle库
- from random import random,randint#导入随机数函数
- #创建屏幕
- screen = turtle.Screen()#通过turtle库中Screen()函数创建一个屏幕作为一个#对象并赋值给变量screen,后面都用screen来表示
- width,height = 700,500#设定宽度和高度
- screen.setup(width,height)#以设定好的宽和高来创建屏幕实体
- screen.title("模拟3D星空")#设定屏幕标题
- screen.bgpic('浩瀚银河.gif')#添加背景图
- screen.delay(0)#屏幕延迟,设为0避免卡顿
- #创建星星对象
- t = turtle.Turtle(visible = False,shape='circle')#通过turtle库中Turtle()函数#创建一个圆作为一个对象并赋值给变量t且隐藏,后面都用t来表示
- t.pencolor("white")#设置画笔颜色
- t.fillcolor("blue")#设置填充颜色
- t.penup()#抬笔
- t.goto(width/2,randint(-height/2,height/2))#到屏幕右侧随机位置
- stars = []#创建星空列表
- for s in range(200):#进行200次循环
- star = t.clone()#复制圆作为星星
- s =random()/3#尺寸
- star.shapesize(s,s)#设置星星形状尺寸
- star.speed(int(s*10))#设置星星移动速度
- star.setx(width/2 + randint(1,width))#设置星星的x坐标在屏幕右侧
- star.sety(randint(-height/2,height/2))#设置星星的y坐标在屏幕范围内
- star.showturtle()#显示星星
- stars.append(star)#在星空列表中扩充星星
- screen.exitonclick()#点击退出屏幕
复制代码
3、程序运行运行程序,我们看到:弹出一个屏幕,背景是一副银河图,但是并没有看到一个个小星星,这是为什么呢?事实上,因为我们的星星是设置在屏幕的右侧,因此,我们需要手动拉宽屏幕才能看到,效果如图:
知识链接 | 数据类型 知识描述 除了整型、浮点型、字符串型之外,python中还有布尔型和列表两种数据类型。 布尔型是一种表示逻辑值的简单类型,它的值只能是真(True)或假(False)。 python中的列表就好比听音乐时记录音乐名称的歌曲列表,它由一系列按特定顺序排列的元素组成。列表类似于变量,可以有自己的名称,还能存储整数、实数、字符串等任何类型的元素,并且同一个列表中,元素的类型可以不同。形式上,列表用方括号“[]”括起来,并用逗号分割其中的元素对象,若无任何元素则表示空列表。我们也可以对列表中的元素进行添加、修改、删除等操作,具体方法我们将在后续学习。 知识实例 程序中,visible = False,这里的False就是布尔值中的假。 又stars = [],表示创建一个名为stars的空列表。 | 算术运算符 知识描述 算术运算符是指python中用来进行数的数学运算的符号。比如,“+”表示加、“-”表示减、“*”表示乘、“/”表示除,“%”表示取余,“//”表示整除,“**”表示幂。同时,算术运算符的使用优先级也和数学中一样,详细内容可查看附录3。 知识实例 程序中,star.setx(width/2 + randint(1,width)),表示将星星的x坐标设定在屏幕右侧,其中“+”表示加,“/”表示除,又star.speed(int(s*10))中,“*”表示乘。 | 循环结构 知识描述 python中的循环结构是一种十分重要的程序控制结构,其特点是在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。在python程序中,主要有两种循环结构的语句:for循环语句和while循环语句。这两种循环我们将在后续的课程中再详细介绍。 流程示意图 | 遍历 知识描述 遍历是指根据数据之间的逻辑结构,遵循一定的顺序,依次对数据的所有元素做一次且仅做一次访问。 |
知识积累 | 指定库函数的导入 功能说明 导入库文件中指定的函数以便后续使用 使用方法 from 库名称 import 函数名,同时导入多个函数时可用逗号分隔开,而如果使用“*”代替具体的函数名,则表示导入库中的所有函数 举例说明 程序中,from random import random,randint表示导入随机数random库中的random()函数和randint()函数 | for循环 功能说明 for循环语句是通过遍历某一序列对象来构建循环,循环结束的条件就是对象遍历完成 流程图示意
使用方法 for <变量> in <序列>: <循环体> <变量>每经过一次循环,就会得到序列中的一个元素,并通过循环体处理它。<序列>是指有序数列,通常是字符串、列表、range()函数生成的一系列数字等。当序列中的元素全部遍历完成后,程序就会自动退出循环。这里需要注意在编写<循环体>程序前要先空四格缩进一下。 举例说明 程序中,for s in range(200):,表示循环200次。而后续有缩进的八行代码就是需要循环执行的具体操作。 | 代码缩进 功能说明 在python语言中,采用代码缩进和“:”来区分代码之间的层次。 使用方法 四个空格或一个Tab键为一个缩进量 | random()函数和randint()函数 功能说明 random()和randint()函数都是随机数库中的函数,前者用于随机生成0-1之间的浮点数,后者用于随机生成给定范围内的整数。两者皆可通过“random.函数名”的格式实现。 使用方法 random.random(), random.randint(a,b),其中a,b为随机整数且a<b 举例说明 程序中,s =random()/3,表示随机生成一个0-1之间的小数并将这个数缩小3倍后赋值给变量s。又randint(-height/2,height/2)),表示随机生成一个范围在-height/2到height/2内的整数,这里,因为我们是直接导入的库中的两个函数而不是整个库,所以在书写时可以省略“random.”,直接使用函数。 | 取整 功能说明 取一个小数的整数部分 使用方法 int(小数) 举例说明 程序中,star.speed(int(s*10)),表示对s乘上10后的结果进行取整并作为星星的移动速度。 |
Turtle链接 | Turtle()函数 功能说明 turtle库中的Turtle()函数能创建一个Turtle对象,该对象可以是海龟形状、圆状、长方形等。之后,我们可以调用该对象的方法来实现各种功能效果。事实上,通过Turtle()函数创建的对象具有turtle库中的功能,也就是说,该对象的方法和turtle库中的函数在功能上是一致的。 使用方法 turtle.Turtle(visible = 布尔值,shape='形状'),括号内可以设定对象的形状、颜色、可见性等特征,多个时可用逗号隔开 举例说明 程序中,t = turtle.Turtle(visible = False,shape='circle'),表示通过turtle库中的Turtle()函数创建了一个不可见的圆对象并赋值给变量t。 |
对象链接 | clone()方法 功能说明 “clone()”方法可克隆对象 使用方法 对象.clone() 举例说明 程序中,star = t.clone(),表示克隆圆对象并存储到变量star中。 | shapesize()方法 功能说明 “shapesize()”方法能设置对象的形状尺寸大小 使用方法 对象. shapesize (a,b),其中a,b分别表示尺寸的长度和宽度 举例说明 程序中,star.shapesize(s,s),表示以s为长度,s为宽度,设置星星的尺寸大小。 | setx()方法与sety()方法 功能说明 “setx()”与“sety”方法能分别设置对象的横坐标和纵坐标 使用方法 对象.setx(x),括号内的x表示横坐标x 对象.sety(y),括号内的y表示纵坐标y 举例说明 程序中,star.setx(width/2 + randint(1,width)),表示设置星星的x坐标在屏幕右侧 star.sety(randint(-height/2,height/2)),表示设置星星的y坐标在屏幕内随机高度 | showturtle()方法 功能说明 “showturtle()”方法能将对象显示出来 使用方法 对象. showturtle() 举例说明 程序中,star.showturtle(),表示显示星星。 | append()方法 功能说明 “append()”方法能在列表等序列中扩充元素对象 使用方法 序列.append(对象) 举例说明 程序中,stars.append(star),表示将star星星这个元素对象扩充到stars列表中。 |
|
|
任务3:模拟星空程序设计在这个程序中,我们将使随机出现的星星飘动起来,通过它,我们可以掌握使一个对象移动的方式。为此,我们将分三步创建这个程序。首先是分析任务,之后进行模拟星空的程序编写,最后运行程序并观察效果。
1、任务分析在之前的任务中,我们已经在屏幕右侧添加了一个个小星星,接下来我们需要在之前的基础上编写程序,使小星星向左飘动起来。 这里,为了避免星星飘动到左侧后远离屏幕,我们要进行一个判断,即如果星星移到左屏幕外后,就要使星星消失并重新出现在屏幕右侧。
由于屏幕的宽度是有限定的,因此我们将对星星在星空列表中设定计次循环,每次向左飘动一小段距离,直至飘出屏幕左侧。
同时,为了使星空中所有星星能始终保持移动的状态,我们需要使用永久循环结构,将所有操作包含在内。
对此,我们采用循环结构与分支结构嵌套的方式编写。具体流程如下,
2、程序编写STEP1:创建与保存python文件 同上,我们在项目文件中再创建一个python程序文件“任务三.py”进行编程。 STEP2:编写程序 - import turtle#导入turtle库
- from random import random,randint#导入随机数函数
- #创建屏幕
- screen = turtle.Screen()#通过turtle库中Screen()函数创建一个屏幕作为一个对象并赋值给变量screen,后面都用screen来表示
- width,height = 700,500#设定宽度和高度
- screen.setup(width,height)#以设定好的宽度和高度来创建屏幕实体
- screen.title("模拟3D星空")#设定屏幕标题
- screen.bgpic('浩瀚银河.gif')#添加银河背景图
- screen.delay(0)#绘画延迟,设为0避免卡顿
- #创建星星
- t = turtle.Turtle(visible = False,shape='circle')#通过turtle库中Turtle()函数创建一个圆作为一个对象并赋值给变量t且隐藏,后面都用t来表示
- t.pencolor("white")#设置画笔颜色
- t.fillcolor("white")#设置填充颜色
- t.penup()#抬笔
- t.goto(width/2,randint(-height/2,height/2))#到屏幕右侧随机位置
- stars = []#创建星空列表
- for s in range(200):#进行200次循环
- star = t.clone()#克隆圆对象作为星星
- s =random() /3#尺寸
- star.shapesize(s,s)#形状尺寸
- star.speed(int(s*10))#移动速度
- star.setx(width/2 + randint(1,width))#设置星星的x坐标在屏幕右侧
- star.sety(randint(-height/2,height/2))#设置星星的y坐标在屏幕范围内
- star.showturtle()#显示星星
- stars.append(star)#扩充星星
- while True:#永久循环
- for star in stars:#列表循环
- star.setx(star.xcor() - 3 * star.speed())#设定星星的横向移动
- if star.xcor()<-width/2:#判断星星是否移动到了左侧屏幕
- star.hideturtle()#隐藏星星
- star.setx(width/2 + randint(1,width))#设置x坐标在屏幕右侧
- star.sety(randint(-height/2,height/2))#设置y坐标在屏幕内
- star.showturtle()#显示星星
复制代码
3、程序运行运行程序,我们看到:首先出现一个银河系的背景屏,之后一个个小星星从屏幕右侧向左侧飘动起来。
知识链接 | 比较运算符 知识描述 和数学中一样,python中的比较运算符也是用来处理数据比较的符号。比如,“>”,“<”,“>=”,“<=”都是比较运算符的一种 知识实例 程序中,if star.xcor()<-width/2:,表示判断星星对象的x坐标是否小于屏幕左边框的x坐标 |
知识积累 | if语句 功能说明 if语句体现的是程序控制结构中的单分支结构,用于进行只有一种情况下的条件判断,当要判断的条件被满足时可以进行一定的操作。事实上,这里的if相当于汉语中的“如果”,如果满足条件,则执行一定的操作。 流程示意图 使用方法 if <条件表达式>: <语句块> 这里的条件表达式,就是用来判断条件是否成立的语句,条件成立返回数值“1”,表示真,条件不成立返回数值“0”,表示假。这里的语句块,就是表达式的返回值为真时要执行的操作。 举例说明 程序中,if star.xcor()<-width/2:,表示判断星星对象的x坐标是否小于屏幕左边框的x坐标,如果是,则进行后续的操作。 | while循环 while循环是一种条件循环。这里,我们通过while True语句来实现永久循环的效果,关于while循环语句的具体使用方法我们将在后续的课程中详细介绍。 |
对象链接 | xcor()属性 功能说明 “xcor()”是对象的一个属性,指的是对象的x坐标 使用方法 对象. xcor() 举例说明 程序中,if star.xcor()<-width/2:,表示判断星星对象的x坐标是否小于屏幕左边框的x坐标。 |
|
|
五、巩固提高
项目回顾本节课我们利用海龟绘图turtle库,创建了一个屏幕,之后在屏幕右侧随机添加了一个个小星星,并在使星星飘动起来,模拟出了一个动态星空的效果。
知识小结
程序 | | | | | 数据类型(布尔类型、列表)、算术运算符、循环结构、for循环 | | |
项目拓展尝试改变星星的大小、数量与颜色,看一看变化后的3D星空效果如何吧!
附录
附录1 Screen()函数导入图片的方式 - screen.bgpic('浩瀚银河.gif')#添加银河背景图
复制代码
屏幕对象bgpic()方法可以用来给屏幕添加图片,值得注意的是这里的背景图片需要我们事先找好并放入程序所在文件夹中。其中,图片的格式需要是gif的才行,如果找到的是其他格式的图片,我们可以借助电脑自带的画图软件将图片另存为gif格式后再使用。
教程中图片下载链接如下, 链接:https://pan.baidu.com/s/1v0E67rhnY_GxppeCazR_yw 提取码:bk9u
存放文件的步骤可以参考下列说明,
(1)单击“更多”按钮
(2)打开文件夹位置
(3)在弹出的文件夹中放入gif格式的图片
(4)刷新后查看
(4)在程序中bgcolor()命令的括号内添加一对单引号,引号内输入图片的名称及格式
|