少儿编程Scratch3.0教程——09 变量积木(项目练习)(文字版)

在上节课少儿编程Scratch3.0教程——09 变量积木(基础知识)中,我们学习了变量积木的使用方法,这节课,我们就一起利用它们来简化之前做过的两个游戏,智力问答和环游世界。


第一,简化智力问答游戏


我们先来一起观察一下智力问答中所写的代码。在企鹅角色中,它会向我们提问,然后判断我们的回答是否正确,每一个提问都对应了一段类似的代码。



如果你还需要增加新的问题,应该怎么做?首先,你需要为新问题增加一个适合的背景图片,然后你需要复制上面的代码,再把询问和回答修改为新的问题。假如,我们现在有10个问题,那就需要复制10段代码,并且里面的绝大部分内容都是重复的,想想就觉得头大有木有?


这时候,变量积木就可以派上用场了。还记不记得上节课中我们说过,变量就是用来存储变化的值,我们只需要将3段代码中发生变化的部分,使用变量积木来替代,其他不变的部分合并在一起就可以了。


接下来,你可以先自己试着做一做,做完以后再来和我的方法进行对比。先给你一个提示,可以使用上节课中说过的并行列表。


好了,我们下面就开始来修改智力问答游戏。


首先,我们一起来观察上面的这3段代码,总结出它们不同的地方。


1、开始事件不同

2、问题不同

3、回答不同

4、当回答正确时,最后一个问题的处理方式和其他问题不同。


接下来,我们就来思考如何通过变量解决这4个不同点,从而将上面的3段代码合并成1段。


我们在上节课学习并行列表时说过,可以将多个列表组合起来使用,然后通过相同的索引获取对应的内容。例如,这个游戏中的问题和答案。因此,我们可以先建立两个列表,一个叫问题,一个叫答案。由于问题和答案都是由企鹅来使用,所以我们可以选择仅适用于当前角色。




接着,按顺序将问题和答案添加进去。需要注意,问题和对应答案的索引必须相同。



接下来,就可以开始利用任意一段代码进行修改,将原有的问题和答案替换为变量。这时你会遇到第一个需要解决的问题,使用问题(答案)第几项积木来获取列表中内容的索引从哪来?怎么知道当前提问的是第几个问题?


你可以有两种解决方式。


第一种方式,就像上节课中说过的如何获取列表中所有内容那样,建立一个变量作为索引号,初始将它设为1,然后每回答对一题,将它增加1。


第二种方式,因为每个问题都对应了一张背景图片,所以你可以调整一下图片的顺序,利用它们的编号作为索引。


这里我选择使用第二种方式,首先调整背景图片顺序,将三个问题的图片放在最前面,编号分别是1,2,3。



接着,就可以使用侦测分类中的舞台背景编号积木作为索引,获取问题和答案。



接下来,我们再来解决第4个不同点。现在你需要考虑的问题是,如何判断当前回答的是最后一个问题?如果是最后一题,就使用问题三中回答正确以后用到的积木块,否则就使用前两个问题回答正确以后用到的积木块。


想一想,最后一个问题的索引是不是和问题列表的长度相等?


所以,刚刚选择索引时,如果你用的是第一种方式,就将建立的变量与问题列表长度比较是否相等。而我用的是第二种方式,就将当前舞台背景编号与问题列表长度比较就可以了。



最后,还剩下第一个不同点,需要使用什么事件来开始执行程序?


之前我们是当星星被触碰之后切换背景,然后使用当背景换成...积木来开始执行。但是这个积木需要选择具体的背景名称,现在我们需要将3段积木合在一起,就不能再使用这个事件。


最简单的方式,我们可以通过消息来解决。当星星被触碰之后发送一个消息通知企鹅,企鹅收到消息之后开始执行上面的代码。


星星发送消息


企鹅接收消息


好了,这样我们就利用变量积木,将原来3段类似的代码合并成了1段代码,是不是少用了很多积木块。并且,后期如果你需要添加新的问题时,你只用按顺序增加新的背景图片,然后在问题和答案列表中增加对应的条目就可以了,不需要对积木块做任何改动。


最后,除了问题和答案之外,你还可以再思考一下,是否还有别的东西可以使用变量来代替?例如,答错的次数,企鹅距离星星的距离。这个问题就留给你作为作业,自己解决它。


第二,修改环游世界


接下来,我们在一起看看环游世界中,有哪些地方可以使用变量来简化它。


修改景点介绍


首先,我们一起来观察一下,每个景点的介绍有没有相同的地方可以合并在一起?例如,企鹅在每次说话时,都会执行相同的操作。首先等待0.5秒,然后切换成造型b,接着说一段景点内容,最后切换为造型a。



有没有想到将每个景点需要说的内容都放入一个列表中,然后就可以通过循环积木来执行这些重复的内容。


首先,为每个景点创建一个列表,放入需要介绍的景点内容。




接着,你就可以利用上节课学过的迭代列表的方式,当切换到某个景点时,取出对应的列表内容进行介绍。



这样一来,如果你需要修改某个景点的介绍内容,只需要修改对应的列表就可以了。


看见上面改完以后的积木块,你有没有感觉和智力问答修改之前的积木块很相似。那能不能像智力问答那样,再把这7段积木合并成一个呢?


答案是,可以选择合并,也可以不选择合并。


我们可以先来观察,上面的积木块和智力问答修改之前有什么区别?它们之间最大的区别是,在智力问答中,每个事件积木下面用到的是列表中的一个条目。而在环游世界中,每个事件积木下面用到的是一个内容列表


这个区别会造成什么问题?


当我们在合并智力问答的积木块时,只用将问题和答案存入各自的列表中,然后使用问题(答案)第几项积木就可以获取到所有的问题和答案。


而环游世界中每个景点的介绍内容,分别存入了不同的列表中,这时你就没办法通过积木的方式直接获取到的景点内容,你必须先手动选择需要使用的列表,然后在用...第几项积木获取对应的景点介绍内容。


那是不是就没有办法合并了呢?其实也有方法可以合并。


第一种方法,你可以通过景点图片的编号来判断当前进入的是哪个景点,然后进入对应的如果...那么...积木中去执行介绍景点的积木块。这种做法有一个问题,每个如果...那么...积木中还是需要重复使用相同的积木来介绍景点,因此合并后的积木块数量并不比合并之前减少很多。并且,每个景点企鹅的初始位置不同,所以你还需要另外两个列表来存放它的x和y坐标。



第二种方法,上面的方法之所以积木块数量并没有减少,是因为每个景点的介绍内容都存放在不同的列表中。而Scratch中没有积木可以直接获取到多个不同列表的内容。那你是不是可以想到,如果将所有景点的介绍内容都存入同一个列表中,是不是就可以将如果...那么...积木中的积木块也合并起来?


确实如此,但是这样做之后会产生一个新的问题,你如何知道每个景点的介绍内容,在列表中的索引号是多少?


为了解决这个问题,你需要再建立1个列表,用来存放每个景点介绍内容的项目数(如果项目数相同可以省略,直接用数字代替)。接着,先获取当前景点企鹅坐标,移动到相应位置。然后,根据每个景点介绍内容项目数,计算出当前景点介绍内容的起始索引。最后,通过景点介绍内容项目数当前景点介绍内容的起始索引,循环获取当前景点的介绍文字,进行介绍。



这样一来,7段积木块就合并成了上面这1个,看上去积木块的数量确实减少很多,但是这也会带来新的麻烦。


例如,增加了多个列表(企鹅x坐标、y坐标、景点内容项目数)和变量(介绍内容起始索引、景点内容项目数索引),逻辑过程不易于理解,介绍内容放在一起后不容易对每个景点进行区分,如果景点数量很多不利于维护。


所以,是否进行合并,需要根据实际情况进行判断,选择一种对自己后期工作量影响最小的方式,没有绝对的标准。


修改圆点


在这个游戏的角色中,有1个企鹅和7个圆点,每个圆点的积木块基本相同,能不能将它们合并成一个角色呢?


我们还是先来看看,不同圆点角色的积木,有哪些不同的地方。


1、显示位置不同。

2、初始造型不同。

3、被点击后切换的背景不同。



接下来,你还是先自己思考一下,如何解决上面的三个不同点,将7个角色合并成1个。


首先,你需要考虑是,删掉的这6个圆点从哪来?不知道你脑子里面想到的第一个东西是不是克隆。


你可以使用克隆积木复制6个圆点。因为它们的显示位置不同,所以你需要使用两个并行列表来存储每个圆点的x和y坐标。需要注意的是,两个坐标列表的索引号一定要跟背景编号对应起来。例如,索引1的坐标是长城,在背景中就要把长城图片放在第一个,背景编号为1。




为了方便,你可以将7个圆点坐标都放入这两个列表中,通过循环积木迭代其中任意一个列表,在循环中获取列表坐标,作为将克隆圆点的初始位置,然后切换角色造型,再进行克隆。


但是,还有老问题,使景点x坐标(景点y坐标)第几项积木的索引从哪来?你需要再建立一个变量叫做景点编号,编号初始设为1,每次重复执行将它增加1。



需要注意的是,坐标列表的长度为7,所以循环了7次,生成了7个克隆体,原始角色就不再需要了。你可以将它的初始显示状态设置为隐藏,或者在重复执行之后使用隐藏积木将它隐藏起来。



接着,当作为克隆体启动时,将克隆体显示出来,开始执行闪烁效果。



接下来,就需要解决第二个不同点,克隆体被点击时,如何将背景切换到不同的景点?还记不记得上节课中,如何利用克隆和变量积木,让启动的克隆体执行不同的任务?


使用相同的方法,当你在建立景点编号变量时,需要选择仅适用于当前角色,这样每个克隆体就有了自己所代表的景点编号。当角色被点击时,你只需要使用如果...那么...积木判断一下当前角色的景点编号是多少,就可以切换到相对应的背景去了。



最后,别忘了克隆体使用完以后需要将它们删除掉,应该在哪里进行删除呢?是不是当点击某个圆点,进入景点背景时,它们就不再需要了。因此,只要将原来当接收到“我被点击了,快藏起来”积木下面的隐藏积木,替换成删除此克隆体积木就完成了。



最终,我们将原有的8个角色变成了2个角色,并且当你需要增加别的景点时,角色的数量也不会发生改变。你只需要按顺序增加景点背景图片,当角色被点击时的编号判断,以及景点介绍内容的列表就可以了。这就是变量积木所带来的好处,将会变化的东西通过变量积木来统一管理。



以上就是这节课的全部内容,让你学习了如何利用变量积木,让程序变的更加简洁,并且减少了后期游戏内容修改所带来的工作量。你在开发的过程中需要不断的思考,哪些东西在游戏中会发生变化?是否可以用变量来替代它?


编程是一种平衡的艺术。通常情况下,代码数量越精简越好,但是如果只为了减少代码数量,反而增加了其他部分的复杂度(例如,修改景点介绍时所提到的,如果合并积木块,将会增加列表条目维护的工作量和代码的可读性),你就需要做出评估,是否真的有必要这样做。


编程就像许多日常生活中的问题,没有固定的标准答案,而是需要根据现有条件,找出一种简洁且优雅的解决之道,这也是评判一个人编程水平的标准之一。顶级程序猿所写的代码,就像木心的诗集,使用一些简单的文字就能让你体会到美的感受。而菜鸟程序猿的代码,不时就会散发出一种让人讨厌的坏味道。


最后,还是那句话。只有自己多动手练习才是学习编程的最快捷径。我之后会录制一个视频教程供你参考,如果你在学习过程中遇到问题无法解决,可以扫码关注我的微信公众号“梦世界”给我留言,我会对你的提问一一进行解答。


Talk is cheap. Show me the code...




如果你看完以上内容,对少儿编程感兴趣,有想学习编程或者数学思维课的小朋友,欢迎给我留言。如果你有Web应用系统、手机APP、微信小程序等软件开发的需求,也欢迎给我留言与我联系。期待能与你共同进步。。。

0条留言

留言