高级篇——舒尔特方格

【疑惑篇】

点击绿旗按钮开始运行,先选择练习的数字个数,进入游戏后按照从小到大的顺序依次点击数字,比赛谁用时最少。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

默认背景和带文字的背景。

每个场景中有哪些角色?

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

  1. 点击绿旗按钮,进入游戏选择界面,开始循环播放背景音乐。
  2. 展示数字个数选择按钮。
  3. 点击数字个数按钮,进入游戏界面,展示对应个数的方格,开始计时。
  4. 从数字1开始递增,依次点击对应数字的方格。点击正确数字,播放正确音效,方格闪现正确颜色。点击错误数字,播放错误音效,方格闪现错误颜色。
  5. 点击完所有数字,进入结束界面,小猫说出最终用时。点击小猫重新开始游戏。

积木提示

当绿旗被点击

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

说(你好!)

换成([造型1])造型

下一个造型

换成([背景1])背景

将大小设为(100)

将大小增加(10)

将[颜色]特效设定为(0)

将[颜色]特效增加(25)

清除图形特效

显示

隐藏

造型[编号]

大小

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

播放声音([喵])

当角色被点击

当背景换成[背景1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

停止[全部脚本]

当作为克隆体启动时

克隆[自己]

删除此克隆体

计时器

计时器归零

加法

减法

乘法

除法

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

大于

小于

等于

不成立

连接(苹果 )和(香蕉)

余数

[绝对值]

建立一个变量

使用变量

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

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

显示变量[我的变量]

隐藏变量[我的变量]

建立一个列表

使用列表

将(东西)加入[列表]

删除[列表]的全部项目

[列表]包含(东西)?

[列表]的项目数

解决篇

舒尔特方格是一种用来提高注意力的小游戏,搜索一下”舒尔特方格“,你会发现网络上有很多介绍它好处的文章,同时也会有质疑它效果的声音。

舒尔特方格的玩法很简单,在一张纸上画有25个格子,格子中是将1~25的数字打乱后放入,玩家比赛谁能用最短的时间从1找到25的位置。这个案例中我们就来自己实现一个舒尔特方格游戏。

第一步,添加背景。

在这个游戏中,我们将游戏分为了三个场景。主菜单界面,游戏界面和结束界面。为了开发时方便处理,我们可以将背景分为三个。

前两个是默认的白色背景,第三个在白色背景上写上结束时的“WIN”字。

第二步,添加角色。

这个案例中用到了几个角色呢?首先,有默认的小猫在结束时播报你的用时。还有游戏菜单中你所选择的按钮和进入游戏后显示在舞台上的方格。按钮和方格是一个角色还是多个角色呢?你可以将每个按钮和方格都新建一个角色去控制它们。不过为了让程序更简洁,我更建议你把按钮和方格各自只使用一个角色,然后使用克隆来复制它们。

先添加按钮角色,在按钮上写上“4个数字”,复制为多个造型,最后修改每个造型上的文字。为了让方格能拼出一个正方形,按钮上的数字都是平方数,4、9、16、25、36、49,从上至下依次递增。

接着添加方格,你可以通过绘制工具画出它们。在你画方格时有几个小窍门。

当你选中矩形工具,在上方调整好矩形内部的颜色和外框的颜色后,直接在绘图区拖动鼠标,这时你可以画出任意形状的矩形。如果你想画的是正方形,可以在按住Shift键的同时拖动鼠标,这时就只能画出正方形。

当你画好方格后,你的方格有多大呢?在最初的案例中我们就介绍过舞台的大小是固定的,长为480,宽为360。注意观察绘图界面,它是由一个一个的小方格所组成,你可以数一数界面中的长和宽各自有多个个小方格,答案是长有120个,宽有90个。换句话说,我们每一个小方格的边长为4。你现在画自己的正方形时,可以刚好填满几个小方格,从而就可以算出大方格的边长是多少。

例如,我画的方格边长由16个方格组成,每个小方格的长度为4,我画的方格边长就为16x4=64。

此外,在最初的案例中我们还介绍过角色具体的坐标位置,是由它与绘图界面中心点的重合部分所决定,在这里我们可以将方格的左上角与中心点重合。这样在结合刚刚计算出的边长大小,在之后的开发中,我们就能很容易在舞台的中央将多个方格拼接成一个正方形。

最后,在方格中间写上数字,从1到49,每个方格的数字刚好与它的造型编号一致。你在制作的过程,可以按照上面说的方式先绘制好数字1的方格,接着对它进行复制,这样后面的方格你就只用修改数字即可。

第三步,使用指令积木实现程序。

1. 点击绿旗按钮,进入游戏选择界面,开始循环播放背景音乐。

第一步很简单,我们还是在舞台中操作。当绿旗被点击后,先换成([主菜单])背景,接着循环播放背景音乐。

接下来就根据切换到的不同背景开始让角色完成各自的任务。

2. 展示数字个数选择按钮。

当背景换成[主菜单],小猫和数字方格都要隐藏起来。

接下来就是重点考虑如何利用克隆体显示数字个数按钮。

照例,使用克隆时原本的角色可以隐藏起来,我们需要六个按钮,所以需要使用重复执行(10)次克隆[自己]积木将角色克隆6次。当作为克隆体启动时再将它们显示出来。

光显示出来还不行,你还需要将它们切换成不同的造型,并将它们放到不同的位置上,以便玩家可以区分它们。

切换不同造型很简单,在重复执行之前先将角色换成第一个造型,之后每克隆一次,就将让角色换到下一个造型。

如何移动到不同的位置呢?

一种方法是先确定它们各自的位置,然后利用移动三色球中的方法,通过角色的造型编号或者仅适用于当前角色的变量区分每一个按钮,然后将它们移到各自的位置。

另一种方法,找出每个按钮的坐标的规律,计算出每个按钮的坐标值。例如,我将造型编号为1、3、5的按钮x坐标设置为-90,造型编号为2、4、6的按钮x坐标设置为90。造型编号为1和2的按钮y坐标设置为80,然后下面的按钮以80为间隔递减。

你可以把移动克隆体的操作放在当作为克隆体启动时积木之后,相当于每个克隆体克隆完成以后再自己改变自己的坐标。

你也可以把这个操作放在克隆[自己]积木之前,相当于原始角色先移到每个按钮的位置之后,再克隆自己。

上面使用了计算分类中的[绝对值]积木。将第一个参数选为向下取整,第二个参数传入一个数字,它可以计算出小于或等于该数字的最大整数。例如,1.1、1.5和1.8向下取整后都返回1,而-1.1、-1.5、-1.8向下取整后都返回-2。

点击绿旗按钮进行测试,你会发现一个现象,数字按钮显示的过程会闪烁一下,这是因为按钮会按照克隆顺序,一个一个的显示出来。虽然我们经常说指令执行的速度很快,但是屏幕上的内容也同时在以非常快的速度进行刷新。先克隆的按钮会先出现在舞台上,后克隆的按钮会后出现在舞台上,最终的效果就是测试时所看见的,数字按钮显示的过程会闪烁一下。

有没有方法可以让它们不闪烁?

移动三色球2的最后我给你留下了一个问题。让你自己去测试一下,新建自制积木时,勾选或者不勾选运行时不刷新屏幕选项有什么差别?要解决这个问题就需要利用它。

我们可以制作一个新的积木,名字可以取为“生成数字按钮”,勾选上运行时不刷新屏幕。

然后将原本生成克隆体那一串指令放入定义生成数字按钮积木后面,再将新制作的生成数字按钮积木放入当背景换成[主菜单]积木后面。点击绿旗按钮进行测试,现在所有克隆的过程都放在了自制积木中执行,并且我们勾选上了运行时不刷新屏幕,也就是说只有当自制积木中所有的操作都完成以后,才会将最终的结果在舞台展示。最终的效果就是,所有按钮都已克隆完成,并且移动到了各自的位置,然后才会同时出现在舞台上。

3. 点击数字个数按钮,进入游戏界面,展示对应个数的方格,开始计时。

接下来,玩家会点击其中一个按钮,这时舞台会换成([游戏])背景当背景换成[游戏]后,所有按钮都会消失,因为它们都是克隆体,别忘了让它们消失的方式是使用删除此克隆体积木。

在这里请你停下来思考一个问题,能不能将删除此克隆体积木放在换成([游戏])背景积木后面?为什么?

按钮全部隐藏,接下来就要把所选数量的方格显示在舞台上。现在用户点击的是按钮角色,而需要显示在舞台上的是方格角色,你需要思考一个问题,方格角色如何知道用户点击了哪个数字按钮?

看见这个问题你的第一反应会不会是使用消息积木?例如,当按钮角色被点击时,给方格角色发送一条消息,消息内容就是按钮角色的造型名称。这样当方格角色接收到不同造型名称的消息时,就能显示不同数量的方格。

这确实是一种方式,不过这种方式有个问题。当你需要增加或者减少方格数量时,就需要增加或者减少当接收到[消息1]积木,太不灵活。而且这种方式会使用很多的消息事件积木。那有没有别的方式来传递消息呢?

你有没有想到使用变量?例如,新建一个变量叫做“方格数量”,将它勾选为适用于所有角色。这样按钮角色在被点击时,将变量值设置为方格数量。因为该变量是适用于所有角色,所以方格角色也可以看见设置后的变量值,也就知道了自己应该显示多少个方格。

确定好传递信息的方法后,新问题又出现了。当按钮角色被点击时,它如何知道这个按钮所代表的方格数量呢?

一种方式,你可以将按钮的造型名称改为代表方格数量的数字,这样就可以用造型名称作为参数设置变量值。

另一种方式,还是寻找方格数和造型之间的关系,通过计算得到方格数。观察一下你会发现,每个按钮代表的方格数正好等于它的(造型编号+1)的平方。例如,第一个造型编号为1,(1+1)²=4个方格,第二个造型编号为2,(2+1)²=9个方格。

接着你还可以继续思考一下,按钮角色直接通知方格角色它需要显示的数量是最好的选择吗?方格角色在知道这个数量后会怎么处理它?

答案很简单,方格角色在知道数量后需要克隆出相同数量的方格,然后再将它们拼成一个正方形。如何拼成正方形呢?是不是可以像移动三色球一样,通过行号和列号先计算出每个方格的位置,再去移动它们。

既然方格角色还需要将方格数量换算成行号和列号使用,那为什么按钮角色在新建变量时不直接新建两个变量,分别叫做“列数”和“行数”,然后对它们赋值呢?通过列数和行数不但可以算出方格总数,而且如果以后你想拼接的不是正方形而是长方形,拿到他们也可以直接进行操作。

接下来,就该方格角色根据行数和列数进行克隆,然后拼接成一个正方形在舞台上显示出来。如何拼接呢?你可以先尝试着在纸上画出几个格子,观察一下它们在舞台上的分布规律。

例如,我现在想将9个方格拼成一个大正方形放在舞台中央,每个方格的坐标是多少?

之前我们绘制方格时,将方格的左上角和绘制界面的中心点重合,因此方格的坐标位置也就是左上角的圆点位置。现在要找方格的坐标也就是找这九个圆点的坐标,感觉是不是和移动三色球很类似。

移动三色球中我们是自己决定了左上角第一个球的坐标,现在我们需要计算出左上角第一个方格的坐标。

之前你在绘制方格时就已经计算出方格的边长a,那大正方形的边长就是3a。现在我们需要将它放在舞台中央,左上角的坐标刚好是从舞台中央(x:0,y:0),向左和向上移动了(3a / 2)的距离,所以左上角的坐标值就是(x:-3a / 2,y:3a / 2)。坐标中的3是大正方形中方格的行数和列数,所以刚刚的坐标还可以变为(x:-列数 x a / 2,y:行数 x a / 2)。

有了左上角这个锚点,你就可以使用等差数列公式算出剩余方格的坐标值。这次首项a就是左上角点的坐标值,公差d就是方格的边长a。

回到scratch中,现在就可以模仿移动三色球中的方法,当背景换成[游戏]后,根据列数和行数克隆出所选数量的方格,克隆之前先将它们移动至各自的位置。

现在你可以点击绿旗按钮进行测试,当你选择方格数较小的按钮时,它们能正常显示在舞台上。可是当你点击方格数较大的按钮时,问题出现了,因为方格数太多,它们已经超出了舞台。

我相信你马上就能想到只要把方格缩小一点就解决了。于是你在当背景换成[游戏]后面加上了一个判断,如果方格数大于16,那么将大小设为(70),否则将大小设为(100)

修改以后点击进行测试,现在选个16个数字以下时和之前没有变化,可是选项16个数字以上时,每个方格确实变小了,可是它们的排列却不对了。

为什么会这样?原因很简单,之前你在计算每个方格的坐标值时用到了方格的边长,你可以将它看做边长为100%时的默认数值。当你将方格的大小减小或增大时,相当于对边长进行了等比例的缩放。所以我们在使用边长之前,需要根据方格的大小重新计算边长的大小。

点击绿旗按钮重新测试,现在所有数字个数都可以正常显示出来。但是和按钮显示存在相同的问题,方格会一个一个的出现在舞台上。解决方法还是制作一个新的积木“生成方格”,勾选运行时不刷新屏幕。

然后将生成方格的指令串拖入定义生成方格积木中,再将新制作的生成方格积木拼接到当背景换成[游戏]积木后面。重新测试,现在方格可以一次性出现在舞台上了。

方格的个数和位置已经没有问题,可是方格上面的造型全是一样的,怎么样才能让它们随机显示不同的数字呢?有没有想到猜数字中我们生成随机正确答案的方法。利用列表在每次克隆之前生成一个不重复地随机数字,随机数的范围就是1~方格总数,然后将方格的造型换成该随机数字的造型。

点击绿旗按钮进行测试,现在已经可以正常显示不同数字的方格。游戏即将开始,我们需要使用计时器为玩家计时。因为游戏结束时是由小猫说出玩家所用的时间,我们可以将该操作让小猫来执行。

当背景换成[游戏]时,先将计时器归零,然后将时间显示在舞台上。这里你会遇到一个问题,我们不能通过指令积木来控制计时器的显示和隐藏。如何解决呢?你可以利用变量来充当计时器。

新建一个变量叫“游戏用时”,当背景换成[主菜单]时,将它隐藏。当背景换成[游戏]时,将它显示。然后在计时器归零后不停的使用计时器积木为它赋值。

4. 从数字1开始递增,依次点击对应数字的方格。点击正确数字,播放正确音效,方格闪现正确颜色。点击错误数字,播放错误音效,方格闪现错误颜色。

现在用户要开始点击方格进行游戏。你需要思考的问题是如何判断用户是否按顺序在点击数字?

想要进行判断,你必须知道两个数字。第一个数字是用户当前点击的方格的数字。这个数字很容易获取,每当角色被点击时,该方格的造型编号就是方格的数字。

第二个数字是用户应该点击的正确数字。这个数字应该从1开始依次递增。你可以新建一个变量叫做“正确点击数字”用来存储该数字。当背景换成[游戏]时将它设置为1。当角色被点击时,就将它与被点击角色的造型编号进行比较,从而判断用户是点对了还是点错了。

如果点对了,播放正确音效,方格闪现正确颜色,并且正确点击数字加1。否则播放错误音效,方格闪现错误颜色。

5. 点击完所有数字,进入结束界面,小猫说出最终用时。点击小猫重新开始游戏。

到了最后一步,我们要判断用户有没有点完所有数字,从而结束游戏。如何判断呢?当用户点对时,判断一下当前的正确点击数字是否是最后一个数字(方格的个数)?如果是,说明已经点完所有数字,将舞台换成([结束])背景

在这里请你思考一个问题,图片中新增的如果<>那么积木与其后面的将[正确点击数字]增加(1)积木的位置能否交换?如果交换的话,如果<>那么积木中的判断应该如何修改?

剩下的就是当背景换成[结束]后,每个角色需要完成的任务。

方格角色需要隐藏起来,因为方格为克隆体同样需要使用删除此克隆体积木。

小猫角色先停止更新“游戏用时”变量的指令,并且将“游戏用时”变量隐藏。然后小猫显示出来,说出玩家的游戏时间。

如何停止更新“游戏用时”变量呢?它在重复执行积木中被更新,需要使用停止[全部脚本]积木停止循环。

最后,当小猫被点击时,将舞台换成([主菜单])背景重新开始游戏。

以上,你就完成了一个舒尔特方格游戏。

同样地,你在按照上面的方式做完后,可以尝试着自己用其他的方式重新完成它,或是增加一些其他功能。例如,将用到背景编号的地方改为使用变量代替。用列表记录每次游戏的时间,做一个游戏排名。点击正确的方格后显示不同的颜色,从而降低游戏的难度。

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

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

Last Updated:
Contributors: lanheixingkong