[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第119讲。
蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多文化教育研究中心合作推出的考试项目。STEM能力测试致力于综合评价学生的 STEM 水平,对学生的科技素养、逻辑思维和编程能力等三方面进行客观科学的测试。
影院选座,本题是2022年10月30日举行的第14届蓝桥杯STEMA考试Scratch图形化编程真题第5题,是中级组最后一题。题目要求编程模拟影院选座场景,在对话框中输入排与每排的座位号进行预订选座,如果此座位已经被预订则需要重新选择座位。
先来看看题目的要求吧。
编程实现:
影院选座,在对话框中输入排与每排的座位号进行预订选座,如果此座位已经被预订则需要重新选择座位。
具体要求:
1). 运行程序,角色、背景如图所示;
2). 等待1秒后,影院其中一半座位被随机预订,座椅颜色填充为红色;
3). 等待1秒,询问:“输入排数”(1-3任意一个数字);
4). 等待1秒,询问:“输入座位号”(1-6任意一个数字);
5). 输入完成后,绿色选择框出现在对应座位上;
例如:输入排数:3,座位号:4,绿色选择框会出现在3排4号的座位上
6). 如果座位被提前预订(座椅已被填充成红色),提示:“座位被预定,请重新选择”,重复3)、4)、5)步骤;
7). 如果座位没有被提前预订,提示:“座位预订成功”,同时座椅填充成红色,选座结束。
评分标准:
2分:满足“具体要求”中的1);
2分:满足“具体要求”中的2);
3分:满足“具体要求”中的3);
3分:满足“具体要求”中的4);
6分:满足“具体要求”中的5);
7分:满足“具体要求”中的6);
7分:满足“具体要求”中的7)。
本题包含两个角色,分别是座椅和绿色框,如图所示:
其中, 座椅有两个造型,表示座椅的两种状态,如图:
黑色的造型1表示座椅未预订状态,红色的造型2表示已预订状态。
根据题目描述,可以将作品的功能分成如下几个模块:
1). 初始化座位
2). 随机预订一半座位
3). 根据用户输入计算座位号
4). 判断当前座位预订情况
第一步,初始化座位,具体来说就是克隆3排座位,每一排有6个座位,这是一个典型的克隆场景应用,只需要按排克隆即可,通常使用嵌套循环来实现。
为了区分每一个座位,可以使用一个私有变量来表示座椅的编号,从1到18。
第二步,随机预定一半座位,如何表示每个座位的状态呢?
每个座椅都有两种状态,一是未预订,二是已预订,可以使用布尔值来表示,或者直接使用0和1表示,其中0表示未预订,1表示已预订。
这里一共有18个座椅,可以使用列表来保存所有座椅的状态。所谓的随机预订一半座位,其实就是在列表中随机插入0和1,确保0和1各占一半。我们可以借助“在列表的第1项前插入”指令,只需要把第1项中的1设置为随机数就可以轻松地实现随机插入数据。
第三步,根据用户输入计算座位号。
用户输入的是排和列(座位号),而前面在克隆座椅的时候,已经给每个座椅进行编号了(从1~18),所以需要进行一个简单的计算,将排和列转换成唯一的数字编号。
比如:
第1排第5个座位,对应的编号是 (1 - 1)* 6 + 5 = 5
第2排第4个座位,对应的编号是 (2 - 1)* 6 + 4 = 10
第3排第3个座位,对应的编号是(3 - 1)* 6 + 3 = 15
......
一旦计算好了预订座位的编号,就可以从状态列表中取出对应的列表项,根据其状态判断该座位是否已经预订,并进行相应的提示,这就是第四步。
所以本题的关键有两个:
使用私有变量给座椅编号,以区分不同的座椅;
使用列表来记录每个座椅的相关信息,包括状态和坐标;
接下来,我们进入具体的编程实现环节。
根据题目描述和思路分析,我们分4步来编写程序:
初始化座位
随机预订一半座位
根据用户输入计算座位号
判断当前座位预订情况
1. 初始化座位
这是一个典型的多行多列的克隆场景,使用嵌套循环即可,为了方便,我们可以定义一个自制积木用于克隆,对应的编写代码如下:
简单说明三点:
1). 内层循环重复执行了6次,用于克隆每一排的6个座椅,对于每一排座椅,首先将本体移到最左边,也就是“将x坐标设为-142”,每克隆一个,将本体右移一定距离,即“将坐标增加62”;
2). 外层循环用于克隆3排,每克隆一排,往下移动54步,也就是“将y坐标增加-54”;
3). 为了区分克隆体,定义了一个私有变量“_编号”,其中克隆体的编号从1开始,直到18,而本体的编号为0,之所以增加下划线"_",是个人编程习惯;
然后在绿旗指令中使用自制积木,并将克隆体显示出来,代码如下:
运行程序,效果如下:
2. 随机预订一半座位
根据前面的思路分析,创建一个列表“座位状态”,先将列表清空,然后向列表中插入9个0,表示未预定状态,接着往列表中随机位置之前插入9个1。
为了简化代码结构,可以使用自制积木来实现随机选座,对应的代码如下:
关键代码是第二个重复指令中的插入指令,当列表长度为9的时候,一共有10个位置可以插入,当列表长度为10的时候,一共有11个位置可以插入......,以此类推。
然后在绿旗代码块中,添加如下代码:
执行程序,可以看到列表的数据如下:
这里的随机选座只是创建了一个列表,而座椅仍然没有任何变化,因此,每个克隆体需要根据列表中的数据来确定自己的状态,所以这里发送了一个“选座完毕”的广播。
对应的,在座椅角色中,编写代码如下:
代码比较简单,每个克隆体都有自己的编号,然后根据编号就可以在列表中找到对应的列表项,如果为0,则换成造型1,表示未预订,如果为1,则换成造型2,表示已预订。
需要注意的是,克隆体也可以接收到自己发送的广播消息。
运行程序,对应的选座效果如下:
在18个座位中,有9个座位未预订,有9个座位已预订,并且每一次预订的座位都是不同的。
3. 根据用户输入计算座位号
接下来就是询问并回答了,需要注意的是,这个是由绿色框角色来进行的,包括后面的提示信息都是由绿色框角色来完成的。
根据前面的思路分析,我们需要将用户输入的排数和座位号转换成编号,为了方便,需要创建一个变量“座位号”,然后进行计算。
切换到绿色框角色,编写代码如下:
这里用了一个小技巧,第一次的“回答”指令表示排,可以先计算出每一排的基数,比如第一排的基数是0,第2排的基数是6,第3排的基数是12。第二次的“回答”指令表示当前排的座位号,再加上前面的基数,就是对应的座位号了。
4. 判断当前座位预订情况
有了座位号,我们就可以将绿色框显示到对应的位置,此时又会遇到一个新问题,我们如何知道该位置的坐标呢?
一般可以采取如下两种方式:
通过行和列直接计算出座椅的坐标;
在克隆座椅时将坐标保存到列表中;
两种方式各有特点,第一种方式计算起来麻烦一点,第二种方式需要借助列表。相对来说,第二种方式实现起来更简单一点,也是超平老师采用的方式。
创建两个列表,分别命名为“x坐标”和“y坐标”,在克隆座椅的自制积木中,增加如下代码:
注意两点:
1). 需要先清空列表;
2). 在克隆之前将x坐标和y坐标插入到列表中;
如此一来,我们就可以通过座位号,获取对应的x、y坐标,然后再判断当前位置是否已预订,并给出相应的提示,在接收广播指令下增加如下代码:
说明两点:
1). 如果座位已预订,需要重复询问,所以增加了一个重复执行指令;
2). 如果座位未预定,则需要更新座位的状态,所以发送了一个“预订成功”的广播;
相应的,在座椅角色中,增加代码如下:
这样一来,就可以将该座位从未预订状态变成已预订状态。
至此,整个作品就创作好了,赶紧来体验一下Scratch版本的选座应用吧。
本题是编程部分第5题,是中级组压轴大题,分数为30分,积木块数量80个左右,涉及到的知识点主要包括:
Scratch克隆编程;
列表的灵活应用;
变量的使用,尤其是私有变量和克隆体的结合;
Scratch问答;
运算指令,包括随机数、算术运算和关系运算;
事件广播机制。
作为中级组的压轴大题,本题综合性较强,还是有一定难度的,解决本题的关键点有两个:
1). 如何记录座椅的状态,这里使用了布尔值(0和1),并将其保存到列表中;
2). 如何根据玩家输入获取对应的座椅,这需要进行简单的数学计算,同时结合私有变量区分每个克隆体;
本作品将Scratch编程和生活中看电影预订座位的场景结合起来,实现了一个简单的选座应用,让孩子们充分体验到编程在日常生活中的应用,正所谓“编程源于生活,而高于生活”。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香
需要素材和源码的,可以移步至“超平的编程课”gzh,或者联系本人。