我的第一堂编程课:孩子和家长都需要的编程思维
上QQ阅读APP看书,第一时间看更新

4.3 使用循环与条件判断——深水潜艇模拟器

参观完程序工坊,我们知道了程序的三大基本结构,但是它们在实际中是如何应用的呢?

碰巧酷客工程师最近在负责建造一艘潜水艇,用来搭载游客去游览酷客王国的海底公园。我们不如使用新学的程序结构,来帮助酷客工程师设计一个潜艇的控制程序吧。

“好棒啊!”大家兴奋地喊了起来。

1 首先添加背景和角色。通过前面几个程序的练习,我们现在应该都可以熟练地为程序添加背景和角色了吧!

2 控制鲨鱼角色在海洋中游动起来。

程序开始运行后,“重复执行”命令让鲨鱼在舞台区域中向前移动(每次移动5步)。

“碰到边缘就反弹”命令可以让鲨鱼在碰到舞台边缘时反弹回来,向反方向移动。这个过程类似我们将乒乓球打到墙上后反弹回来的效果,如下图。

但是我们很快就发现了一个问题:鲨鱼只能沿着水平方向游动,这让鲨鱼的行动看起来十分生硬,一点儿都不灵活。这是怎么回事呢?

3 要解释上面的问题,我们先来讲解一下角色的朝向。

在Scratch中,当角色被添加到舞台上时,默认的朝向是+90°方向。“移动()步”命令控制角色前进的方向是由角色的朝向决定的。

当我们执行“移动(10)步”命令时,其实是让角色朝着+90°方向移动10步。在舞台上看,就是角色向右前进了10步。

当执行“移动(-10)步”命令时,就是让角色向-90°方向移动10步,看起来就是角色向左前进了10步。

4 角色移动命令的分类。

在“运动”命令模块中,对于角色移动的控制,大体可以分为两类,分别是针对角色朝向的相对位置移动、针对角色坐标的绝对位置移动。

结合舞台中坐标轴的概念,当角色的朝向是+90°时,上述移动命令就等价于“将x坐标增加()”命令。

5 那么为什么要设计两组不同的命令呢?

这是因为这两组命令有着不同的使用场景。

例如,使用角色朝向类的移动命令“移动()步”时,我们只需要调整角色的朝向即可,如“左转(30)度”,而不需要精确地计算角色在x(y)轴上的位移大小。

如果没有角色朝向类命令,要让角色朝右上30°方向移动200步,则需要进行如下计算。

实现上面简单的移动操作,就需要使用到正弦和余弦函数,是不是有些复杂呢?

正弦公式:sin(θ)=对边/斜边

余弦公式:cos(θ)=邻边/斜边

6 掌握了角色朝向的概念,现在我们有没有办法让鲨鱼在海洋中灵活地游动呢?

在鲨鱼开始游动之前,我们先为它设置一个初始角度(也就是鲨鱼最开始的朝向),这样当鲨鱼在游动中碰到舞台边缘时,就会以一个特定角度向相反的方向游动了。

以上两种方式都可以为鲨鱼设置初始角度。

现在鲨鱼游动的样子看起来是不是自然了很多呢?

7 当进行到这一步时,一直跟着酷客工程师编写代码的小朋友可能会发现一个问题:“当鲨鱼碰到边缘反弹后,变成头朝下游动了。”

是什么原因造成鲨鱼头朝下游动的呢?要理解这个问题,需要先深入研究一下“碰到边缘就反弹”这个命令。

8 我们先来看一下,执行“碰到边缘就反弹”命令后鲨鱼可能的几种形态。

除了中间鲨鱼的样子,左侧和右侧图中鲨鱼的形态是不是都很奇怪呢?

其实,产生这个问题的原因在于“碰到边缘就反弹”这个命令有多种不同的属性,不同的设置会产生不同的执行效果。

在角色属性区,点击“方向”,会弹出角色朝向设置面板。

在圆盘下面有三个小图标:“任意旋转”“左右翻转”和“不旋转”,它们分别对应了前面鲨鱼翻转的三种形态。

同时,在积木区“运动”分类中,也有相应的“将旋转方式设为()”命令,可以让我们在程序运行过程中,控制角色的翻转属性。

所以,我们现在应当为鲨鱼设置哪种旋转方式呢?

“左右翻转!”

9 完成了鲨鱼角色的控制,我们来看看如何控制潜艇的运行。

“当按下()键”命令用来监听键盘事件。每当我们按下键盘上的按键时,程序就会接收到这个消息,并执行紧跟在键盘事件后面的命令。

我们使用键盘中的上、下、左、右四个按键来控制潜艇的上升、下降、向左和向右行驶。

说明

同控制鲨鱼游动的方式一样,我们在向左和向右的代码块中也设置了“碰到边缘就反弹”命令,并且将潜艇的朝向属性设置为“左右翻转”。

10 想一想,上面代码中的“面向()方向”命令的作用是什么?潜艇的转向和鲨鱼的转向又有什么区别呢?

鲨鱼只有在碰到舞台边缘的时候才会掉头向其他方向游动,而潜艇则是受到键盘指令的控制,只要接收到“向左”或“向右”的指令,就会立即转向相应的方向。

说明

与“碰到边缘就反弹”命令一样,“面向()方向”命令也受到角色朝向属性的影响,当设置了“左右翻转”属性时,角色就只会左右水平翻转,而不会出现潜艇头朝下的奇怪样子了。

11 大家再思考一下,在控制潜艇向左和向右的代码中,“碰到边缘就反弹”命令起到了什么作用?可以去掉吗?

这里的“碰到边缘就反弹”命令是不能随意去掉的,它起到了两个作用:触发角色翻转以及确保角色不会跑到舞台范围之外。

12 现在我们就可以通过上、下、左、右按键来控制潜艇的移动了。但是当潜艇碰到鲨鱼时,驾驶员并没有收到任何提醒,有什么办法可以通知他呢?

我们采用三种方式向驾驶员发出警报提醒:

1 大声喊“救命”——“说(救命啊!)(1)秒”命令

2 拉响警报——“播放声音()”命令

3 潜艇闪烁——“重复执行”“显示/隐藏”命令

13 “说()”命令在制作“逻辑问答”程序时已经详细讲解过了。下面我们学习一下如何给角色添加声音。

1 选定要添加声音的角色。

2 在左侧积木区上方的选项卡中选择“声音”选项卡。

3 点击屏幕左下角的添加声音按钮。

在弹出的声音素材对话框中,可以选定一个声音分类,选择合适的声音后,就可以把声音添加到当前角色中了。

14 最后我们来分析一下如何实现潜艇的闪烁效果。

对于角色的闪烁效果,可以通过控制角色进行“显示”或“隐藏”的方式实现。

那么如何才能有效地控制角色的显示和隐藏呢?我们给出四个选项,大家想一想,选择哪个才能让潜艇的闪烁效果最好呢?

(A)潜艇一直显示,未见闪烁。

(B)潜艇每秒一次缓慢闪烁,而且似乎闪烁会一直持续下去,不会自动停止。

(C)潜艇每秒一次缓慢闪烁5次。

(D)潜艇急促闪烁5次,看到的人都会感到事态紧急。

打开编辑器,马上动手实践一下,验证你的想法吧。

至此,我们就完成了“深海潜艇模拟器”的小程序。经过模拟训练的你,现在可以跟随酷客工程师一起出发去探索海底生物啦。