[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第146讲。
矿工挖宝,本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第4题,题目要求编程创作矿工挖宝游戏 。玩家使用鼠标点击地面以下位置,夹子就慢慢移到点击位置,如果碰到金块或钻石就拾取起来,金块和钻石都拾取后,结束游戏。
先来看看题目的要求吧。
编程实现:
矿工挖宝。
具体要求:
1). 点击绿旗,角色、背景如图所示(变量“数量”初始值为0);
2). 等待1秒,地面以下随机位置生成2个金块,2颗钻石,且金块与钻石大小随机(大小范围:50 ~ 150),金块和钻石都不重叠,也不能接触舞台边缘;
3). 夹子时刻面朝鼠标方向,鼠标点击地面以下任意位置时,1秒内夹子移动到所点击位置;
4). 绳索同时跟随夹子移动伸长或缩短(绳索使用画笔绘制);
5). 夹子到达的点击位置如果有金块或钻石,立即拾取(拾取时夹子切换成夹取造型);
6). 夹子1秒内原路返回;
7). 当金块或钻石跟随夹子回到矿工位置后消失,数量加1(夹子造型切换成张开造型);
8). 重复执行3)、4)、5)、6)、7)步骤,2个金块和2颗钻石都被夹子拾取成功后,程序结束。
评判标准:
4分:满足"具体要求"中的1);
9分:满足"具体要求"中的2);
9分:满足"具体要求"中的3);
10分:满足"具体要求"中的4);
6分:满足"具体要求"中的5);
10分:满足"具体要求"中的6);
6分:满足"具体要求"中的7);
6分:满足"具体要求"中的8)。
本题包含3个角色,分别是宝物、夹子和矿工,如图所示:
其中矿工角色是最简单的,只需要设置好其位置即可。
宝物角色可以分为一静一动两个部分,一静是指在舞台下方生成2颗钻石和2个金块,一动则是指当碰到夹子时跟随夹子移动。
动相对比较简单,我们重点来分析静,对于静而言,可以使用克隆分别生成2颗钻石和2个金块,这里的难点在于如何确保4个克隆体不能重叠。如果直接使用移动随机位置,肯定会出现重叠情况,如何避免出现重叠情形呢?
超平老师给你提供如下两种思路:
分段克隆,将舞台从左到右分成4段,然后在各自的范围内随机位置克隆宝物;
碰撞检测,在舞台上指定范围内克隆宝物,然后检测是否碰到宝物了,如果碰到宝物,则重新移到随机位置;
这里有一个很重要的编程技巧,就是在如何在角色中如何检测碰到自己,只需要如下两步:
1). 第一步,先切换到其它角色中,找到碰到角色指令,选择角色为宝物;
2). 第二步,将碰撞指令复制到宝物角色中;
夹子角色看起来比较简单,当使用鼠标点击某个位置,让夹子滑行到该位置,然后原路返回(同样是滑行)即可。
但是要考虑一种情况,就是一旦夹子碰到宝物,它是继续滑行到鼠标位置还是立刻返回呢?如果是立刻返回,又该如何实现呢?
在夹子移动的过程中, 还有一根绳索,这个是需要使用画笔来绘制的。思路相对比较简单,就是在夹子和矿工两点之间重复绘制线段即可,每次绘制之前需要先擦除之前的线段,当然,这需要再增加一个画笔角色。
接下来,我们进入具体的编程实现环节。
根据题目描述和思路分析,我们分5个步骤来编写程序:
初始化设置
克隆宝物
夹子前进和返回
绳索效果
拾取宝物
1. 初始化设置
这里的初始化包括矿工角色和夹子角色,切换到矿工角色,编写代码如下:
再切换到夹子角色,编写代码如下:
都是一些常见的设置,这里就不再解释了。
2. 克隆宝物
在前面的思路分析中,提供了两种思路,分别是分段克隆和碰撞检测。其中分段克隆实现起来比较简单,只是随机性不够,这里重点介绍碰撞检测的实现方式。
切换到宝物角色,编写代码如下:
代码比较好理解,说明两点:
1). 之所以分两次重复执行,是确保克隆2颗钻石和2个金块;
2). 注意x和y坐标的范围,自己多测试两次,确保宝物没有碰到舞台边缘,同时在地面以下位置。
按照这种方式克隆出来的宝物,很容易出现重叠情况,所以对于每个克隆体,都做一个判断,只要碰到宝物,就重新随机位置, 对应的代码如下所示:
再强调一遍,在宝物角色中,是无法使用“碰到宝物”指令的, 如图:
但是,在其它角色中是可以的,比如在夹子角色中,如图:
然后,将该指令复制到宝物角色中即可,这样就可以确保宝物角色不会重叠了。执行程序,效果如下:
3. 夹子前进和返回
我们先不考虑夹子拾取宝物的情况,这也是一个很重要的编程技巧,就是将复杂的问题拆多个简单的问题。
对于本题而言,就是先实现夹子角色独立的功能,然后再考虑夹子碰到宝物的情况。具体来说,有如下3点:
夹子时刻面向鼠标方向;
在地面以下点击鼠标才有效;
先滑行到鼠标位置,再滑行到起点位置;
在夹子角色中的绿旗代码块中,继续编写如下代码:
在两个滑行指令中间,增加了一个“等待0.5秒”指令,这个并不是必须的,你也可以设置为其它数字。
4. 绳索效果
在夹子滑行的过程中,绳索同时跟随夹子移动伸长或缩短,这个需要借助画笔角色来实现,首先增加一个画笔角色,如图:
其次,要明确画图的时机,一旦夹子移动了,就需要绳索,所以在夹子角色中的滑行指令之前,发送一个广播消息。
切换到夹子角色中,在刚才的代码块中,增加广播指令,如图:
接下来切换到画笔角色,当绿旗点击时,设置好画笔的颜色、粗细,代码如下:
当接收到广播消息时,开始重复擦除和绘制,继续编写代码如下:
代码不难,简单说明两点:
1). 由于滑行的时间是1秒,所以重复绘制的持续时间也是1秒,这里利用了计时器,先将计时器归零,当计时器> 1时,就不再绘制了;
2). 这里使用了自制积木,主要是为了简化代码结构。
执行程序,可以看到绳索随夹子伸缩,如图:
5. 拾取宝物
这是最后一步,也是最关键的一步了,所谓拾取宝物,是指当夹子碰到宝物时,宝物跟随夹子回到矿工位置然后消失的效果。
这会涉及到宝物和夹子两个角色,对于宝物克隆体来说,需要检测是否碰到夹子,如果碰到夹子,就跟随夹子移动,当碰到矿工时,删除克隆体即可。
同时,还需要考虑两个问题,一是要使用变量记录拾取宝物的数量,二是当抓到宝物时,需要告知夹子,你可以返回了。
切换到宝物角色,编写代码如下:
简单说明两点:
1). 这里使用了一个单独的代码块,只是为了方便讲解,实际上完全可以直接写在之前的“当作为克隆体启动时”代码块的后面;
2). 这里的变量需要进行初始化,一般是放在绿旗代码块中,这里就不单独列出了。
当夹子抓到宝物时,夹子是继续前进到鼠标点击位置,还是立刻原路返回呢?
题目其实并没有要求这一点,所以在比赛的时候,可以忽略这一点,毕竟时间非常紧张,如果是这样的话,上面代码中的广播指令就可以不用写。
如果考虑到游戏的完整性和可玩性,肯定是立刻原路返回才更加合理,你说是吧。
如此一来,夹子角色在接收到“返回”广播时,应该立刻终止之前的滑行指令,然后立即滑行到起点位置。
这就需要对夹子角色的代码结构进行改造,改用事件广播机制来实现循环,这样就可以确保在停止其它脚本后,通过广播重新执行代码。
首先,在绿旗代码块中,发送一个“开始”的广播消息,代码如下:
当接收到“开始”广播消息后,重复执行没有抓到宝物时的前进和返回,代码如下:
这里将原来的无限循环改成了条件循环,是因为当所有宝物都抓取完毕,游戏就结束了。
当接收到”返回“消息时,就意味着抓到宝物了,此时应该停止正在滑行的动作,立刻滑行到起点位置,对应的代码如下:
简单说明3点:
1). 滑行之前需要发送“画线”的广播,重新绘制绳索;
2). 在抓到宝物时,夹子需要切换成拾取造型,完成后又恢复到张开造型;
3). 宝物抓取完毕,又发送了一个”开始“的广播,原来停止下来的代码又可以重新执行。
至此,一个完美的矿工挖宝游戏就完成了,赶紧来体验一下吧。
本题是编程部分第4题,分数为60分,积木块数量80个左右,涉及到的知识点主要包括:
克隆编程,重点是控制克隆体的位置;
运动编程,重点是滑行指令的应用及其特点;
Scratch画笔;
事件广播机制;
本题难度不小,涉及的知识点比较多,综合性较强,建议完成时间15~20分钟,中级组考生15分钟,而初级组考生约为20分钟。但是对大部分同学来说,要在这个时间内完成,还是挺有挑战性的。
在本作品中,有3个非常重要的编程技巧,再次强调一下:
1). 角色可以检测是否碰到自己(通常是有克隆体的情况),实现方法就是从别的角色中复制一个碰到角色指令;
2). 对于循环结构,除了使用重复指令之外,还可以使用事件广播机制来实现,这样还可以随时在需要的时候终止循环,然后再重新循环;
3). 在创作游戏的时候,针对一些特殊的场景,可以使用画笔巧妙的实现,比如本作品中的绳索,再比如小猫钓鱼作品中的钓鱼线,愤怒的小鸟作品中的弹弓效果等待。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香
需要素材和源码的,可以移步至“超平的编程课”gzh,或者私信本人。