推箱子-第14届蓝桥杯国赛Scratch真题初中级组第3题

 [导读]:超平老师的《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,或者私信本人。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值