[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第152讲。
第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕,编程题一共有6题,分别如下:
弹跳小球,本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编程第4题,题目要求编程实现一个弹跳小球游戏。游戏开始后,挡板跟随鼠标左右移动,小球碰到左右边缘或挡板就反弹,如果碰到上下舞台边缘则游戏结束。
先来看看题目的要求吧。
编程实现:
弹跳小球。
具体要求:
1). 运行程序,角色、背景如图所示(变量“分数”初始值为0);
2). 小球面向下方随机方向持续移动 (移动步数5 ~ 10,参照程序演示视频);
3). 上下两个挡板同时跟随鼠标左右水平移动;
4). 当任意—个挡板接到小球后,小球进行反弹(参照程序演示视频);
5). 当任意一个挡板接到小球时,左上角分数加1;
6). 当小球碰到舞台左右边缘时,发生反弹;
7). 当小球碰到舞台上下边缘时,游戏结束。
评判标准:
5分:满足"具体要求"中的1);
5分:满足"具体要求"中的2);
10分:满足"具体要求"中的3);
15分:满足"具体要求"中的4);
5分:满足"具体要求"中的5);
10分:满足"具体要求"中的6);
10分:满足"具体要求"中的7)。
本题包含3个角色,分别是上下挡板和弹球,如图所示:
本题考查的知识点是运动编程,重难点是碰撞检测和反弹实现。
其中两个挡板角色的功能一样,只需要跟随鼠标左右移动即可,相对比较简单。
对于弹球角色来说,在舞台范围内来回运动,当碰到舞台左右边缘或者挡板时,反弹回来,如果碰到上下边缘则游戏结束。
这里的难点有两个:
如何单独检测是否碰到舞台上下边缘;
弹球碰到挡板是如何反弹的;
对于第一个问题,很多同学的第一反应是使用侦测模块中的“碰到舞台边缘”,如图:
但是本题的情况有点特殊,上下边缘和左右边缘分属两种情况,不能使用这个指令,那该如何判断呢?
上下左右不就是描述位置的么,使用坐标就可以,将弹球的上边缘和舞台上边缘对齐,如图所示:
此时弹球的y坐标是135,这就说明当y坐标 > 134时,弹球碰到上边缘了。同理,当y坐标< -134时,弹球就碰到下边缘了。只要出现其中一种情况,就结束游戏,两种情况是逻辑或的关系。
至于左右边缘,它是需要反弹的,我们直接使用“碰到边缘就反弹”指令即可。
对于第二个问题,通常有两种处理方式:
1). 直接旋转一个角度,从而让小球反弹回来;
2). 模拟碰到边缘就反弹指令,精确的实现反弹效果;
方式一比较简单,但效果不是很好。方式二效果一流,但很多同学不知道如何实现,今天,超平老师就来解读一下这其中的奥秘。
其实非常简单,使用一个篮球角色(其它角色也可以),设定一个角度,比如60度,撞向上边缘,如图:
然后编写一段代码,让篮球移动起来,碰到边缘就反弹,代码如下:
当篮球反弹回来时,方向变成了120,如图:
你可以多尝试使用不同的角度,撞向上边缘和下边缘,下面的是超平老师测试的一组数据:
碰撞前:60,碰撞后:120
碰撞前:75,碰撞后:105
碰撞前:30,碰撞后:150
碰撞前:135,碰撞后:45
碰撞前:180,碰撞后:0
相信聪明的你,已经发现了这里面的规律。
规律就是碰撞前后的方向之和等于180度,所以我们可以使用如下代码就可以获取角色碰到上下边缘反弹的方向:
关键问题解决了,接下来,我们进入具体的编程实现环节。
根据上面的思路分析,我们分4步来编写程序:
挡板的移动
弹球的移动
弹球反弹
游戏结束
1. 挡板的移动
挡板相对比较简单,绿旗点击之后,让挡板重复跟随鼠标左右移动即可,以挡板1为例,对应的代码如下:
简单说明3点:
1). 这里的”等待0.5秒“指令不是必须的,之所以写上,是想让点击绿旗之后,不会立刻跟随鼠标移动;
2). 由于挡板只在左右方向上跟随鼠标移动,所以我们只需要改变挡板的x坐标,使其保持和鼠标的x坐标一致即可;
3). 两个挡板的代码基本一样,写好挡板1的代码之后,直接复制到挡板2中,再修改其y坐标即可,代码如下:
针对上面的第二点,还可以用另一种方法来实现,先让角色移动到鼠标指针,然后再将角色的x坐标设为-145,代码如下:
当然,使用这种方法的时候,挡板2的代码也需要略作修改,将-145改为145,因为挡板2处于舞台下边缘,其y坐标为145。
2. 弹球的移动
首先,我们来实现弹球的移动,点击绿旗后,弹球面向下方移动,先不考虑挡板,实现球的反弹效果,这个我们可以直接使用”碰到边缘就反弹“指令,在弹球角色中,编写代码如下:
需要说明的是,这里的方向设置,只要是在90到-90之间,确保面向下方即可,这里的255和-105其实是一样,但是我们不能写在105和-105之间,因为105到-105之间表示的是面向上方,比如随机出来的0,刚好是面向正上方。
3. 弹球反弹
当弹球碰到挡板后,会反弹回来,同时增加1分,根据上面的思路分析,只需要改变弹球的方向即可,在弹球角色中,新增加一个代码块,代码如下:
注意,这里需要先将”分数“变量创建好。
4. 游戏结束
当弹球碰到舞台上下边缘时,游戏结束,根据前面的思路分析,我们可以通过角色的y坐标进行判断,在弹球角色中,再增加一个代码块,编写程序如下:
需要注意的是,为了让代码结构更简单,我们单独使用了一个代码块用于判断是否碰到舞台上下边缘。同时对于这种满足一次条件就结束的情况,使用等待条件指令,是最简单的。
至此,整个作品就创作好了,一个简单有趣的弹球游戏就正式诞生了,可以好好体验一下咯。
本题是中级组编程部分第4题,分数为60分,积木块数量40个左右,涉及到的知识点主要包括:
运动编程,重点是角色方向;
如何完美实现角色的反弹效果;
变量的使用;
运算符,逻辑或和比较等
随机数的使用;
如何获取鼠标的坐标;
这是中级组的第4题,题目难度中等,完成时间在15分钟左右,重点是如何实现弹球碰到挡板反弹的效果。
角色反弹是Scratch编程中非常典型的一个场景,尤其是各类弹球游戏中,比如打砖块、乒乓球、篮球等。
除了直接使用“碰到边缘就反弹”指令外,针对碰到某个指定角色反弹的效果,我们也要能够快速实现,通过本教程的学习,相信你已经掌握了其原理和实现方式。
超平老师给你留一个思考题,角色碰到舞台左右边缘时,反弹前后的角度具备什么样的规律呢?
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要素材和源码的,可以移步至“超平的编程课”gzh。