高级篇——基础口算练习

【疑惑篇】

点击绿旗按钮开始游戏。

点击选择练习模式,20以内的加减法、两位数的加减法、100以内的乘除法。

点击游戏设置,可设定每局游戏的时间(默认30秒),自动切题时间(默认3秒)。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

Jurassic

  1. 进入Jurassic背景循环播放背景音乐
  2. 显示计算类型按钮
  3. 点击计算类型按钮,进入Blue Sky背景,开始口算练习
  4. 显示恐龙,说出游戏提示
  5. 显示游戏设置按钮
  6. 点击游戏设置按钮,通过恐龙询问的方式对游戏时长和切题速度进行设置

Blue Sky

  1. 根据设置的游戏时长显示倒计时
  2. 显示题目
  3. 点击舞台或按下任意按键切换题目
  4. 根据切题时间自动切换题目
  5. 倒计时结束,进入Night City背景

Night City

  1. 显示答题总数
  2. 显示题目和答案列表
  3. 显示重新开始按钮
  4. 点击重新开始按钮,返回Jurassic背景

积木提示

当绿旗被点击

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

说(你好!)

换成([造型1])造型

换成([背景1])背景

显示

隐藏

造型[编号]

背景[编号]

播放声音([喵])等待播完

当按下[空格]键

当角色被点击

当舞台被点击

当背景换成[背景1]

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

停止[全部脚本]

当作为克隆体启动时

克隆[自己]

删除此克隆体

询问(你叫什么名字?)并等待

回答

计时器

计时器归零

加法

减法

乘法

除法

在(1)和(10)之间取随机数

大于

小于

等于

连接(苹果 )和(香蕉)

(苹果)的第(1)个字符

(苹果)的字符数

变量

自制积木

解决篇

提到数学,想必所有人都是从认识0123456789这个十个数字开始学习。提到计算,又都是以这十个数字相互之间的加减乘除开始学习。在此基础上增加其他的运算规律,变为更复杂的运算。因此,熟练个位数之间的加减乘除计算,就是学习数学计算最为基础的练习。

如果一个小朋友在考试中时间总是不够用,很有可能就是计算速度拖了后腿,这个小游戏也就是为他们所准备的练习游戏。

在你进行一个项目开发时,会遇到两种情况。

第一种情况,你已经对项目有了完整的想法,知道里面包含的每一个功能。这就类似于你现在通过我给出的案例进行学习时,已经可以看见案例有哪些背景、角色和功能,开发过程中只需要对它进行前面的案例分析,最后按顺序将它们实现即可。

第二种情况,你可能对要做的内容没有清晰的想法。例如,你开始只是想做一个个位数加减计算练习的小游戏。做完后又想到给它增加乘除法,接着又想从一位数计算变成两位数计算,接着再增加计时功能和游戏设置功能等等。

在之前的案例中,我主要是以第一种情况进行讲解。这一次,我就来模拟第二种情况,按照下面的功能演化顺序,看看我们如何从一个最简单的加法计算游戏,一步一步让它变的越来越复杂。在实际开发过程中,你需要对下面的每一步演化过程都做案例分析,从而按照分析结果来实现它们。

功能演化顺序

  1. 一位数加法计算
  2. 一位数减法计算
  3. 一位数乘除法计算
  4. 两位数加减法计算
  5. 计算类型选择
  6. 倒计时功能,以及题目和答案显示
  7. 自动切题
  8. 游戏时长和切题时间设置

好了,接下来我们就开始来实现它。

1. 一位数加法计算

最初,因为自己的口算不太好,所以你想做一个简单的一位数加法练习游戏。每次只需要在舞台上随机显示两个一位数相加,点击舞台后可以切换成另一组数字。

首先,你选择了Blue Sky作为你的游戏背景。接着,增加了一个数字角色,并将数字1到9作为它不同的造型。

既然是做加法练习,你还需要在数字中间显示一个加号。你在犹豫是要增加一个角色还是将它也作为数字的造型。最终决定先尝试着将它作为造型,添加在数字后面使用。

接下来,你就需要来思考如何将题目显示在舞台?

你需要显示的有三样东西,两个数字和加号。之前你已经学习过克隆,你需要将数字角色生成三个克隆体一字排开即可。

现在你已经将数字和加号显示在舞台上,但是每次显示的数字都是固定的,如何能让它们变成随机的数字?

提到随机数字你马上就想到了使用在(1)和(10)之间取随机数积木。你先获取一个1-9之间的随机数,然后将它作为换成([造型1])造型积木的参数使用。

现在每次点击绿旗按钮后,舞台上就会显示不同的随机数加法。

接下来,你想给游戏加上背景音乐,照例你将该操作交由舞台来完成。

有了背景音乐,你就不能再通过点击绿旗按钮切换题目,不然每次音乐都会重头开始播放。你计划将游戏变为当舞台被点击后,切换成不同的题目。

当舞台被点击积木只有舞台可以使用,为了让数字角色知道舞台什么时候被点击了,你在当舞台被点击积木后面增加了一个广播[切换题目]积木,这样数字角色就可以接收消息切换题目。

点击绿旗按钮进行测试,因为每次显示不同的题目时,都会克隆新的数字和加号,之前的数字使用完后又没有被删除,你看见了很多数字和加号堆积在了舞台上。

如何解决这个问题,你马上想到数字角色当接收到[切换题目]消息时,需要先删除旧的克隆体,再克隆新的克隆体,于是你把指令改成了下面这样。

点击绿旗进行测试,这一次非但没解决数字重叠的问题,还变成了只剩下一个数字。这是为什么?

出现这个问题的原因与认识字母中字母重叠类似。当舞台广播[切换题目]消息时,原始角色和每个克隆体都会接收到消息,并且它们执行当接收到[切换题目]这两个指令串的顺序是不固定的。

当左边的指令串先被执行时,每个克隆体和原始角色都克隆出了三个新的数字角色。接着右边的指令串开始执行,旧的克隆体将自己删除。最终舞台上留下了很多堆积的数字。

为了保证先执行右边的指令串删除克隆体,再由原始角色独自执行左边的指令串生成新的克隆体,你可以在左边的指令串最前面增加一个等待(1)秒积木,时间可以设置的非常短。

在这个步骤中,舞台中的数字只是为了显示出来给人看,并不需要对它们做其他操作。除了能像上面一样,通过克隆来实现之外,你还可以使用画笔分类中的图章积木来实现。

ZGqzsr

它的用法很简单,当你将角色移动到舞台中时,点击一次图章积木,舞台上就会多出一个与该角色一样的画像。

图章看上去与克隆体非常相似,但是它们的使用有很大的区别。

你可以将克隆体想象成一个与角色一模一样的活人,可以通过指令去调整它的位置大小颜色,让它说话发出声音等等。

图章只是印在舞台上的一张画像,一旦它被印出来,你就不能对它做任何的改变。

当你想要删除克隆体时,需要使用删除此克隆体积木。当你想要删除图章时,就和清除其他画笔所画的痕迹一样,需要使用全部擦除积木。

所以当你想要复制一个角色时可以考虑一个问题,你需要对复制出来的角色做操作吗?如果需要做操作,就使用克隆。如果不需要做操作,可以考虑使用图章。

在这个案例中,数字和加号都只需要显示在舞台上,不用做任何改变。因此,可以利用图章来代替克隆体。

修改也很简单,每当需要显示新题时,先将舞台全部擦除,接着还是将角色换成对应的造型,移动到各自的位置,再将原本的克隆[自己]积木替换为图章积木即可。

2. 一位数减法计算

加法计算已经完成,接下来你想同时也练习一下减法计算。首先,你还是在数字角色中添加一个减号造型。你将加号造型复制一份,然后将加号替换成减号。

接着,你在换成加号造型的地方也使用了一个在(1)和(10)之间取随机数积木,参数就是加号和减号造型的编号,这样就可以随机切换成任意一个造型。

点击绿旗按钮进行测试,现在符号倒是已经如你所想可以自由切换了,可是又出现了两个新问题。

第一个问题,在随机出现的题目中,有可能会出现一个小数减一个大数的情况。因为你还不想涉及负数的运算,所以希望第一个数字要比第二个数字大。

第二个问题,你所希望的减法练习中,第一个数字不光只有1到9,还应该包含18以内的其他数字。

如何解决呢?

或许你能想到这样一种做法。将加法和减法分为两个不同的判断。例如,如果获取符合的随机数等于10,就生成加法运算,否则就生成减法运算。再生成减法运算时,第一个数字可以在1和18之间取随机数。

这样做的话比较麻烦,并且减法运算的部分,第二个数字依然可能比第一个数字大。

想一想,加法和减法之间有什么关系?

加法是将两个数合在一起,计算合并以后的数是多少?减法和加法正好相反,它是从一个数中取走一部分,计算剩下的部分是多少?

假如我们现在有两个数,a和b,加法计算就是将a+b算出和为c,也就是a+b=c。反过来,你是不是可以将减法看作是从c中取走a,剩下的就是b,也就是c-a=b。通过上面的转换,你就可以通过三个一样的数字,即表示出加法运算,又表示出减法运算。

具体应该怎么做呢?

上面的三个数字abc是不是相当于我们使用的变量。现在就可以先建立三个变量,名字分别是a、b、c。

接下来,我们需要为它们分别设值。a和b表示加法计算中的两个加数,因此还是使用在(1)和(10)之间取随机数即可。c呢?它是a+b的和,只需要使用加法积木将a和b加起来即可。

好了,现在三个数字已经设置好。接下来就要根据随机选出的运算符号来使用它们。

当你使用在(1)和(10)之间取随机数积木挑选出运算符号后,你需要先根据这个随机数来判断第一个数字应该使用a或b,还是使用c。此外,你还要将它作为换成([造型1])造型积木的参数,把角色切换为对应的符号造型。

为了可以重复使用这个代表符号的随机数,你需要新建一个“运算符号”变量,将随机数存入其中。

接着就可以利用该变量值进行判断,以及做为换成([造型1])造型积木参数使用。

现在我们算式的结构已经完成,但是程序还有一个bug。当c大于9时,你会发现舞台上只会显示一个数字。如何解决呢?

观察一下我们显示一个数字的步骤,每次都是先将角色换成对应造型,然后移到某个位置,并且不同位置之间的区别是x坐标不同,最后用图章将它印在舞台上。

有没有想到可以将这几个步骤封装成一个自制积木,步骤中变化的部分就是自制积木的参数。

新建一个自制积木叫做印数字,添加两个椭圆形参数,一个叫数字,一个叫x坐标。因为不需要看见自制积木执行的过程,所以可以勾选上运行时不刷新屏幕选项。

假如参数的数字比10小,只需要像之前的用法一样,利用换成([造型1])造型积木、移到x:(0) y:(0)积木和图章积木将它显示出来即可。

如果数字是两位数呢?是不是需要将上面的操作重复两遍,将十位数和个位数分别印在舞台上。如果数字是三位数呢?是不是需要将上面的操作重复三遍。也就是说,我们可以利用重复执行(10)次积木,将数字中每一位数单独取出来印在舞台上。

需要注意的是,如果是多位数,还要利用等差数列公式让每个数字保持一定的间距。

制作完成后你可以单独测试一下它。先将舞台全部擦除干净,然后在积木中填入一个数字,再设置一个x坐标位置,最后点击一下该积木,看看你所填入的数字能不能正常印在舞台上。

通过测试你会发现现在的积木还有一个问题,那就是我们忘记了增加数字0。

因为数字角色1-9的造型编号刚好与数字本身一一对应,所以当你给换成([造型1])造型积木传入1-9作为参数时,正好可以切换为对应的数字造型。

如何选中数字0的造型呢?

在这里有个小技巧。造型列表中并没有编号为0的造型,当你给换成([造型1])造型积木传入0为参数时,你会发现它将切换为最后一个造型。如果传入的参数为-1,就会切换为倒数第二个造型。参数继续减小,造型就会继续从下往上切换。也就是说你可以通过减小参数,自制一个“上一个造型”积木。

回到案例中,既然参数为0时,角色会切换为最后一个造型,所以你只用在造型列表的最后增加一个数字0的造型即可。

现在通过这个自制积木已经可以显示多位数,最后就可以使用它来替换之前完成的指令。

现在还可以在继续观察一下指令串,实际上运算符号在舞台的显示方式也和数字是一样的,先切换造型,再移动位置,最后使用图章印在舞台上。也就是说,我们刚刚制作的印数字积木,也可以用来印运算符号。但是使用时你会遇到一个问题,运算符号的造型编号和某些数字是重复。

例如,现在加号的造型编号是10,当你给印数字积木传入的第一个参数为10时,它应该如何区分要显示数字10,还是显示加号呢?

或许你可以想到一个解决方法,例如当需要显示数字10时,我们就传入10。当需要显示加号时,我们就传入一个“+”。这样我们就可以在定义印数字积木时,增加一个判断条件,来显示数字或者加号。

接着你就可以将原本使用三个积木来显示运算符号的地方,改为使用印数字积木完成。别忘了,改动时需要根据随机获取的符号数字来判断应该传入“+”还是“-”。

这是一种利用印数字积木显示符号的处理方式,除此之外还有另外一种方式。

在之前我们已经说过,当给换成([造型1])造型积木的参数传入0时,它会切换为最后一个造型。如果传入的参数为-1,就会切换为倒数第二个造型。传入-2,就会切换为倒数第三个造型,以此类推。

因为我们的游戏只会涉及正数的运算,我们就可以将负数作为不同符号的传入参数,这样在定义印数字积木中只需要增加一个判断,如果数字参数小于0,就是要显示符号,否则就是要显示数字。

接着,在获取代表运算符号的随机数时,把原来的10和11改为从-1和-2之间获取随机数,这样就能将它们作为参数直接使用。

3. 一位数乘除法计算

既然做完一位数的加减法练习,紧接着你还想继续做乘除法的练习。想一想乘除法和刚刚的加减法有什么联系?

刚刚我们是用了三个变量来表示加减法的运算,a+b=c,c-a=b。乘除法是不是也很类似。只需要将加法运算中的加号替换为乘号,就是乘法运算,即axb=c。反过来,让c除以a和b中其中一个数是不是就可以得到另外一个数,即c÷a=b。

现在我们首先要做的是在数字角色的造型中增加乘法和除法符号。要注意不同符号所在位置需要传入印数字积木中的参数值。

接下来,a和b变量的值不需要改变,同样直接使用在(1)和(9)之间取随机数积木获取即可。但是c的值,之前只有加减法,我们是通过a+b的计算获得。现在多了乘除法,我们就需要增加一个判断,如果是加减法,那么c=a+b,否则c=axb。

接下来显示数字时同样需要修改一下判断条件,如果是加法或者乘法,第一个数字就显示a,否则就显示c。

点击绿旗按钮测试一下,现在我们舞台上已经可以生成加减乘除任意一种计算题目了。

如果你观察一下当接收到[切换题目]积木下面的指令之间的关系,你可以把它们分成三个部分。

第一步,通过全部擦除积木清除舞台中的题目。第二步,为a、b、c和运算符号这几个变量设值,也就是在生成题目。第三步,利用印数字积木将题目显示在舞台上。

当然你还可以将清除舞台和显示题目看做是一个步骤,因为你在显示新题目之前当然需要把旧题目先清理干净。如果将它们封装到单独的自制积木中后,就变成了下面这样。

4. 两位数加减法计算

现在难度继续增加,你不光想做一位数的加减乘除运算,还想做两位数的加减法运算。应该怎么调整程序呢?

我们的程序现在已经分为了两部步骤,第一步生成题目,第二步显示题目。

我们现在要把计算的数字从一位数变成两位数,也就是说需要把定义生成题目积木中变量的取值范围扩大。

例如,将原本a和b的取值范围从1至9之间取随机数,改为从1至50之间取随机数。

这样一来,你不需要改变定义显示题目中的任何指令,就可以将原来的一位数计算扩展为两位数计算。

当然别忘了,需要扩展成两位数的只有加减法,乘除法还是保留原本的随机数取值范围。

上面的改动会有一个小问题,进行加法计算时,两个加数都会小于50,例如不会出现63+14这样的题目。你能不能想办法将加数的范围变为1至90,并且要保证两个数相加后不能超过100。这个问题就留给你自己来解决了。

5. 计算类型选择

你已经有了三种不同类型的计算题(一位数加减,一位数乘除,两位数加减),你在每次点击舞台后他们会随机出现。现在你想要再增加一个功能,能不能只选择其中一种类型的题目来做专项练习?

首先你想到的方法是,可以在定义生成题目积木的指令串中,增加一个“题型”变量来做判断,如果题型为1,那么就生成一位数加减法。如果题型为2,那么就生成一位数乘除法,如何题型为3,那么就生成两位数加减法。

改完以后确实已经可以生成不同的题型,但是这样操作并不方便,你每次都要手动去修改变量值。你想到了之前案例中通过按钮来控制不同游戏难度的方法,现在也可以增加一个新的背景,在上面增加几个按钮,通过点击按钮的方式来选择题型。

于是你增加了一个Jurassic背景作为主界面。又增加了一个按钮角色,用来做不同题型的选项。又增加了一个恐龙角色,用来做游戏说明。

现在舞台当绿旗被点击后从只播放背景音乐变成先换成([Jurassic])背景,再播放背景音乐。

此外,当舞台被点击时,还增加了一个判断,如果背景名称等于Blue Sky时才广播[切换题目]消息。

数字角色的当绿旗被点击积木后面增加了一个全部擦除积木,避免重新开始时,在Jurassic背景上还保留着之前的题目。

另外,将原本的广播[切换题目]积木移动到了当背景换成[Blue Sky]积木后面。

新增的恐龙角色当背景换成[Jurassic]积木时,就显示在舞台下方,说出游戏提示。当背景换成[Blue Sky]时,就隐藏起来。

最后是新增的按钮角色。当背景换成[Jurassic]时,克隆出三个按钮角色,将它们换成不同的造型,在舞台上一字排开。当其中一个克隆体被点击时,你只用将它的造型编号作为题型变量的参数值,然后再换成([Blue Sky])背景就可以开始所选题型的练习。别忘了,当背景换成[Blue Sky]时,要将克隆体删除。

原本数字角色用来设置题型变量值的积木就不再需要,将它删除。

6. 倒计时功能,以及题目和答案显示

你现在每天都会利用这个游戏来练习口算,你还把它介绍给了其他朋友。某一天一个朋友对你说,我们来比赛看谁答对的多怎么样?你觉得他的提议不错,但是如果没有一个时间限制,你们要如何比较谁答对的题目多呢?于是你决定给游戏增加一个倒计时功能。

你先建立了一个倒计时变量,然后交由舞台来控制它。当背景换成[Jurassic]时,先将它隐藏起来。当背景换成[Blue Sky]时,先将它设置为你们的比赛时间,例如30秒,然后显示出来。接着,你又用重复执行直到<>积木配合等待(1)秒积木,让倒计时每等待1秒后就减1,直到倒计时归零,退出循环。最后,游戏结束将倒计时隐藏起来,另外增加一个Night City背景作为游戏的结束背景。

现在有了结束背景,当背景换成[Night City]时,数字角色就需要将舞台上的数字全部擦除

倒计时功能已经做好了,但是比赛结束时你们还需要统计出各自答出了多少道题。

你想到可以通过列表将每次回答的题目存入里面,这样游戏结束时既可以知道自己答了几道题,还可以看见每道题的题目和答案是什么。

在这里,你可以建立两个列表将题目和答案分开存储,也可以只建立一个列表将它们合在一起。

当前的程序中,当数字角色接受到切换题目消息时,我们先生成题目,然后将它显示出来。现在除了完成以上两步,还需要增加一个保存题目的功能,同样可以新建一个自制积木来完成它。

具体如何保存呢?很简单,只需要对运算符号进行判断,把a、b、c三个变量按照各自的公式拼接在一起就可以了。

因为每次换成Blue Sky背景时,相当于重新开始游戏,所以在出题之前,需要把之前的题目列表全部清空。

题目已经保存完成,和倒计时变量类似,最后需要在不同的背景让它隐藏和显示。你同样可以将此操作交由舞台来完成。

在Scratch中,列表的左侧会显示每个项目的索引,底部还会显示列表中项目的总数量。如果你使用Scratch转换器将程序转换成了HTML页面,这时列表左侧的索引和底部的总数都会被删除。

为了在转换后方便知道列表中有多少项目,你还可以单独增加一个题目总数的变量显示在舞台上,变量值就是列表总数。

进入结束画面后,为了不用点击绿旗重新开始游戏,你又增加了一个重新开始的按钮。

当背景换成[Jurassic]时,隐藏该按钮。当背景换成[Night City]时,显示该按钮。当它被点击时,就可以返回Jurassic背景,重新开始游戏。

7. 自动切题

现在每次答完一个题目后,你都要点击一次舞台才能进入下一题。你感觉这样太麻烦了,想再增加一个自动切题的功能。每次出题后只要到了设定的时间就会自动换成下一题。

首先你要解决的问题是如何计时?你想到了可以使用计时器

当背景换成[Blue Sky]时,使用重复执行积木不停的判断计时器的时间,如果时间超过了自动切题的时间,例如3秒钟,就自动切换题目。每次切换题目后都要重新计时,让计时器归零

当背景换成[Night City]后,使用停止[该角色的其他脚本]积木停止计时器的循环判断。

为了方便控制自动切题的时间,你想到了也将它作为一个变量,通过设置变量值进行控制。

8. 游戏时长和切题时间设置

与之前的题目类型需要手动设置类似,现在的倒计时和切题时间必须手动修改积木中的变量值,你希望可以在游戏过程中通过某种方式来修改它们。

你想到了可以像电子闹钟里一样,利用这两个变量的滑杆模式来修改它们。

此外,你还想到了另一种更简单的方法,利用询问(你叫什么名字?)并等待积木让玩家来输入变量值。

先将数字角色中设置切题时间的积木和舞台中设置倒计时的积木一起移动到舞台的当绿旗被点击积木后面,作为这两个变量的默认值。

接着,为重新开始按钮增加一个游戏设置的新造型。

现在,当背景换成[Jurassic]时,你需要将它切换为游戏设置的造型,然后显示出来。

别忘了它现在有了两个造型,当背景换成[Night City]时要将造型换成重新开始。当背景换成[Blue SKy]时将它隐藏起来。

接着,当按钮被点击时也需要增加判断,如果当前背景是Night City,就将舞台换成Jurassic背景。如果当前背景是Jurassic,就开始通过询问的方式设置倒计时和切题时间的变量值。

具体如何设置呢?

可以广播[开始游戏设置]消息,让恐龙接受到消息后来询问玩家,由玩家自己输入变量值。游戏设置的过程中,游戏设置按钮和题目类型按钮都可以先隐藏起来,等设置完成后再重新出现。

在你隐藏题目类型按钮时,可能会遇到比较隐蔽的小bug。如果在恐龙询问完成后,同样是通过广播消息的方式来通知其他角色显示出来。

对于题目类型按钮来说,接收到消息显示出来的不光有克隆体,还有原本的角色。

当你点击其中一个按钮换成Blue Sky背景后,之前我们只是删除了克隆体,没有隐藏原始角色,所以它会继续显示在舞台上。

怎么修改这个bug,你只用在当背景换成[Blue Sky]积木的后面增加一个隐藏积木,让原始角色隐藏起来即可。

除此之外,当恐龙询问完成之后还有另外一种方式来恢复按钮显示。你不用发消息通知其他角色,改为使用换成([Jurassic])背景积木。这样就相当于让程序重新进入一次Jurassic背景,各个角色就会重新执行一遍原本的操作显示出来。

需要注意的是,如果你使用的是这种方法,当题目类型按钮接收到开始游戏设置消息时,你就不能使用隐藏积木让它们隐藏,必须使用删除此克隆体积木将它们删除,避免换成([Jurassic])背景时多次重复克隆。

这样一来,你就从一个最简单的加法练习功能,一步一步将它改造为完整的基础口算练习小游戏。

你在完成一个自己的作品时,往往不可能一开始就将每个细节都想得很完美。大部分时间都是在对功能一次一次地迭代中慢慢完善它。包括我在编写本教程中的很多案例时,最初编码时会使用一种思路来实现。到了写教程时,因为思路发生改变,又会用另外一种方式来重新实现它。

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

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

Last Updated:
Contributors: lanheixingkong