本帖最后由 木子呢 于 2022-4-20 11:42 编辑  
 
行空板,新一代国产开源硬件平台,仅需2步,即可让你轻松开启Python学习之路。  
 模拟星空  
 
古往今来,人们对于星空有着独特的喜爱。遥看那漫天的星斗,像黑夜里眨动的眼睛,又像一颗颗光闪闪、亮晶晶的夜明珠,更像在无边海洋上闪动着的点点银光,无不令人神往。 
 
在这节课上,我们将自己动手,绘制一颗颗小星星,并使其在屏幕上随机飘动,模拟一个动态的浩瀚星空。 
 
 
任务目标 
 
在屏幕上绘制一颗颗小星星并使其飘动。 
 
 
知识点 
 
1、认识turtle库 
 
2、学习使用turtle库绘制星星的方法 
 
3、学习使用turtle库使星星随机出现并飘动的方法 
 
材料清单 
 
软件使用:Mind+编程软件x1 
 
知识储备 
 
1、什么是turtle库 
 
turtle库,又称海龟绘图库,它是Python语言中一个很流行的绘制图像的函数库。它的原理是利用画笔移动的路径来生成图形。我们可以借助turtle库来实现在屏幕上绘制图形,如矩形、圆、五角星等。 
 
2、turtle库通用知识 
 
(1) turtle空间坐标体系 
 
(A)绝对坐标 
 
以屏幕中间为原点(0,0),形成四象限的坐标体系。 
 
 
(B)海龟坐标 
 
是以海龟的视角的坐标体系,分为四个方向。 
 
 
(2) 画布 
 
画布(Canvas),我们可以理解为一张白纸,在上面能画出不同形状、颜色、粗细的图形。海龟每次绘制的图形都是显示在一张自动生成的画布上的。画布的默认大小为(400,300),其中400是指长度的像素值,300是指宽度的像素值。对于画布,我们可以设置它的大小和初始位置,也可以把画布看成一个坐标系,小海龟每次移动都是从坐标原点(0,0)出发的。 
 
 
(3)海龟绘图三要素 
 
海龟绘图有三个关键要素,即方向、位置和画笔。在进行海龟绘图时,主要就是控制这些要素来绘出我们想要的图形。 
 
其中,方向主要用于控制海龟的移动方向。位置主要用于控制海龟移动的距离。而画笔主要承担画图工具的作用。在海龟绘图中,通过画笔可以控制线条的粗细、颜色和运动的速度等。 
 
3、turtle库屏幕控制的常见函数 
 
turtle库中关于屏幕控制的函数有很多,我们只使用其中的一部分,编程时,通过“import turtle”导入库后可采用“turtle.函数名()”的形式来实现功能。Tips :这里的函数都来自于TurtleScreen类中的方法。 
 
(1)setup()函数设置绘图窗口(画布)的大小和位置 
 
通过setup()函数我们可为当前的窗口屏幕设置大小和位置,设定的参数为整数时,单位为像素,不输入参数则表示默认。 
 
			
			
			- turtle.setup(240,320) # 设置绘图窗口大小
 
  复制代码
  
其中,240和320分别指的是窗口的宽度和高度,与行空板的屏幕分辨率相同。 
 
(2)bgpic()函数设置屏幕的背景图片 
 
通过bgpic()函数我们可为当前的窗口屏幕设置背景图片。 
 
- turtle.bgpic("123.png") # 设置背景图
 
  复制代码
  
其中,“123.png”指的是具体的背景图,为了使显示效果更加,我们可调整其尺寸大小与屏幕一致。 
 
(3)tracer()函数设置动画的打开或关闭 
 
通过tracer()函数我们可自行设定绘图动画的打开或关闭。当我们想将图形一次性绘好,而不显示绘制过程,则可选择关闭动画。 
 
- turtle.tracer(True) # 打开绘图动画
 - 
 - turtle.tracer(False) # 关闭绘图动画
 
  复制代码
  
其中,“True”和“False”分别指的是绘图轨迹动画的打开和关闭。 
 
(4)delay()函数设置绘图延迟 
 
通过delay()函数我们可为当前的窗口屏幕设置绘图延迟,单位为毫秒。绘制延迟越长,绘图动画越慢,设为0可以避免卡顿。 
 
复制代码
  
其中,“0”指的是画布上绘图延迟的具体时间。 
 
4、turtle库画笔运动的常见函数 
 
turtle库中关于画笔运动的函数有很多,我们只使用其中的一部分,在编程时,可采用“turtle.函数名()”的形式来实现功能。Tips :这里的函数都来自于Turtle类中的方法。 
 
(1)forward()函数控制画笔向前移动指定距离 
 
通过forward()函数我们可使画笔向前移动,继而绘制出线条。 
 
- turtle.forward(100) # 向前移动100像素
 
  复制代码
  
其中,“100”指的是具体的像素值,可通过改变像素值来改变线条的长度。同样地,我们也可以通过“backward()”函数来使画笔向后移动来绘制线条。 
 
(2)left()函数控制画笔向左转动指定角度 
 
画笔的初始朝向为向右,我们可通过left()函数来改变画笔的朝向。 
 
- turtle.left(90) # 向左转动90度
 
  复制代码
  
其中,“90”指的是具体的角度值,可通过改变角度值来改变朝向方位。同样地,我们也可以通过“right()”函数来使画笔向右转动。 
 
(3)goto()函数控制画笔移动到指定坐标位 
 
- turtle.goto(110,120) # 移动到(110,120)坐标位
 
  复制代码
  
其中,“110”指的是所要移动到的位置的横坐标,“120”指的是相应的纵坐标,可通过改变横纵坐标来改变移动到的位置。同样地,我们也可以通过“set(x)”和“set(y)”两个函数来单独设置海龟画笔的横纵坐标。 
 
(4)speed()函数设置画笔移动的速度 
 
画笔的移动速度,可通过0-10范围内的整数值来进行设定。 
- “最快”:0
 - “快速”:10
 - “正常”:6
 - “慢”:3
 - “最慢”:1
 
 
  
从 1 到 10 的速度使线条绘制和转弯的动画速度越来越快。速度 = 0 表示不发生动画。前进/后退时呈现跳跃的效果,左右转时呈现立即转身的效果。 
 
- turtle.speed(0) # 设置画笔移动速度为最快
 
  复制代码
  
(5)clone()函数克隆画笔对象 
 
在生成一个画笔对象后,我们可通过clone()函数实现对该对象的克隆。 
 
- tt = turtle.Turtle(shape ="turtle") # 实例化Turtle类,创建对象,形状为海龟
 - 
 - star = tt.clone() # 克隆
 
  复制代码
  
这里,我们手动创建了一个形状为海龟的画笔对象,之后通过clone()函数对其进行克隆操作,并存储到变量star中。 
 
Tips:turtle库中的画笔对象默认是存在的,且为海龟形状,当我们需要额外生成一些画笔并设定其形状时,可通过实例化Turtle类的方式实现,如上。 
 
5、turtle库画笔控制的常见函数 
 
turtle库中关于画笔控制的函数有很多,我们只使用其中的一部分,在编程时,可采用“turtle.函数名()”的形式来实现功能。 
 
(1)shape()函数显示形状 
 
通过shape()函数我们可使画笔显示成各种不同的形状,如海龟状(turtle)、圆形(circle)、箭头状(arrow)等,这些是turtle库形状列表中自带的,当然,我们也可通过自己手动绘制的方式将图形存入形状列表继而显示出来。 
 
- turtle.shape("turtle") # 显示海龟形状
 
  复制代码
  
其中,“turtle”指的是具体的海龟形状,可通过改变引号内的参数来改变实际的形状。 
 
Tips:我们可通过“getshape()”函数来获取turtle库形状列表中所有的形状。 
 
(2)register_shape()函数注册形状 
 
通过register_shape()函数我们可注册形状,将非自带的图形添加到形状列表中。 
 
- turtle.register_shape("tt",shape) # 显示海龟形状
 
  复制代码
  
其中,“tt”指的是要添加到列表中形状的名称,“shape”指的是具体要添加的形状。 
 
(3)begin_poly()、end_poly()、get_poly()函数记录形状 
 
要想将绘制的图形作为一个形状存储到形状列表中,我们需要记录所绘制图形的顶点。编程时,我们需在开始绘制图形前通过“begin_poly()”函数来启动顶点的记录,之后在绘制完成后通过“end_poly()”来结束记录,最后,再通过“get_poly()”函数来返回获取记录的图形。 
 
- turtle.begin_poly() # 开始记录多边形顶点
 - 
 - for i in range(5): # 循环五次
 - 
 -     turtle.forward(15) # 前进15像素
 - 
 -     turtle.right(144) # 右转144度
 - 
 - turtle.end_poly() # 结束记录
 - 
 - shape = turtle.get_poly() # 返回记录的多边形
 - 
 - turtle.register_shape("tt",shape) # 将绘制的多边形添加到形状列表中
 
  复制代码
  
这里,我们通过“begin_poly()”、“end_poly()”、“get_poly()”三个函数实现了对于所绘制的五角星的顶点的记录,并将这个五角星保存为基础形状,存储到了形状列表中。 
 
(4)hideturtle()函数隐藏画笔 
 
shape()函数可使画笔显示各种不同的形状,而当我们不想见到它时,我们可通过“hideturtle()”函数使其隐藏。 
 
- turtle.hideturtle() # 隐藏海龟画笔
 
  复制代码
  
同样地,我们也可通过“showturtle()”函数使画笔再显现出来。 
 
(5)penup()函数抬起画笔 
 
penup()函数可使画笔抬起,从而在移动时不绘制图形。 
 
复制代码
  
同样地,如果我们需要在画笔移动时绘制图形,可通过“pendown()”来使画笔落下。 
 
(6)pencolor()函数设置画笔的颜色 
 
移动画笔绘图时默认的颜色为黑,pencolor()函数可设置画笔的颜色,继而改变所绘制图形的颜色。 
 
- turtle.pencolor("red") # 设置画笔颜色为red
 
  复制代码
  
其中,“red”指的是具体的颜色,这里的颜色同样可以通过RGB值、十六进制值、固定值三种不同的方式来表示。 
 
(7)fillcolor()、begin_fill()、end_fill()函数填充图形颜色 
 
pencolor()函数只能设置画笔的颜色,而要想对于所绘制图形增加填充色,我们需要先通过“fillcolor()”函数设置好要填充的颜色,之后再在开始绘制图形前通过“begin_fill()”函数来启动填充,最后在绘制完成后通过“end_fill()”函数来结束填充。 
 
- turtle.fillcolor("red") # 设置填充颜色为red
 - 
 - turtle.begin_fill() # 开始记录多边形顶点
 - 
 - for i in range(5): # 循环五次
 - 
 -     turtle.forward(15) # 前进15像素
 - 
 -     turtle.right(144) # 右转144度
 - 
 - turtle.end_fill() # 结束记录
 
  复制代码
  
这里,我们通过“fillcolor()”、“begin_fill()”、“end_fill()”三个函数实现了对绘制的五角星进行红色的填充。 
 
(8)xcor()、ycor()函数检测获取画笔的横纵坐标 
 
对于画笔当前的坐标位置,我们可通过“xcor()”、“ycor()”函数来进行检测。 
 
- x = turtle.xcor() # 检测画笔所在位置的横坐标
 - 
 - y = turtle.ycor() # 检测画笔所在位置的纵坐标
 
  复制代码
  
其中,“x”和“y”分别是两个变量,用来存储检测到的画笔当前的横纵坐标位。 
 
(9)done()函数结束绘图并保持窗口 
 
在图形绘制完成后,我们可通过done()函数来结束绘图,并且保持绘图窗口。 
 
- turtle.done() # 结束绘图,保持窗口不关闭
 
  复制代码
  
这里,done()函数的使用必须是海龟图形程序的最后一句。 
 
动手实践 
 
任务描述1:绘制星星 
 
将通过turtle库绘制的一颗星星显示在屏幕上。 
 
1、硬件搭建 
 
通过USB连接线将行空板连接到计算机 
 
2、程序编写 
 
STEP1:创建与保存项目文件 
 
启动Mind+,另存项目并命名为“004、模拟星空”。 
 
STEP2:创建与保存Python文件 
 
创建一个Python程序文件“main1.py”,双击打开。 
 
STEP3:导入图片 
 
在项目文件夹中导入背景图。(图片与程序文件同在项目文件夹中)(图片下载链接见附录1) 
 
STEP4:程序编写 
 
(1) 导入所需功能库 
 
在这个任务中,我们需要使用turtle库来绘制星星,因此,我们须先导入它。 
 
复制代码
  
(2) 创建绘图窗口 
 
为了能使行空板的屏幕与绘图时的画布保持大小一致,我们需要手动创建一块固定尺寸的画布作为绘图窗口,并在其中导入一张背景图,再设置好绘画延迟。 
 
- # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(8) # 设置绘画延迟(以毫秒为单位),绘制延迟越长,动画越慢
 
  复制代码
  
(3) 创建画笔并设置绘图参数 
 
之后,我们创建一个海龟画笔,并将它隐藏,使其在绘图时不显示,再设置好它的移动速度、画笔颜色、填充颜色等几个绘图相关参数。 
 
- # 创建海龟画笔并设定相关参数
 - 
 - t = turtle.Turtle() # 实例化Turtle类,创建一个海龟对象作为画笔
 - 
 - t.hideturtle() # 隐藏海龟画笔
 - 
 - t.speed(0) # 设置海龟画笔移动速度
 - 
 - t.pencolor("white") # 设置画笔颜色
 - 
 - t.fillcolor("white") # 设置填充颜色
 
  复制代码
  
(4) 绘制星星 
 
接下来,我们就可以随心所欲得绘制星星了,具体步骤如下。 
 
- t.pendown() # 落笔,画笔移动时绘制图形
 - 
 - t.begin_fill() # 开始填充
 - 
 - # 绘制过程
 - 
 - for i in range(5): # 循环五次
 - 
 -     t.forward(30) # 前进30像素
 - 
 -     t.right(144) # 右转144度
 - 
 - t.end_fill() # 结束填充
 - 
 - t.penup() # 抬起画笔
 - 
 - turtle.done() # 结束绘图
 
  复制代码
  
Tips:完整示例程序如下: 
 
- # 绘制一颗小星星
 - 
 - import turtle # 导入海龟库
 - 
 - # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(8) # 设置绘画延迟(以毫秒为单位),绘制延迟越长,动画越慢,设为0避免卡顿
 - 
 - # 创建海龟画笔并设定相关参数
 - 
 - t = turtle.Turtle() # 实例化Turtle类,创建一个海龟对象作为画笔
 - 
 - t.hideturtle() # 隐藏海龟画笔
 - 
 - t.speed(0) # 设置海龟画笔移动速度
 - 
 - t.pencolor("white") # 设置画笔颜色
 - 
 - t.fillcolor("white") # 设置填充颜色
 - 
 - t.pendown() # 落笔,画笔移动时绘制图形
 - 
 - t.begin_fill() # 开始填充
 - 
 - # 绘制xingxing过程
 - 
 - for i in range(5): # 循环五次
 - 
 -     t.forward(30) # 前进30像素
 - 
 -     t.right(144) # 右转144度
 - 
 - t.end_fill() # 结束填充
 - 
 - t.penup() # 抬起画笔
 - 
 - turtle.done() # 结束绘图
 
  复制代码
  
3、程序运行 
 
STEP1:远程连接行空板 
 
STEP2:点击右上方的运行按钮 
 
STEP3:观察效果 
 
观察行空板,首先可以看到一幅浩渺无边的银河背景图,之后,一颗白色的五角星渐渐显示在屏幕中间。 
 
 
任务描述2:绘制星空 
 
在成功绘制出一颗星星后,我们将借助这种方法,快速地在屏幕任意位置上重复绘制多颗星星。 
 
1、程序编写 
 
STEP1:创建与保存项目文件 
 
新建一个Python程序文件“main2.py”,双击打开。 
 
STEP2:程序编写 
 
(1)导入所需功能库 
 
这里,由于将使星星随机出现,因此,我们需要额外导入random随机数库。 
 
- import turtle # 导入海龟库
 - 
 - import random # 导入随机数dandom库
 
  复制代码
  
(2)创建绘图窗口 
 
- # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(8) # 绘画延迟,设为0避免卡顿
 
  复制代码
  
(3)创建Star类 
 
这里,我们通过创建星星类再实例化的方式来在随机位置上先后绘制多颗星星以呈现星星随机出现的效果。整理上,我们先设定画笔的基本属性,之后绘制单颗星星,最后重复同样的过程10次实现星空的绘制。因此,在构造方法中,我们先设定海龟画笔,使其处于隐藏状态,并且移动速度最快,之后调用后续绘制星空的实例方法来实现需求。 
 
- # 定义一个Star类
 - 
 - class Star(turtle.Turtle):
 - 
 -     def __init__(self):
 - 
 -         turtle.Turtle.__init__(self) # 解绑Star类中的方法,使其也拥有Turtle类中的方法
 - 
 -         self.hideturtle() # 隐藏海龟画笔
 - 
 -         self.speed(0) # 设置画笔移动速度
 - 
 -         self.draw_stars() # 绘制整个星空
 
  复制代码
  
(4)绘制单颗星星 
 
之后,我们创建一个实例方法,来绘制单颗星星,具体过程如下。 
 
- def draw_star(self): # 绘制一颗星星
 - 
 -         self.pencolor("white") # 设置画笔颜色
 - 
 -         self.fillcolor("white") # 设置填充颜色
 - 
 -         self.pendown() # 落笔,画笔移动时绘制图形
 - 
 -         self.begin_fill() # 开始填充
 - 
 -         # 绘制过程
 - 
 -         for i in range(5): # 循环五次
 - 
 -             self.forward(20) # 前进20像素
 - 
 -             self.right(144) # 右转144度
 - 
 -         self.end_fill() # 结束填充
 - 
 -         self.penup() # 抬起画笔
 
  复制代码
  
(5)绘制星空 
 
接着,我们再通过创建实例方法来绘制十颗星星并使其随机出现在屏幕上,具体过程如下。 
 
- def draw_stars(self): # 绘制整个星空
 - 
 -         self.penup() # 抬起画笔
 - 
 -         # 绘制过程
 - 
 -         for i in range(10): # 循环10次,绘制10颗
 - 
 -             x=random.randint(-120,120) # 设定屏幕内随机的x坐标
 - 
 -             y=random.randint(-160,160) # 设定屏幕内随机的y坐标
 - 
 -             self.goto(x, y) # 走到初始位置
 - 
 -             self.draw_star() # 绘制单颗小星星
 - 
 -         self.end_fill() # 结束填充
 - 
 -         self.penup() # 抬起画笔
 
  复制代码
  
(6)实例化Star类,并结束绘图 
 
最后,我们通过实例化Star类,来创建一个完整的星空。 
 
- Star() # 创建Star类的实例
 - 
 - turtle.done() # 结束绘图,保持窗口不关闭
 
  复制代码
  
Tips:完整示例程序如下: 
 
- # 绘制小星星 ,并使其随机出现
 - 
 - import turtle # 导入海龟库
 - 
 - import random # 导入随机数dandom库
 - 
 - # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(0) # 绘画延迟,设为0避免卡顿
 - 
 - # 定义一个Star类
 - 
 - class Star(turtle.Turtle):
 - 
 -     def __init__(self):
 - 
 -         turtle.Turtle.__init__(self) # 解绑Star类中的方法,使其也拥有Turtle类中的方法
 - 
 -         self.hideturtle() # 隐藏海龟画笔
 - 
 -         self.speed(0) # 设置画笔移动速度
 - 
 -         self.draw_stars() # 绘制整个星空
 - 
 -     def draw_star(self): # 绘制一颗星星
 - 
 -         self.pencolor("white") # 设置画笔颜色
 - 
 -         self.fillcolor("white") # 设置填充颜色
 - 
 -         self.pendown() # 落笔,画笔移动时绘制图形
 - 
 -         self.begin_fill() # 开始填充
 - 
 -         # 绘制过程
 - 
 -         for i in range(5): # 循环五次
 - 
 -             self.forward(20) # 前进20像素
 - 
 -             self.right(144) # 右转144度
 - 
 -         self.end_fill() # 结束填充
 - 
 -         self.penup() # 抬起画笔
 - 
 -     def draw_stars(self): # 绘制整个星空
 - 
 -         self.penup() # 抬起画笔
 - 
 -         # 绘制过程
 - 
 -         for i in range(10): # 循环10次,绘制10颗
 - 
 -             x=random.randint(-120,120) # 设定屏幕内随机的x坐标
 - 
 -             y=random.randint(-160,160) # 设定屏幕内随机的y坐标
 - 
 -             self.goto(x, y) # 走到初始位置
 - 
 -             self.draw_star() # 绘制单颗小星星
 - 
 -         self.end_fill() # 结束填充
 - 
 -         self.penup() # 抬起画笔
 - 
 - Star() # 创建Star类的实例
 - 
 - turtle.done() # 结束绘图,保持窗口不关闭
 
  复制代码
  
2、程序运行 
 
STEP1:远程连接行空板 
 
STEP2:运行程序并观察效果 
 
点击运行后,观察行空板,可以看到一颗颗小星星随机出现在屏幕上。 
 
 
任务描述3:模拟动态星空 
 
接下来,我们将使星星随机出现在屏幕的上方,之后缓缓飘落下来,模拟一个动态的星空。 
 
1、程序编写 
 
STEP1:创建与保存项目文件 
 
新建一个Python程序文件“main3.py”,双击打开。 
 
STEP2:程序编写 
 
(1)导入所需功能库 
 
- import turtle # 导入turtle库
 - 
 - import random # 导入随机数dandom库
 
  复制代码
  
(2)创建绘图窗口 
 
- # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(0) # 绘画延迟,设为0避免卡顿
 
  复制代码
  
(3)绘制星星并记录其轮廓 
 
在上个任务中,我们在屏幕上快速绘制了10颗星星,而在这里,我们要想使星星们随机飘动起来,就必须将他们视作一个个独立的对象,因此我们需要将绘制完成的星星轮廓记录下来,以便之后再将其作为星星形状添加到turtle库默认的形状列表中,继而使星星以画笔对象的形式呈现出来。 
 
- # 绘制星星并记录其轮廓
 - 
 - t = turtle.Turtle() # 实例化Turtle类,创建一个海龟对象作为画笔
 - 
 - t.hideturtle() # 隐藏海龟画笔
 - 
 - t.speed(0) # 设置移速最快
 - 
 - t.pencolor("white") # 设置画笔颜色
 - 
 - t.fillcolor("white") # 设置填充颜色
 - 
 - t.penup() # 抬起画笔
 - 
 - t.goto(-140,0) # 移动到屏幕左侧
 - 
 - turtle.tracer(False) # 关闭动画
 - 
 - t.begin_fill() # 开始填充
 - 
 - t.begin_poly() # 开始记录多边形顶点
 - 
 - for i in range(5): # 循环五次
 - 
 -     t.forward(15) # 前进15像素
 - 
 -     t.right(144) # 右转144度
 - 
 - t.end_poly() # 结束记录
 - 
 - t.end_fill() # 结束填充
 
  复制代码
  
(4)获取记录的星星轮廓并将其添加到形状列表中 
 
接下来,我们就可以随心所欲得绘制星星了,具体步骤如下。 
 
- # 获取记录的星星轮廓并将其添加到形状列表中
 - 
 - shape = t.get_poly() # 返回记录的多边形
 - 
 - turtle.register_shape("tt",shape) # 将绘制的多边形添加到形状列表中,命名为tt
 
  复制代码
  
(5)绘制一颗星星 
 
之后,我们就可以将星星形状作为一个画笔对象调用出来。 
 
- turtle.tracer(True) # 打开动画
 - 
 - # 创建星星
 - 
 - tt = turtle.Turtle(shape='tt') # 实例化Turtle类,创建一个对象画笔,形状为五角星,并赋值给变量tt,后面都用tt来表示
 - 
 - tt.pencolor("white") # 设置画笔颜色
 - 
 - tt.fillcolor("white") # 设置填充颜色
 - 
 - tt.penup() # 抬笔
 - 
 - tt.goto(-120,160) # 移动到屏幕外
 
  复制代码
  
(6)克隆星星并使其随机出现在屏幕上方 
 
紧接着,我们克隆50颗星星画笔对象,并使其随机出现在屏幕上方。 
 
- stars = [] # 创建星空列表
 - 
 - for s in range(50): # 进行50次循环
 - 
 -     star = tt.clone() # 克隆星星
 - 
 -     s =random.random()/3 #随机数
 - 
 -     star.speed(int(s*10)) # 移动速度
 - 
 -     star.setx(random.randint(-width/2,width/2)) # 设置星星的x坐标在屏幕内
 - 
 -    star.sety(height/2+ random.randint(1,height)) # 设置星星的y坐标在屏幕上方
 - 
 -     star.showturtle() # 显示星星
 - 
 -     stars.append(star) # 扩充星星
 
  复制代码
  
(7)模拟星空,使星星随机飘落 
 
最后,我们使其缓缓飘落。 
 
- while True: # 永久循环
 - 
 -     for star in stars: # 列表循环
 - 
 -         star.sety(star.ycor() - 3 * star.speed()) # 设定星星的纵向移动
 - 
 -         if star.ycor()<-300: # 判断星星是否移动到了下方屏幕
 - 
 -             star.hideturtle() # 隐藏星星
 - 
 -             star.setx(random.randint(-width/2,width/2)) # 设置星星的x坐标在屏幕内
 - 
 -             star.sety(height/2+ random.randint(1,height)) # 设置星星的y坐标在屏幕上方
 - 
 -             star.showturtle() # 显示星星
 
  复制代码
  
Tips:完整示例程序如下: 
 
- # 从上往下飘动
 - 
 - import turtle # 导入turtle库
 - 
 - import random # 导入随机数dandom库
 - 
 - # 创建绘图窗口
 - 
 - width,height = 240,320 # 设定窗口的宽度和高度
 - 
 - turtle.setup(width,height) # 以设定好的宽度和高度来创建窗口
 - 
 - turtle.bgpic('浩瀚银河.png') # 添加银河背景图
 - 
 - turtle.delay(0) # 绘画延迟,设为0避免卡顿
 - 
 - # 绘制星星并记录其轮廓
 - 
 - t = turtle.Turtle() # 实例化Turtle类,创建一个海龟对象作为画笔
 - 
 - t.hideturtle() # 隐藏海龟画笔
 - 
 - t.speed(0) # 设置移速最快
 - 
 - t.pencolor("white") # 设置画笔颜色
 - 
 - t.fillcolor("white") # 设置填充颜色
 - 
 - t.penup() # 抬起画笔
 - 
 - t.goto(-140,0) # 移动到屏幕外
 - 
 - turtle.tracer(False) # 关闭动画
 - 
 - t.begin_fill() # 开始填充
 - 
 - t.begin_poly() # 开始记录多边形顶点
 - 
 - for i in range(5): # 循环五次
 - 
 -     t.forward(15) # 前进15像素
 - 
 -     t.right(144) # 右转144度
 - 
 - t.end_poly() # 结束记录
 - 
 - t.end_fill() # 结束填充
 - 
 - # 获取记录的星星轮廓并将其添加到形状列表中
 - 
 - shape = t.get_poly() # 返回记录的多边形
 - 
 - turtle.register_shape("tt",shape) # 将绘制的多边形添加到形状列表中,命名为tt
 - 
 - # print(turtle.getshapes())
 - 
 - turtle.tracer(True) # 打开动画
 - 
 - # 创建星星
 - 
 - tt = turtle.Turtle(shape='tt') # 实例化Turtle类,创建一个对象画笔,形状为五角星,并赋值给变量tt,后面都用tt来表示
 - 
 - tt.pencolor("white") # 设置画笔颜色
 - 
 - tt.fillcolor("white") # 设置填充颜色
 - 
 - tt.penup() # 抬笔
 - 
 - tt.goto(-120,160) # 移动到屏幕外
 - 
 - stars = [] # 创建星空列表
 - 
 - for s in range(50): # 进行50次循环
 - 
 -     star = tt.clone() # 克隆星星
 - 
 -     s =random.random()/3 #随机数
 - 
 -     star.speed(int(s*10)) # 移动速度
 - 
 -     star.setx(random.randint(-width/2,width/2)) # 设置星星的x坐标在屏幕内
 - 
 -     star.sety(height/2+ random.randint(1,height)) # 设置星星的y坐标在屏幕上方
 - 
 -     star.showturtle() # 显示星星
 - 
 -     stars.append(star) # 扩充星星入列表
 - 
 -    
 - 
 - while True: # 永久循环
 - 
 -     for star in stars: # 列表循环
 - 
 -         star.sety(star.ycor() - 3 * star.speed()) # 设定星星的纵向移动
 - 
 -         if star.ycor()<-300: # 判断星星是否移动到了下方屏幕
 - 
 -             star.hideturtle() # 隐藏星星
 - 
 -             star.setx(random.randint(-width/2,width/2)) # 设置星星的x坐标在屏幕内
 - 
 -             star.sety(height/2+ random.randint(1,height)) # 设置星星的y坐标在屏幕上方
 - 
 -             star.showturtle() # 显示星星
 
  复制代码
  
2、程序运行 
 
STEP1:远程连接行空板 
 
STEP2:运行程序并观察效果 
 
点击运行后,观察行空板,可以发现在等待几秒后,一颗颗白色的小星星就从屏幕上方随机落下,与银河交相辉映。 
 
 
挑战自我 
 
尝试改变星星的形状、大小、数量与颜色,看一看变化后的3D星空效果如何吧! 
 
附录 
 
附录1:背景图链接 
 
链接:https://pan.baidu.com/s/1gCPNC8zE_-3tBpu5OanWZQ 
 
提取码:tcld 
 
 |