[导读]:蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选了一部分题目进行解读。
第13届蓝桥杯青少年组第1次选拔赛于2021年8月14日举行,形式为线上考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。
红绿灯记忆游戏,本题是2021年8月14日举行的第13届蓝桥杯Scratch选拔赛真题编程第4题,初级组和中级组都有此题,题目要求编程创作一个记忆游戏,红绿灯三盏灯亮起后分别为红灯、黄灯和绿灯, 观察并记忆三盏灯随机亮起熄灭的先后顺序。
先来看看题目的要求吧。
一.题目说明
编程实现:记忆游戏,红绿灯三盏灯亮起后分别为红灯、黄灯和绿灯,观察并记忆三盏灯随机亮起熄灭的先后顺序。具体要求:
1). 运行程序,小朋友说:“3秒后开始程序,请观察红绿灯亮起的先后顺序”;
2). 红绿灯的三盏灯按照随机顺序,分别亮起和熄灭一次,每盏灯亮起同时说出灯的颜色,1秒后熄灭,间隔1秒后下一盏灯亮起;
3). 小朋友说:“请按照三盏灯的亮灭顺序依次点击舞台右下角的3个按钮”;
4). 如果点击按钮的顺序与三盏灯的亮起熄灭顺序一致,则正确次数加1,小朋友说:“对了”;
5). 如果顺序不一致,小朋友说:“错了”;
6). 完成五次游戏后,左上角显示正确次数,小朋友说出:“正确次数为*”(*表示正确次数),2秒后游戏结束。
评分标准:
- 5分:满足要求1);
- 8分:满足要求2);
- 8分:满足要求3);
- 8分:满足要求4);
- 3分:满足要求5);
- 3分:满足要求6)。
二.作品效果
在编程之前,先来看看作品的完整效果吧:
三.思路分析
本题一共有7个角色,如图所示:
其中,红灯、黄灯、绿灯3个角色对应于舞台上方要显示的红绿灯,红色按钮、黄色按钮和绿色按钮3个角色则对应于舞台右下角的按钮。游戏包含两种顺序,一是红绿灯亮起熄灭的顺序,二是玩家点击按钮的顺序,我们可以使用两个列表分别保存这两个顺序,如图:
两个列表中保存的都是1、2、3三个数字,分别代表红灯、绿灯和黄灯。如果两个列表相等,则说明玩家点击的顺序正确。作品的核心流程如图所示:
这里的关键是如何确保程序的执行顺序,小朋友提示观察亮灯顺序后,三盏灯依次亮起并熄灭,并不是同时执行的,因此这里需要使用“广播消息并等待”指令,当前面的一盏灯熄灭后,才开始点亮下一盏灯。
关于发送广播消息,一般都是直接起一个名字,实际上,消息的名称也可以使用变量的,今天我们就要使用这个小技巧,直接从列表中取出数字,作为消息的名称,比如广播消息1,这表示红灯要亮起了,对应的红灯在接收到广播消息1就需要先亮起然后熄灭,这样可以大大简化我们的代码,非常方便。
四.编程实现
根据题目描述和思路分析,我们可以分5步来编写程序:
- 准备工作
- 随机点亮红绿灯并熄灭
- 点击按钮并记录顺序
- 判断对错
- 重复5次并统计结果
1. 准备工作
根据题目描述,一共要完成5次游戏,并统计正确的次数,因此需要创建两个变量,分别命名为“次数”和“正确次数”。
根据思路分析,创建两个列表,分别命名为“红绿灯”和“点击顺序”,然后对变量和列表进行初始化设置。
在小朋友角色中,编写代码如下:
需要注意的是,列表”红绿灯“中的数字顺序是随机的,这里使用了一个小技巧,就是第1次插入数字1,第2次随机在1之前和1之后插入数字2,它有两个位置可以选择,第3次则在列表的第一项或第二项的前面或后面插入数字3,它有三个位置可选,这样就可以得到一个完全随机的数字列表。
2. 随机点亮红绿灯并熄灭
准备工作完成后,接着就是小朋友开始提示了,然后依次亮灯,根据思路分析,我们使用”广播消息并等待“指令即可,消息的名称依次为列表中的第1项、第2项和第3项。
在上面的代码块下面,继续编写代码如下:
对应的三盏灯在接收到广播消息后,需要进行相应的处理,以红灯为例,它接收到的是消息1,编写代码如下:
对应的,黄灯和绿灯的代码分别如下:
4个代码块结合在一起,好好理解一下,有了”广播消息并等待“指令,每次都需要等待等熄灭后才继续发送下一个广播消息。当第三盏灯熄灭后,小朋友提示玩家点击右下角的按钮,然后发送了一个”按顺序点击“的广播消息。
3. 点击按钮并记录顺序
接下来就是玩家点击按钮了,注意玩家点击按钮的时机,必须是在发送”按顺序点击“广播之后才有效,因此,我们要在接收这个广播消息中来处理用户的点击。
处理的方法也比较简单,如果按下鼠标并且角色碰到了鼠标指针,就说明玩家点击了该按钮,此时将该按钮对应的数字保存到“点击顺序”列表中即可,以红色按钮角色为例,编写代码如下:
简要说明两点:
1). 用户点击按钮后,这里做了一个小小的处理,就是让按钮先变大一点,0.5秒后再恢复原来大小,这样玩家就知道已经点击按钮了,提升了用户体验;
2). 每点击一个按钮,都需要判断3个按钮是否都已经点击过了,所以,这里增加了一个判断,当列表的项目数等于3时,就说明已经点击了3次,此时发送了一个“完成点击”的广播消息。
黄色按钮和绿色按钮也需要编写类似的代码,这里就不再列出了。
4. 判断对错
小朋友角色在接收到“完成点击”的广播消息后,需要对两个列表进行判断,对应的代码如下:
如果二者顺序一致,则将“正确次数”增加1,同时说“对了”,否则就说“错了”,不管是对是错,“次数”变量要增加1。
5. 重复5次并统计结果
当前只完成了一局游戏,题目要求重复5局游戏,该怎么做呢?
常规的做法就是使用重复执行指令,这个当然没有问题。超平老师今天告诉你一个巧妙的办法,那就是使用广播机制,这可以让代码结构变得更加清晰简单。
当次数增加1后,需要判断次数是否为5,如果等于5,就结束游戏,否则重新开始,我们可以发送一个“开始亮灯”的广播消息,代码如下:
相应的,要对小朋友角色的绿旗代码块进行拆分,我们将其一分为二,如下:
注意,拆分的位置要选择恰当,由于每次亮灯的顺序都不一样,因此列表的初始化需要放在“当接收到开始亮灯”的代码块中。至此,整个作品就创作完成了,你可以把玩一下,测试一下自己的记忆力咯^_^。
五.总结与思考
本题难度系数为4,积木块数量在107个左右(如果去掉重复代码为63),涉及到的知识点主要包括:
- 列表的使用,重点是列表数据的随机插入和列表的比较;
- 事件广播机制,尤其是“广播并等待”指令的使用和理解;
- 使用变量作为广播消息名称的编程技巧;
- 外观编程,包括说话、切换造型和改变角色大小;
- 妙用广播实现循环的编程技巧;
- 点击角色的另类实现。
本题还是有一定难度的,其核心有两点,一是列表的灵活运用,包括随机插入数据和判断两个列表是否相等。二是事件广播机制的灵活运用,包括“广播并等待”指令的作用和使用广播消息实现循环的编程技巧。总体来说,这是一道综合性非常强的题目,需要考生掌握好基础知识,并能够综合运用,灵活运用。