[导读]:这是Scratch蓝桥杯真题解析第101讲。蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多文化教育研究中心合作推出的考试项目。STEM能力测试致力于综合评价学生的 STEM 水平,对学生的科技素养、逻辑思维和编程能力等三方面进行客观科学的测试。
王子与骑士,本题是2023年2月12日举行的第14届蓝桥杯STEMA考试真题初级组编程第4题,也是压轴题,题目要求编写一个简单的王子与骑士作品。
先来看看题目的要求吧。
一.题目说明
编程实现:
王子与骑士。
具体要求:
1). 运行程序,王子出现在舞台左侧,克隆 6 名骑士,排成 2 行 3 列的队伍;
2). 用鼠标左键点击一名骑士,被点击的骑士大小增加 20,并说出自己在第几行,第几列2秒,之后骑士恢复原来大小,如下图,左下角第一个骑士在第1行第1列;
3). 用鼠标左键点击一次王子,出现询问框,王子说:“请输入指令”;
4). 当输入“前进”指令,从第1行第1列骑士到第2行第3列骑士依次水平向左移动,当到达舞台左边缘后消失(骑士需从王子身后通过);
5). 当输入“集合”指令,骑士恢复初始呈现效果,程序结束(程序结束后,骑士不消失仍然保持初始呈现效果)。
评判标准:
- 3分:满足“具体要求” 中的1);
- 6分:满足“具体要求”中的2);
- 3分:满足“具体要求”中的3);
- 6分:满足“具体要求” 中的4);
- 7分:满足“具体要求” 中的5)。
二.效果预览
在编程之前,先来看看作品的完整效果吧:
三.思路分析
本题包含两个角色,分别是王子和骑士,如图所示:
王子角色的功能比较简单,主要就是询问,然后根据回答给骑士发送相应的的广播消息。
重点是骑士角色,包含如下几个功能:
1). 按照两行三列的方式克隆;2). 点击骑士时说出自己所在行和列;3). 当玩家输入“前进”时,依次左移至舞台边缘消失;
4). 当玩家输入“集合”时,重新排队,然后结束程序;
这里的难点是第2项和第3项,我们如何知道每个克隆体在哪一行哪一列呢,又如何控制这些克隆体依次开始移动呢?
答案是私有变量,在Scratch编程中,在生成克隆体时,所有的克隆体都具有相同的特征,包括坐标、大小、造型、外观特效等特征,要想区分不同的克隆体,就需要使用私有变量。
所以,我们可以创建3个私有变量“行”、“列”和“id”,分别表示每个骑士克隆体所在的行、列以及编号。
四.编程实现
根据题目描述和思路分析,我们可以分5步来编写程序:
- 初始化设置
- 克隆骑士
- 点击骑士报告位置
- 骑士依次前进
- 骑士集合
1. 初始化设置首先是王子的初始化,包括位置和层次关系,为了确保骑士是从王子身后穿过去的,可以将王子设置到最前面,其初始化代码如下:
骑士角色则需要隐藏起来,同时设置其大小,代码如下:
2. 克隆骑士
根据上面的思路分析,先在骑士角色中创建3个私有变量,如图所示:
注意,这三个必须是私有变量,为了和全局变量进行区分,超平老师建议你在私有变量前面增加一个下划线。
接下来,我们就开始克隆骑士了,对于这种M行N列的规则排列,通常我们会使用两层循环来实现克隆,重点是注意设置好每一行第一个克隆体的位置。
由于在点击绿旗和集合时都需要克隆骑士,为了简化代码,我们定义一个自制积木用于克隆6个骑士,代码如下:
简要说明四点:
1). 对于行而言,需要先将行设置为1,然后在克隆完一行之后,将行增加1;
2). 对于列而言,每一行都需要从第1列开始,因此在克隆每一行之前都需要将列设置为1,每克隆一个其实,就将列增加1;
3). 对于编号而言,先将_id设为0,然后在每次克隆骑士之前将_id增加1,这样就可以确保6个克隆体的编号依次是1、2、3、4、5和6。
4). 为了确保第2行的克隆体盖住第1行的克隆体,在每一行克隆完成后,增加了一个“后移10层”指令;
有了这个自制积木,在绿旗指令代码块的后面加上自制积木指令,即可,代码如下:
相应的,需要将克隆体显示出来,代码非常简单,如下:
3. 点击骑士报告位置
当点击骑士克隆体时,需要将大小增加20,同时说出自己所在的行和列,代码如下:
为了避免连续点击,这里使用的是循环指令 + 条件指令,如果使用“当角色被点击”指令,则可以连续点击,不停的变大和说行列。
正是因为有了私有变量,我们可以保存每个克隆体的行和列,所以代码也就非常简单了。
4. 骑士依次前进
当点击王子角色时,会出现询问框,并根据玩家输入的内容发送相应的广播消息,在王子角色中编写代码如下:
相应的,当骑士克隆体接收到广播消息之后,要依次前进,注意不是同时移动,这该怎么实现呢?
如果你仔细观察作品效果(考试的时候是有视频播放的),可以发现,这里的6个克隆体依次开始移动,也就是第1个移到最左边消失了,然后才是第2个、第3个…,直到第6个,同时越靠近左边的骑士移动的速度越慢,越靠近右边的骑士移动的越快。
讲到这里,你想到了什么?
如果你比较熟悉Scratch各种运动指令,肯定会想到“在1秒内滑行到x,y”指令,没错,就是它。不管是哪个克隆体,我们只要保持其y坐标不变,然后将x坐标设置为舞台左边缘即可,比如-235。
那怎么让克隆体依次出现呢,还记得前面的私有变量_id吧,6个克隆体的_id依次是1、2、3、4、5和6,直接使用等待指令,是不是就可以解决了,真是想什么来什么,对应的代码如下:
代码其实非常简单,关键在于思路和方法,当骑士移到最左边,删除即可。
5. 骑士集合
当接收到“集合”指令时,又需要重新生成克隆体并排列,这个比较简单,在接收到广播之后,再次调用自制积木即可。
但是我们要考虑两个问题:
1). 如果舞台上还要克隆体,直接调用自制积木再次克隆,会出现双倍的克隆体,因为克隆体也会接收到广播,并再次克隆;
2). 按照题目描述,一旦再次集合,要结束程序,但是克隆体仍然在舞台上,这就意味着不能使用“停止全部脚本”指令,同时还要让克隆体不能响应点击事件;
所以,在再次克隆骑士之前,需要先删除之前的克隆体,我们可以使用并行代码块来解决,同时确保先删除,再克隆,代码如下:
这里的“等待0.1秒”指令可以确保删除克隆体指令后执行,然后再克隆新的骑士。
虽然,这里使用了“停止该角色的其他脚本”指令,但是一旦重新生成克隆体,“当作为克隆体启动时”代码块仍然会执行,再次点击,还是会有效果,该怎么解决呢?
我们可以使用一个变量来表示是否说“集合”了,增加一个全局变量“集合”,在绿旗点击时设置为0,代码如下:
然后在回答“集合”时,将变量设置为1,代码如下:
接下来,在克隆体启动时代码块中,增加一个判断,就可以确保在回答集合后不再响应鼠标点击了,代码如下:
相应的,在王子角色中的点击事件中,也增加一个判断,代码如下:
至此,整个作品就创作好了,你可以测试一下效果,看看是不是满足题目的所有要求。
五.总结与思考
本题分数为25分,积木块数量70个左右 ,涉及到的知识点主要包括:
- 克隆编程技巧,重点是多行多列的克隆;
- 私有变量的作用及其用法;
- 角色的移动,重点是滑行指令的灵活运用;
- 事件广播机制;
- Scratch问答指令;
- 自制积木的作用及其用法。
作为初级组最后一题,本题还是有一定难度的,重点考察了克隆编程,尤其是使用私有变量来区分不同克隆体的编程技巧。
同时还要求考生仔细看题,注重每一个细节,比如本题中的骑士依次向左移动,以及在集合之后结束程序但同时又需要保留克隆体。唯有如此,才能在众多的考生中脱颖而出。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香