高级篇——移动三色球2

【疑惑篇】

点击绿旗按钮,出现九列不同颜色的小球,然后三种颜色小球相互交错合并为三列。

视频演示open in new window

亲自操作open in new window

想一想: 如何将小球作为多个角色或一个角色分别实现?

【线索篇】

案例分析

它们发生的场景是什么?

默认白色背景

每个场景中有哪些角色?

每个场景中的每个角色在做什么?

移动三色球1基础上改动:

  1. 改为只用一个角色,实现3组三色球的移动。

积木提示

当绿旗被点击

移动(10)步

移到x:(0) y:(0)

在(1)秒内滑行到x:(0) y:(0)

将x坐标增加(10)

将y坐标增加(10)

y坐标

将大小设为(100)

显示

隐藏

等待(1)秒

重复执行(10)次

如果<>那么

当作为克隆体启动时

克隆[自己]

加法

减法

乘法

等于

建立一个变量

使用变量

将[我的变量]设为(0)

将[我的变量]增加(1)

【解决篇】

移动三色球1中我们已经实现了只用三个角色完成小球的移动。这一次我们将难度升级,增加小球的同时,改为只用一个角色来完成它。

在动手写程序之前,我们可以先来观察一下改动后的小球和原本的小球有什么关联。

观察小球的排列你会发现,如果把之前的黄蓝红三列小球看做一个整体,你可以把它叫做一组三色球,现在的小球是在之前的基础之上增加了另外两组。从每种颜色的小球来看,之前每种颜色小球都只有1列,现在每种颜色变成了3列。

每个小组内小球的移动方式和之前的完全一样,区别是什么呢?它们移动的位置发生了改变。也就是说,我们让小球移动的积木块不需要改变,只需要计算出每一个小球的新位置,改变积木的坐标参数即可。

接下来,我们先来尝试着利用原来已经做好的程序,保留三个角色,将它改变成三组三色球移动。

先来看看当绿旗被点击积木后面的指令串。如果我们将之前使用的重复执行(3)次克隆[自己]积木看作一个整体,这段指令的作用是生成1列小球。那我们只需要在它们的外面再套上一个重复执行(3)次积木,就可以将它们重复执行3次,生成3列小球。

此外,在之前的操作中我们新建了一个“黄球编号”变量来代表每个小球的编号,现在同样可以新建一个“黄球组号”变量来代表每列小球归属的组号。

新建“小组编号”有什么作用呢?

注意观察3组小球的移动过程,它们y坐标的变化和之前的小球完全一样,区别只是每组小球的x坐标发生了改变。只要利用小组编号我们就可以计算出不同小组x坐标值。

在这里我还是将小球横向之间按照相等距离隔开,这样每组小球的x坐标同样满足等差数列公式。

例如,我将第一组黄球、蓝球和红球的x坐标首项a分别定为-200、-150和-100,两组相同颜色小球之间的公差d为150,而公式中的n正好就是小组编号。现在利用等差数列公式就能计算出三组小球的x坐标。

接下来第二步向下滑动的过程各个小球都保持自己的x坐标不变,同样有两种保持x坐标不变的方式。第一种重新利用上一步的等差公式计算一遍。第二种更简单的方法,使用x坐标积木获取每个小球的x坐标。

最后一步,蓝球不变,黄球和红球分别向各自中间蓝球的x坐标移动。它们如何知道各自中间蓝球的x坐标呢?它们只需要利用蓝球x坐标的计算方式计算一遍即可。需要注意的是,三种颜色每个对应小组的组号正好相同,因此可以利用黄球组号和红球组号替代蓝球组号进行计算。

现在我们就已经在不增加角色的条件下实现了3组三色球移动。接下来就该考虑如何继续将三个角色合并成一个角色。

还是先从当绿旗被点击积木后面的指令串进行修改。因为现在只使用一个小球角色,我们可以将之前的“xx球组号”改名为“组号”或者“列号”。之前的“xx球编号”改名为“编号”或者“行号”。

之前每种不同颜色的小球总共有3列,所以在外层使用了重复执行(3)次积木重复生成3次。现在我们可以先不对小球的颜色进行区分,利用相同的方式生成9列小球,只要将外层的重复执行积木参数改为9次即可。

之前我们是通过三个角色来区分小球的颜色,所以当作为克隆体启动时积木后面只需要将角色直接显示出来即可。现在只剩下了一个角色,我们需要想办法来判断,每一个小球应该属于什么颜色,再将它的造型换成对应颜色的造型。具体如何判断呢?

这里有种简单的处理方式。因为小球颜色的排列是有规律的,并且这个规律跟小球的列号相关,我们可以利用对列号求余数的方式得到一个代表不同颜色的数字。

例如,黄球的列号分别是1,4,7,现在有3种颜色,计算黄球的列号除以3的余数,结果都为1,即1代表黄色。蓝球的列号分别是2,5,8,计算列号除以3的余数,结果都为2,即2代表蓝色。红球的列号分别是3,6,9,计算列号除以3的余数,结果都为0,即0代表红色。

接着就可以利用求余的结果作为换成([造型1])造型积木参数,将小球换成对应的造型。

这里会有一个问题,因为我们余数计算的结果是一个数字,如果直接把数字作为换成([造型1])造型积木的参数使用,该数字会被当做造型编号进行判断。例如,参数为1时,角色会切换成造型编号为1的黄球造型。参数为2时,角色会切换成造型编号为2的蓝球造型。参数为0时,因为角色没有造型编号为0的造型,scratch就会将角色换成最后一个紫球造型。

应该如何处理呢?

你可以将小球多余的造型删除掉,让它的最后一个造型为红球。这样参数为0时,就会切换成最后一个红球造型。

另一种方法,你可以给换成([造型1])造型积木中传入一个不是数字的字符串,这时换成([造型1])造型积木就会将参数作为造型名称进行判断。

例如,你可以先修改一下小球的名称,将它们名称横线后面的a、b、c改为1、2、0。再利用连接(苹果 )和(香蕉)积木拼出每个造型的名称作为换成([造型1])造型积木的参数使用。

修改完造型接下来就可以来考虑小球的初始位置。

每一列小球的x坐标还是一样为等差数列分布,只是之前每个角色代表一种颜色,每个角色是把相同颜色的相邻两列距离作为公差使用。

现在所有颜色的小球都由同一个角色生成,所以我们需要改为把任意相邻两列的间距作为公差使用。

例如,将公差d定为50,x坐标首项a定还是定为-200,公式中的n就是列号。

至于每一列小球的y坐标值与之前三个角色时完全相同,只是把原本“xx球编号”替换为了现在的“行号”。

接下来在向下移动之前,小球各自有不同的等待时间。蓝球等待1秒,黄球和红球等待2秒。如何判断哪些是蓝球呢?还是可以利用列号除以3的余数进行判断。如果列号除以3的余数等于2,就为蓝球,那么等待(1)秒,否则就为黄球或红球,等待(2)秒

接下来继续思考每个小球向下移动的坐标。向下移动时,每个小球的x坐标没有改变,直接使用x坐标积木获取当前的x坐标。

至于y坐标,一种简单的方式还是对列号求余数来区分不同颜色的小球,然后按照之前的方式计算各自的y坐标值。

另一种计算y坐标的方式,你可以将三种颜色的小球第一行的y坐标之间也看作是等差数列,通过等差数列公式求出每种颜色的首项a。

再利用一个等差数列公式求出所有小球的y坐标。

最后黄球和红球要向各自中间的蓝球合并。y坐标不变,使用y坐标积木获取当前的y坐标值。黄球和红球需要计算出中间蓝球的x坐标。先将黄球列号+1,红球列号-1,得到中间的蓝球列号。再利用等差数列公式计算出每列蓝球的x坐标。

点击绿旗按钮测试,现在你已经使用一个角色完成了三组三色球移动。最后,为了便于别人能够读懂你的程序,你同样可以将每个步骤的指令串分别放入不同地自制积木中。在新建自制积木时,你可以自己尝试一下,勾选或者不勾选运行时不刷新屏幕选项,对程序的运行会有什么影响?在思考一下,为什么会有这种影响?

除了上面的实现方式外,你还可以尝试着其他的实现方式。例如,生成克隆体时,将所有克隆体的编号从1或者0开始依次往上递增,然后想办法完成案例。

想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window

想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店

Last Updated:
Contributors: lanheixingkong