消除数字球-第15届蓝桥省赛Scratch初级组真题第5题

server/2024/9/24 23:26:19/

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第184讲。

如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。

第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下:

  • 猪八戒落地

  • 游乐场

  • 画西瓜

  • 找不同

  • 消除数字球

消除数字球,本题是2024年8月24日举行的第15届蓝桥省赛Scratch初级组编程第5题,题目要求编程创作一个消除数字球游戏。用鼠标点击任意两个小球,若点击的两个小球上的数字之和为 6,则这两个小球消除,如果没有可以消除的小球,那么游戏结束。

先来看看题目的要求吧。

一.题目说明

编程实现:

消除数字球。

用鼠标点击任意两个小球,若点击的两个小球上的数字之和为 6,则这两个小球消除,如果没有可以消除的小球,那么游戏结束。

具体要求:

1). 点击绿旗,变量“时长” 为0,在舞台的随机位置,瞬间呈现 6个随机数字的小球,如图所示;

2). 所有球不能碰到到舞台边缘,且球之间不能接触;

3). 全部小球呈现后,“时长” 开始每隔1秒增加1;

4). 点击任意两个小球,被点击的小球出现白色边框(表示选中状态),如图所示;

例如:鼠标分别点击舞台下方的数字为 4和 5的小球。

图片

5). 如果选中的两个小球上的数字之和不等于6,则两个小球的白色边框在 0.2秒后消失,如图所示;

6). 如果选中的两个小球上的数字之和等于6,则这两个小球在0.2秒后消失;

7). 重复执行“具体要求” 4)、5)、6),如果小球已经全部消除或者已经没有可以消除的小球,“时长”不再变化,2秒后程序结束。

评判标准:

  • 6 分:满足"具体要求"中的1);

  • 10分:满足"具体要求"中的2);

  • 2 分:满足"具体要求"中的3);

  • 8 分:满足"具体要求"中的4);

  • 18分:满足"具体要求"中的5);

  • 18分:满足"具体要求"中的6);

  • 18分:满足"具体要求"中的7)。

二.思路分析

本题只有一个角色,就是数字球,如图所示:

图片

不过,数字球的造型比较多,一共有10个,其中前5个是没有选中的数字球造型,如图所示:

图片

后5个是选中的数字球造型,如图:

图片

这是典型的消除小游戏,考查的知识点主要包括克隆技巧、变量、自制积木、事件广播和列表等。

类似的题目在第11届蓝桥杯省赛中出现过,可以参考《对对碰-第11届蓝桥杯Scratch省赛真题第6题》这篇教程,相比较而言,这道题要求更多,难度更大。

根据题目的描述,我们使用分解思维将作品拆分成如下3个核心部分:

  • 克隆6个数字球球

  • 消除数字球

  • 结束游戏

克隆小球本身比较简单,但是要确保小球不重叠的分布在舞台中,消除小球稍微麻烦一点,主要就是细节的处理。

真正有难度的是最后一步,如何判断游戏结束,这涉及到一个简单的算法---两数之和,接下来我们一一分析。

1. 克隆6个小球

克隆本身是比较简单的,只是这里有一个额外要求,所有球不能碰到到舞台边缘,且球之间不能接触。

这个场景在第14届国赛中的矿工挖宝作品出现过,它要求金块和钻石都不重叠,也不能接触舞台边缘,简章是一模一样,具体详情可以参考《矿工挖宝-第14届蓝桥杯国赛Scratch真题初中级组第4题》这篇教程。

解决这个问题的关键是要学会超平老师总结的一招”借鸡生蛋“。

图片

所谓借鸡生蛋,是指借助其它角色,拖出一个”碰到数字球“的指令,将其复制到数字球角色中,这样就可以在数字球角色中检查是否碰到其他数字球了。

2. 消除小球

每个小球都有两个状态,一个是未选中,一个是已选中,分别对应两个造型。仔细观察数字球造型,不难发现,同一个数字的造型编号相差5,因此,我们可以通过造型编号来区分小球的状态。

消除类游戏有一个非常显著的特点,就是当选中了两个之后才需要处理。一般的解决方案就是使用两个变量分别保存两个角色的信息,在本题中,我们需要保存选中小球对应的数字。

如图所示,定义两个变量”小球1“和“小球2”。

图片

在没有选中任何数字球的时候,它们的值都为0,在点击小球时,如果“小球1”为0,说明当前选中的是第一个数字球,否则就是第二个数字球,相应的将数字球对应的数字保存到两个变量中,同时要改变造型。

一旦选中了两个小球,就需要进行判断了,如果“小球1” + “小球2” = 6,就需要在0.2秒之后删除这两个数字球克隆体,否则就切换造型,恢复到未选中状态,同时别忘了将两个变量重新设置为0。

复原比较简单,麻烦的是如何删除两个选中的数字球,主要是第一个被选中的数字球,在点击第二个数字球的时候,怎么知道哪一个数字球是第一次选中的呢?

最好的办法莫过于使用私有变量ID,每个数字球进行编号,再使用一个变量将第一个选中的数字球编号保存起来,这就是“自私的ID”模型。

当然,这其中还有一些细节,具体实现时再进行分析。

3. 结束游戏

这是本题最难的一点,游戏结束的条件就是所有和为6的小球组(两个一组)都被消除了,这个要怎么计算呢?

这个有点类似于经典的A+B算法问题,通常可以结合列表来解决。

假定生成的数字球有2、5、4、3、2和3,如图所示:

图片

我们将对应的数字保存到”数字球“列表中,同时定义一个变量”对数量“表示和为6的数字对数量。

我们可以使用如下4个步骤来统计成对数量:

  • 获取列表中的第一项,计算6和第一项的差,将其保存到变量”“中;

  • 删除列表的第一项;

  • 判断列表中是否存在等于”“的数字,如果存在,说明存在一组数字和为6,将变量”成对数量“加1,同时删除等于”“ 的列表项(删除一项即可),如果不存在,则不做处理;

  • 重复上面的3个步骤,直到列表为空。

以上面的”数字球“列表为例来理解这一过程。

初始时,列表中有6个数字,如图:

图片

1). 第一次处理:

  • 获取列表的第1项,其值为2,对应的”“ = 6 - 2 = 4;

  • 删除第1项,列表只剩下5项,分别为5、4、3、2、3

  • 由于列表中包含4,就将变量”成对数量“加1;

  • 删除值为4的列表项;

经过第一次处理,列表只剩下4项,如下所示:

图片

2). 第二次处理:

  • 获取列表的第1项,其值为5,对应的”“ = 6 - 5 = 1;

  • 删除第1项,列表只剩下3项,分别为3、2、3;

  • 由于列表中不包含1,不做任何处理;

经过第二次处理,列表只剩下3项,如下所示:

图片

3). 第三次处理:

  • 获取列表的第1项,其值为3,对应的”“ = 6 - 3 = 3;

  • 删除第1项,列表中只剩下两项,分别为2和3;

  • 由于列表中包含3,就将变量”成对数量“加1;

  • 删除值为4的列表项;

经过第三次处理,列表只剩下1项,如下所示:

图片

4). 第四次处理:

  • 获取列表的第1项,其值为2,对应的”“ = 6 - 2 = 4;

  • 删除第1项,列表没有任何数据项;

  • 由于列表中不包含4,不做任何处理;

经过第四次处理,列表为空,如下所示:

图片

通过上面的处理,我们可以统计出”成对数量“为2,其实逻辑并不复杂,只是很多孩子不太容易想到这个方法。

一旦知道了成对数量,在消除一对数字球的时候,就可以将变量减1,当变量减到0时,说明游戏结束了。

思路有了,接下来,我们就进入程序实现环节。

三.编程实现

根据上面的思路分析,我们分4步来完成作品:

  • 克隆6个数字球

  • 计时功能

  • 消除数字球

  • 游戏结束

1. 克隆6个数字球

根据前面的思路分析,先定义一个自制积木用于瞬间生成6个数字小球,代码如下:

图片

代码比较简单,强调两点:

1). 定义自制积木时,一定要勾选”运行时不刷新屏幕“选项;

2). _ID必须是私有变量,后面在消除小球时需要用到;

然后在绿旗代码块中,调用自制积木,代码如下:

图片

对于每个克隆体小球,要求所有球不能碰到到舞台边缘,且球之间不能接触。根据前面的分析,需要再定义一个自制积木,代码如下:

图片

之所以要定义成自制积木,是要确保玩家看不到重新随机位置的过程,千万别忘了勾选”运行时不刷新屏幕“选项。

在”当克隆体启动时“指令中调用这个自制积木即可,代码如下:

图片

如此一来,我们就顺利地搞定了要求1)和2),18分到手了,随机数字球的效果如下:

图片

2. 计时功能

这一步非常简单,创建一个变量”时长“,在绿旗代码中继续编写代码如下:

图片

轻轻松松的2分又到手了,够简单吧。

3. 消除小球

需要定义两个变量”小球1“和”小球2“,分别表示两个选中小球的数字,并在绿旗代码块中初始化为0,如图:

图片

然后就是点击小球的处理,在Scratch编程中,角色点击通常有如下两种实现方式:

  • 使用事件指令”当角色被点击“;

  • 使用侦测指令”角色被点击“;

本题有明确要求要停止游戏,这说明当游戏结束时,不能再点击小球了,显然使用第二种方式更加合理。

使用侦测指令来检测是否点击了克隆体小球,在”当克隆体启动时“代码块中增加如下代码:

图片

代码不少,说明9点:

1). 需要反复检测是否被点击,因此使用循环来处理;

2). 点击克隆体小球时,其实就是按下鼠标,并且克隆体碰到了鼠标指针,这里使用了”等待条件“指令,可以减少嵌套的层数;

3). 为了避免点击一个小球不松开,因此加入了一个”等待按下鼠标不成立“的组合指令,效果更好;

4). 在点击小球时,只有未选中的小球才可以点击,也就是造型编号 < 6的小球才需要处理;

5). 一旦小球被点击,首先需要切换成选中状态,其实就是切换成”造型编号+5“的造型;

6). 如果变量”小球1“为0,说明点击的是第一个数字球,设置”小球1“的值,注意这个值是未选中状态时的数字,因此它等于”造型编号 - 5“;

7). 根据前面的思路分析,第一个被选中的小球需要记录下来,因此将其编号ID保存到变量”第一个小球“中,这个变量需要提前准备好;

8). 如果”小球1“不为0,说明当前选中的是第二个数字球,设置变量”小球2“的值,和小球1一样,它等于”造型编号 - 5“,即未选中时的数字;

9). 如果点击的是第二个小球,因此需要处理这两个小球,为了方便讲解,这里使用了一个自制积木”处理一组小球“,这个不是必须的,但是当代码较多时,用自制积木不失为一个好方法。

如何处理一组小球呢,继续编写自制积木如下:

图片

当两个小球的数字和为6时,需要删除两个数字球,第一个被选中的数字球在接受到“消除“广播时,需要删除自己,代码如下:

图片

当两个小球的数字和不等于6时,需要复原,对应的代码如下:

图片

代码不难,强调3个细节:

1). 为了确保代码执行顺序,这里使用了”广播并等待“指令,尤其是消除两个小球时;

2). 不管是删除还是复原,都需要将变量”小球1“和”小球2“重新设置为0;

3). 当消除两个数字球时,成对数量相应的减1,提前创建好这个变量,后面还会用到;

到这里,不知不觉我们已经完成了题目要求的第4)、5)、6)项,这3项加起来的分数是44分,有一定的难度,但也没有想象中的那么复杂。

4. 结束游戏

根据前面的分析,需要借助列表来统计成对数量,先创建一个列表“数字球”,将其初始化为空。

克隆数字球时,将每个数字球的造型编号加入列表,在克隆体随机造型时增加一行指令,如下:

图片

再定义一个自制积木来统计成对数量,代码如下:

图片

在上面的思路分析中,已经进行了详细讲解,这里就不再啰嗦了。

在绿旗代码块中,调用自制积木,如下:

图片

一共增加了3个指令,强调两点:

1). 一定要记得先清空列表;

2). 在调用自制积木之前等待了0.1秒,是确保列表中的数据已经全部就绪;

最后就是结束游戏了,当变量“成对数量”变为0时,就可以停止脚本了。

我们可以单独的写一段代码,也可以将计时的循环改成条件循环,相对来说,后者会更好一些。

修改代码如下:

图片

对应的,在接收“结束”消息时,停止脚本,代码如下:

图片

这里并没有直接使用“停止全部脚本”指令,是确保没有消除的小球还显示在舞台上,如果停止全部脚本,那么所有的克隆体都会消失,效果要差一点。

至此,整个作品就创作好了,是时候来测试自己的作品啦。

四.总结与思考

本题是初级组编程部分第5题,分数为80分,积木块数量100个左右,涉及到的知识点主要包括:

  • 克隆编程;

  • 自制积木;

  • 私有变量;

  • 事件广播机制;

  • 列表及相关处理;

作为本次初级组省赛的第5题,也是压轴题,难度较大,完成时间30分钟左右。本题的难点有3个,一是如何确保生成的数字球不能相互重叠,二是如何消除和为6的数字小球,三是如何统计成对数量。

关于第一个问题,超平老师总结了一个“借鸡生蛋”的编程小技巧,在历届蓝桥杯比赛中,至少已经出现了3次。第一次是14届国赛中的《矿工挖宝》作品,第二次是2024年1月28日STEMA测评中的《栽花》作品,这是第三次。

关于第二个问题,其实有很多类似的作品,除了11届省赛中的《对对碰》作品,超平老师的编程课中,也有不少同类型作品。

比如,甲骨文解密作品,如图:

图片

再比如,数学记忆翻牌游戏,如图:

图片

所以说,在平时学习的过程中,要尝试创作各种不同的作品,见多识广嘛。

第三点,如何统计成对数量是最难的,但是如果你仔细查看题目需求,发现只一步只有18分,从考试策略的角度来讲,完全可以不要嘛。

你把其它的全部做好做对,一等奖肯定就到手了,如果还有时间,再来研究研究,你说呢?

你还有什么好的方法吗,非常欢迎您和超平老师交流分享。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄


http://www.ppmy.cn/server/115305.html

相关文章

【leetcode刷题之路】面试经典hot100(2)——普通数组+矩阵+链表

文章目录 5 普通数组5.1 【动态规划】最大子数组和5.2 【排序】合并区间5.3 【数组】轮转数组5.4 【前缀和】除自身以外数组的乘积5.5 【哈希表】缺失的第一个正数 6 矩阵6.1 【哈希表】矩阵置零6.2 【模拟】螺旋矩阵6.3 【模拟】旋转图像6.4 【分治】搜索二维矩阵 II 7 链表7.…

【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制

K8s 的鉴权管理&#xff08;二&#xff09;&#xff1a;基于属性 / 节点 / Webhook 的访问控制 1.基于属性的访问控制&#xff08;ABAC 鉴权&#xff09;2.基于节点的访问控制&#xff08;node 鉴权&#xff09;2.1 读取操作2.2 写入操作 3.基于 Webhook 的访问控制3.1 基于 We…

TikTok Shop9.9大促爆单忙不过来?EasyBoss ERP给你全方位的助力!

又是一年9.9大促&#xff0c;想必大多数Shopee/TikTok本土卖家的店铺订单量都远超日常了吧&#xff1f; 图源&#xff1a;网络 爆单是件大好事&#xff0c;但背后却是店铺运营的一场硬仗。因为出单后&#xff0c;多店铺的订单处理、仓库发货、售后、数据分析等环节都有大量的工…

C++中的内存管理和模板初识

一、内存管理 1.1内存区域的划分 1.1.1内存划分区域图示 1.1.1补&#xff1a;堆和栈都可以进行动态分配和静态分配吗&#xff1f; 不是的&#xff0c;堆无法进行静态分配&#xff0c;只能动态分配&#xff1b;栈可以利用_alloca动态分配&#xff0c;但是分配的空间不能用fre…

网络学习-eNSP配置路由器

#PC1网关&#xff1a;192.168.1.254 #PC3网关&#xff1a;192.168.3.254 #PC4网关&#xff1a;192.168.4.254# 注&#xff1a;路由器接口必须配置不同网段IP地址 <Huawei>system-view Enter system view, return user view with CtrlZ. #给路由器两个接口配置IP地址 [Hua…

苹果系统(MacOS)中的Finder如何方便展现根目录

前言 初用Finder的时候&#xff0c;感觉非常的不方便。没有Windows的文件管理器来的简单明了。 本文&#xff0c;就是针对找不到文件根目录和隐藏文件夹的设置&#xff0c;进行了说明&#xff0c;供大家参考。 1、设置前 打开Finder&#xff0c;看不到DISK&#xff0c;也就是…

【vue使用Sass报错】启动项目报错 Syntax Error: SassError: expected selector

出现的问题 新项目启动的时候&#xff0c;提示&#xff1a; Syntax Error: SassError: expected selector 看了一下发现是sass使用样式穿透/deep/报的错 /deep/其实是已经过期的写法&#xff0c;某个版本之后就不支持了 但是我同事并没有出现同样的问题&#xff0c;不知道是为…

边缘检测运用

文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 …