• 豌豆射手-第13届蓝桥杯Scratch选拔赛真题精选


    [导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第72讲。

    蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选了一部分题目进行解读。

    第13届蓝桥杯青少年组第3次选拔赛于2021年11月27日举行,形式为线上考试。Scratch分为初级组和中级组,其中初级组面向7~10岁孩子,中级组面向11~14岁孩子。

    豌豆射手,本题是2021年11月27日举行的第13届蓝桥杯Scratch选拔赛真题编程第4题,初级组和中级组都有此题,题目要求编程创作植物大战僵尸游戏中的一个典型场景,即在舞台上放置豌豆射手,并实现发射子弹的效果。

    先来看看题目的要求吧。

    一.题目说明

    编程实现:

    在舞台上放置豌豆射手,并实现发射子弹的效果。

    具体要求:

    1). 点击绿旗,角色、背景如图所示;

    2). 在左上角豌豆射手位置,按下鼠标左键,会生成一个新豌豆射手,拖动鼠标新豌豆射手跟随鼠标移动,移动到新的位置松开鼠标左键,新豌豆射手会被放置在这个新位置,新豌豆射手不会再跟随鼠标移动;

    3). 豌豆射手只能放置在黄色土地上,如果放置在灰色石砖上,豌豆射手会在0.1秒后消失;

    4). 在黄色土地上放下豌豆射手之后,豌豆射手就开始持续变化造型(造型间的切换间隔0.1秒),每当切换到最后一个造型时,豌豆射手会发射子弹(如图所示);

    5). 子弹水平向右侧飞行,在右侧边缘消失(每个豌豆射手都可以持续发射子弹)。

    评分标准:

    • 5分:满足要求1);

    • 6分:满足要求2);

    • 8分:满足要求3);

    • 8分:满足要求4);

    • 3分:满足要求5)。

    二.思路分析

    本题包含两个角色,分别是豌豆射手和子弹,如图所示:

    植物大战僵尸是由美国宝开游戏公司(PopCap Games)开发的一款益智策略类单机游戏,于2009年5月正式上线。玩家通过武装多种植物切换不同的功能,快速有效地把僵尸阻挡在入侵的道路上,游戏一推出,就风靡全世界,深受人们的喜爱。

    本作品要求实现植物大战僵尸游戏中的一个小模块,即种植豌豆射手并发射子弹。

    作品有两个难点,一是如何控制豌豆射手只能放在黄色的砖块上,二是如何确确保每一个子弹克隆体都是从当前豌豆射手位置发射出去的。

    对于第一点,我们可以通过颜色来检测,当松开鼠标时,如果碰到的是灰色,则删除此克隆体。

    对于第二点,每个子弹克隆体的位置各不相同,它的位置是由豌豆射手决定的,而豌豆射手也是克隆体,各自放在不同的黄色砖块上。我们可以在豌豆射手中来克隆子弹角色,同时将豌豆射手的位置保存起来,子弹克隆体在启动时将其位置设置为保存起来的位置即可。

    常规的思路是创建两个变量,将豌豆射手的x、y坐标保存起来,子弹克隆体在启动时移到保存的x、y位置。但是,这里有一个问题,随着豌豆射手的增加,克隆的子弹越来越多,会出现错位的情况,即不同豌豆射手发射出的子弹都从一个位置出现的。

    要解决这个问题,可以借助列表,每次克隆子弹时,将豌豆射手的x、y坐标存到列表中,当子弹克隆体启动时,取出坐标,设置好子弹的位置后,立刻删除列表中的数据,这样可以确保,当前子弹克隆体只需要取出列表中的第一项数据即可,这其实就是队列的特点。

    三.编程实现

    根据题目描述和思路分析,我们可以分3步来编写程序:

    • 克隆豌豆射手

    • 放置豌豆射手

    • 克隆子弹并发射

    1. 克隆豌豆射手

    当绿旗被点击时,将豌豆射手移到舞台左上角,如果鼠标移到豌豆射手位置,并按下鼠标,就克隆一个豌豆射手,代码如下:

    需要注意,为了避免重复克隆,这里增加了一个限制条件,即等待松开鼠标后才能进行下一次循环。

    2. 放置豌豆射手

    豌豆射手克隆体在启动时,会一直跟随鼠标移动直到松开鼠标,代码如下:

    当松开鼠标后,可以放置豌豆射手了吗?

    非也,我们还需要判断豌豆射手是不是放在了黄色土地上,前面的思路分析中提到使用颜色碰撞来检测,但是这里的砖块比较小,而豌豆射手角色有点大,直接进行颜色碰撞检测肯定会出现较大的误差。

    因此,我们要将豌豆射手角色变小,最好是变成一个小点点,可以给角色再增加一个造型,如图:

    有了这个小点点造型,判断就非常精确了,先将角色换成点造型,再判断是否碰到灰色,如果是则等待0.1秒后删除克隆体,否则就每隔0.1秒切换到下一个造型,代码如下:

    简要说明两点:

    1). 这里的灰色有深有浅,所以这里选择了两种灰色;

    2). 在切换下一个造型的时候,或出现小点点造型,所以这里增加了一个条件判断,当切换到小点点造型时,立刻换成第一个造型,从而避免出现小点点造型;

    3. 克隆子弹并发射

    克隆子弹是本题的难点,根据思路分析,需要先创建好两个列表“x”和“y”,如图:

    当点击绿旗时,需要将列表清空,代码如下:

    你可以将这个绿旗代码块和前面的绿旗代码块合并起来。

    在Scratch中克隆角色,通常有两种方式,一是在当前角色中克隆自己,二是在别的角色中克隆自己。很多同学都喜欢使用第一种方式,大多数情况下是没有问题的,但是要避免通过发送广播消息,然后克隆自己。这是因为克隆体也会接收到广播消息,这会导致克隆体爆炸式增长。

    本题正是这种情况,所以我们应该毫不犹豫的选择第二种方式,在豌豆射手角色中克隆子弹,根据题目描述,当切换到第4个造型时,就发射一颗子弹,对应的增加代码如下:

    重点来了,在克隆子弹之前,我们需要将当前豌豆克隆体的坐标存放到列表x和列表y中。

    对于子弹角色来说,只需要编写“当作为克隆体启动时”代码块就可以了,先设置好克隆体的位置,然后立刻删除列表中的数据,再让子弹向右移动直到舞台右边缘。

    切换到子弹角色,编写代码如下:

    重点说明两点:

    1). 由于每次使用完列表数据就立刻删除了,因此列表不会保存太多的数据,更重要的是,这样可以确保,每次只需要从列表中取出第一项数据即可,这种先进先出的特点,就是数据结构中的队列,保存坐标时,就是入队操作,删除坐标时,则是出队操作,如图所示:

    2). x和y保存的是豌豆射手的位置,这个位置并不是豌豆射手嘴巴的位置,因此需要向上向右挪一点,所以这里在两个坐标的基础之上分别增加了15和10。

    至此,我们的豌豆射手发射子弹效果就已经做好了,你可以测试效果了,测试的时候,可以将列表显示出来,观察一下列表数据的变化情况,从而更好的理解列表的使用及队列的入队和出队效果。

    四.总结与思考

    本题难度系数为5,积木块数量在62个左右,涉及到的知识点主要包括:

    • 克隆角色,重点注意在克隆体中进行二次克隆的情况;

    • 妙用小点点造型结合颜色碰撞进行条件侦测;

    • 如何侦测松开鼠标,使用“按下鼠标”+“不成立”;

    • 列表的基本操作及作用;

    • 队列的基本思想和用法。

    本作品难度较大,难点在于如何确保每个克隆体子弹都从正确的位置发射出去,这里使用了队列的数据结构,利用其先进先出的特点,确保每个子弹克隆体从正确的位置出发。

    本题以经典的植物大战僵尸游戏为背景,学习如何使用列表来精确控制克隆体的位置,灵活运用了队列的数据结构及实现算法,是一道质量很高的编程题。

    如果你觉得文章对你有所帮助,别忘了点赞,你的鼓励是我坚持继续写下去的最大动力,Thanks♪(・ω・)ノ。

  • 相关阅读:
    windows、Mac如何安装vue开发环境?
    Pioneer | X METAVERSE PRO Explores the New Value of “Mining + Finance“
    Android 12,调用系统库libft2.so 遇到的各种问题记录
    Linux C应用编程-5-线程
    数据地图搜索功能模块项目总结【springBoot+Elasticsearch】
    对软件代码坏味道的认识
    LeetCode 300. 最长递增子序列
    vue-cli脚手架创建项目时报错Error: command failed: npm install --loglevel error
    36 岁,我又跳槽了!
    Mybatis-Plus实体类继承Model的使用
  • 原文地址:https://blog.csdn.net/diamondwang2012/article/details/127788584