[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第163讲。
第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕,编程题一共有6题,分别如下:
变色游戏,本题是2023年12月17日举行的第15届蓝桥STEMA测评Scratch编程初/中级组编程第4题,题目要求编程创作一个变色游戏。点击任意一个方块,该方块及上下左右邻居方块都会变色,当所有方块变为蓝色时游戏胜利。
先来看看题目的要求吧。
一.题目说明
编程实现:
变色游戏。
具体要求:
1). 每次点击绿旗,舞台中出现了3行3列的红色方块方阵,变量“游戏时长”为0,如图所示;
2). “游戏时长”的值每隔1秒增加1;
3). 当第一次点击方块时,被点击的方块及与其上下左右相邻的方块都会变为蓝色;
例如:第一次点击且点击最中间的方块后的效果如下图。
4). 接下来每次点击任意一个方块后,该方块及与其上下左右相邻的方块改变颜色(红色变为蓝色,蓝色变为红色);
例如:第二次点击且点击右下角的方块后的效果如下图。
5). 当所有方块都变为蓝色后,显示“胜利”,“游戏时长” 不再变化,程序结束。
评判标准:
-
10分:满足"具体要求"中的1);
-
5分:满足"具体要求"中的2);
-
10分:满足"具体要求"中的3);
-
20分:满足"具体要求"中的4);
-
15分:满足"具体要求"中的5)。
二.思路分析
先来看看题目提供的角色,一共有两个,分别是方块和胜利,如图所示:
其中,方块角色有两个造型,分别是红色和蓝色,如图:
根据题目的描述,我们可以将整个游戏拆分为3个模块:
-
克隆九宫格方块
-
点击方块变色
-
计时和游戏胜利
其中,计时和游戏胜利相对简单一些,重难点是前面两个模块,尤其是点击方块变色效果,接下来我们逐一分析。
1. 克隆九宫格方块
这是一个典型的多行多列克隆场景,超平老师总结了一个“克隆四兄弟”模型,超级好用。
所谓4兄弟是指下面这4个指令:
其中和x坐标相关的两个兄弟指令负责从左至右克隆一行,而y坐标相关的两个兄弟指令负责从上到下克隆多行。
基本模板如下:
本题中的方块呈现九宫格效果,也就是3行3列,只需要将上面m和n都改成3,设置好起点的x和y,以及行和列的间隔,就可以了。
2. 点击方块变色
当点击任意一个方块时,该方块及与其上下左右相邻的方块都需要改变颜色。当前方块比较容易处理,邻居方块该如何确定呢,这是本题的难点。
为方便说明,我们给每个方块进行编号,编号为1~9,如下:
需要注意,不是每个方块都有上下左右的邻居方块,如果把这些方块进行分类,则可以分成如下3种情况:
中心方块(5):有上下左右4个邻居,比如方块5,其邻居为2、4、6、8;
边方块(2、4、6、8):有3个邻居,比如方块2,其邻居为1、3、5;
角落方块(1、3、7、9):只有两个邻居,比如方块1,其邻居为2、4;
因此需要分情况讨论,关键是要处理好边界情况,可以分行和列进行讨论,如下:
第一行:上方没有方块;
最后一行:下方没有方块;
第一列:左边没有方块;
最后一列:右方没有方块;
所以,我们需要解决如下3个小问题:
1). 如何获取当前方块的编号?
2). 当前方块的邻居有哪些?
3). 这些邻居保存到哪儿?
第一个问题相对比较简单,我们可以给方块增加一个私有变量"_ID",用来表示方块的编号,并将值设为1到9。
第二个问题稍微麻烦一点,需要根据方块的编号来确定它所在的行和列,一般来说,有两种处理办法。
第一种是死方法,直接通过编号来判断,如下:
第一行:编号等于1、2、3;
第一列:编号等于1、4、7;
最后一行:编号等于7、8、9;
最后一列:编号等于3、6、9;
由于这里的方块数量是固定的,并且每行每列只有3个,使用这种方式是完全可以的。如果方块数量不固定,并且方块较多时,则就不适合了。
第二种是数学方法,稍微转换一下角度:
如果编号 > 3,则说明有上一行,获取上方方块的编号;
如果编号 < 7,则说明有下一行,获取下方方块的编号;
如果编号➗3的余数 = 1,则说明有右边的列,获取右边方块的编号;
如果编号➗3的余数 = 0,则说明有左边的列,获取左边方块的编号;
将当前方块及邻居方块的编号都保存到一个列表中,然后根据列表中的编号对每个方块进行变色即可。
3. 计时及游戏胜利
计时比较简单,重点是如何判断游戏胜利,胜利的依据是所有的方块都变成蓝色。我们可以借助列表,将每个方块的颜色都保存到列表中,如下:
其中1表示红色,2表示蓝色,当点击方块时,就更新列表中对应的颜色。当所有的列表项都变成2,换言之,当列表中没有1时,游戏胜利。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分4步来编写程序:
-
准备工作
-
克隆九宫格方块
-
点击方块变色
-
计时和游戏胜利
1. 准备工作
这里的准备工作,主要是定义变量和列表,先创建变量“游戏时间”和“_ID”,如下:
注意,这里的"_ID"是私有变量,并且需要在方块角色中创建。
再创建两个列表,一个是“方块颜色”,一个是“邻居方块”,如下:
2. 克隆九宫格方块
根据前面的思路分析,我们使用“克隆4兄弟”模型来克隆九宫格方块,在方块角色中编写代码如下:
代码不少,简单说明4点:
1). 列表需要初始化,也就是清空操作;
2). 本体默认是隐藏的,并且换成造型1,也就是红色方块;
3). _ID的初始值为0,在每次克隆之前,将_ID增加1,利用克隆体的继承特性,确保克隆体的编号为1~9;
4). 克隆完成,将_ID设置为0,表示将本体的_ID恢复到0,这个不是必须的,但建议你写上,在某些场景下会用到这一小技巧。
针对克隆体,需要显示,同时需要向列表中增加数据,代码如下:
运行程序,效果如下:
3. 点击方块变色
在点击方块时,需要将当前方块及其邻居方块的编号加入到“邻居方块”列表中,根据前面的思路分析,在方块角色中,继续编写代码如下:
代码就不再解释了,可以先测试一下效果。
当点击编号为5的中心方块时,列表中的数据如下:
当点击编号为2的边方块时,列表中的数据如下:
当点击编号为1的角落方块时,列表中的数据如下:
这说明程序完全正确,可以继续下一步了。
在代码最后,发送了一个广播消息,克隆体接收到广播后,需要变色并更新列表数据,继续编写代码如下:
简单说明两点:
1). 之所以使用“广播并等待”指令,是确保所有方块先变色,并且“方块颜色”列表中的数据已经更新完;
2). “邻居方块包含_ID” 指令的意思是,如果当前方块的_ID在“邻居方块”列表中,表示它就是邻居方块,当然也包括被点击的方块自己;
4. 计时和游戏胜利
当“方块颜色”列表中没有1的时候,就表示游戏胜利了,所以每次点击方块更新完列表,都需要判断,在上面的广播指令下面增加如下代码:
对应的,切换到胜利角色,先进行初始化设置和计时功能,代码如下:
当接收到“胜利”广播时,显示角色,并停止全部脚本即可,编写代码如下:
至此,整个作品就创作好了,是时候来体验一下游戏效果啦。
四.总结与思考
本题是初/中级组编程部分第4题,分数为60分,积木块数量75个左右,涉及到的知识点主要包括:
-
克隆编程,重点是多行多列的克隆技巧;
-
循环编程,尤其是嵌套循环;
-
变量的使用,重点是私有变量;
-
列表的运算;
-
事件广播机制;
本题难度中等偏上,完成时间20分钟左右,重难点在于如何找到点击方块的邻居方块并改变其颜色。
为了保存每个方块的颜色及邻居方块,我们使用了列表,这让问题变得更简单,由此也可以看出,列表在编程中的重要性。
类似的九宫格游戏还有很多,比如井字棋、数字华容道、幻方、数独等,它们都可以使用列表来实现,所以,我们一定要熟练掌握列表的各种用法。
超平老师给你留两个思考题:
1). 本题中的九宫格,要全部变为蓝色,最少几步可以完成?
2). 如果要实现4 x 4的16宫格,又该如何实现呢,赶紧动手试试吧。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh。