[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第145讲。
推箱子,本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第3题,题目要求编程实现推箱子游戏 。玩家通过按下方向键来推动箱子前进,当三只箱子分别被男孩推到三个黑色方框上,程序结束。
先来看看题目的要求吧。
一.题目说明
编程实现:
推箱子。
具体要求:
1). 点击绿旗,角色、背景如图所示;
2). 按下一次键盘上的方向键,如果男孩面向方向与按下方向键的方向一致,则男孩向此方向前进一个格子的距离(男孩碰到墙壁就不能再次继续移动);
3). 按下一次键盘上的方向键,如果男孩面向方向与按下方向键的方向不一致,则男孩需转向所按下方向键的方向;
4). 男孩碰到箱子后,男孩推动箱子同向移动,当箱子碰到墙壁或其他箱子时不能再继续移动;
5). 当三只箱子分别被男孩推到三个黑色方框上,程序结束。
评判标准:
-
3分:满足"具体要求"中的1);
-
10分:满足"具体要求"中的2);
-
10分:满足"具体要求"中的3)。
-
17分:满足"具体要求"中的4);
-
10分:满足"具体要求"中的5)。
二.思路分析
本题包含3个角色,分别是箱子、黑色方框和男孩,如图所示:
本题效果看起来简单,但是要实现起来还是挺有难度的,我们使用计算思维将作品功能进行拆分,大致可以分成如下几个模块:
-
初始化地图;
-
控制男孩移动;
-
推动箱子前进;
-
判断游戏成功;
第一个模块,初始化地图,主要是指3个箱子和3个黑色方框的显示,黑色方框表示箱子的目标位置。我们可以使用克隆来生成箱子和黑色方框,注意调整好位置。
第二个模块,控制男孩移动,玩家是通过方向键来控制男孩上下左右移动的,需要注意三点:
1). 每次移动之前需要确保男孩的方向和按键一致,否则就是转向操作;
2). 碰到墙壁时,不能向前移动,可以使用后退指令来实现;
3). 推动箱子前进时,如果碰到前面有墙壁和箱子,不能向前移动,也可以使用后退指令来实现;
第三个模块,推动箱子前进,当箱子碰到男孩时,就说明箱子要前进了,但是要注意前方如果有箱子或墙壁,就不能前进。
第四个模块,当3个箱子分别推到3个黑色方框内,游戏结束,我们可以使用一个变量来记录已经放好的箱子数量。但是需要注意一点,就是箱子推到黑色方块位置后,还可以推出来,此时要同步更新变量的值。
接下来,我们进入具体的编程实现环节。
三.编程实现
根据题目描述和思路分析,我们分4步来编写程序:
-
初始化地图
-
控制男孩移动
-
推动箱子前进
-
判断游戏成功
1. 初始化地图
先从男孩开始吧,这个比较简单,只需要设置好坐标和方向即可,代码如下:
其次是箱子,按照题目要求,调整好箱子的位置,在3个不同的位置分别克隆即可,切换到箱子角色,编写代码如下:
最后是黑色方框,和箱子一样,调整好位置,克隆3个方框,切换到黑色方框角色,编写代码如下:
运行程序,效果如下:
这样一来,初始化地图效果就已经做好了。
2. 控制男孩移动
在作品中,是通过按下方向键来控制男孩移动的,关于按键编程,通常有两种写法:
-
直接使用”当按下xx键“指令;
-
在绿旗代码块中,使用循环结合“按下xx键”指令 ;
到底应该使用哪一种呢,从写代码的角度来讲,前者更为简单,但是它有一个缺点,就是不受绿旗控制,也就无法做到完全停止游戏,只要你按键,代码还会继续执行。
本题明确要求了游戏结束,所以应该使用后者。在使用第二种方式的时候,可以根据实际情况做灵活处理。
比如,本作品中要对上下左右4个方向分别进行判断,代码有点长,我们可以分成4个代码块,每个代码块处理一个方向。
如果只是对一个方向进行判断,我们还可以使用“等待条件”指令替代“如果...那么” + “按下xx键”。
我们以向上移动为例,在男孩角色中编写代码如下:
简单说明三点:
1). 这里增加了一个“等待按下↑键不成立”,确保按下再松开算一次按键;
2). 如果方向向上,则向上移动50步,否则就面向0方向;
3). 如果碰到红色的墙壁,则退50步,后退最简单的写法就是移动-50步;
其它3个方向的代码和这个基本一样,就不再列出了。
3. 推动箱子前进
根据前面的思路分析,当箱子碰到男孩时,就意味着男孩在推箱子前进了。
所以,我们可以在箱子中检测是否碰到男孩了,如果碰到男孩,则沿着男孩的方向前进一格,如果箱子前面有箱子或是墙壁,则需要退回来。
切换到箱子角色,在克隆体启动时代码块中,编写代码如下:
当箱子后退时,男孩也要后退一格,所以这里发送了一个“后退”的广播消息。
相应的,男孩角色在接收到广播消息后,需要后退50步,切换到男孩角色,增加如下代码:
这样一来,推箱子的效果就已经实现了。
4. 判断游戏成功
先创建一个变量“成功数量”,用于表示已经到达目标位置的箱子。
当黑色方框碰到箱子了,将数量加1,同时还需要检测,方框是否离开箱子了,一旦离开,就需要将数量减1。
切换到黑色方框角色,编写代码如下:
当成功数量为3时,游戏结束,男孩就不再移动了,切换到男孩角色,编写代码如下:
需要注意,这里将变量的初始化放到了等待指令的前面,是确保在判断之前变量的初始值一定为0。
到这里,基本上就可以实现作品的全部功能了,但是代码并没有完全停止,因为箱子克隆体和黑色方框克隆体还有重复执行的代码呢。
我们可以使用同样的方式,来停止克隆体的代码,在箱子角色和黑色方框角色中,分别增加如下代码:
需要注意的是,对于克隆体而言,要停止其它脚本,也必须放在“当作为克隆体启动时”代码块中。
至此,我们的推箱子游戏就创作完成了,赶紧来体验一下吧,效果还是很不错的。
四.总结与思考
本题是编程部分第3题,分数为50分,积木块数量120个左右,涉及到的知识点主要包括:
-
初始化设置;
-
克隆编程;
-
事件编程,包括按键处理和事件广播机制;
-
运动编程;
-
变量的运用;
-
等待指令的妙用;
本题取材于经典游戏《推箱子》,要求实现其中的一个关卡效果,题目难度不小,建议完成时间10~20分钟,中级组考生10分钟,而初级组考生约为20分钟。
本题最大的难点在于如何实现男孩推着箱子前进,我们的解决方案就是碰撞检测,再结合后退机制。每次都默认可以前进,一旦发现前方有箱子或者碰到墙壁,就立刻后退,后退时巧妙了利用了负数的编程技巧,从而让代码变得超级简单。
如果仅从知识点层面来看,本题中所涉及到的都是常见知识点,并没有特别难的,关键还是在于灵活运用。
正所谓熟能生巧,只要你不断的去练习、去思考、去总结,不管是什么样的作品,你都能轻松的应对。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh,或者私信本人。