扫雷游戏-第15届蓝桥杯国赛Scratch中级组真题第6题

文摘   教育   2024-10-31 20:45   湖北  

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第198讲

如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题并订阅合集,查阅教程更方便。

第15届蓝桥杯国赛已于2024年9月7日正式落下帷幕,初级组和中级组共用一套试题,编程题一共有6题(初级组只有前5题),分别如下:

扫雷游戏,本题是2024年9月7日举行的第15届蓝桥国赛Scratch中级组编程第6题,题目要求编程创作一个简易版的扫雷游戏在一个4行4列的方块中有若干个随机方块中藏有地雷,游戏的目标是打开所有没有藏雷的方块,同时避开所有藏雷的方块

先来看看题目的要求吧。

题目说明


编程实现:
扫雷游戏

扫雷是一款益智小游戏,在一个4行4列的方块中有若干个随机方块中藏有地雷,游戏的目标是打开所有没有藏雷的方块,同时避开所有藏雷的方块。

该游戏有如下规则:

1、游戏开始时,玩家使用鼠标左键点击方块,若该方块中没有藏地雷,方块中会显示一个数字,显示的数字表示以该方块为中心的周围8个方块中藏的地雷数量;

2、玩家可以将鼠标指针移到任意一个方块上,然后按下空格键来插旗标记或者取消插旗标记,游戏中玩家可以用此方法来标记藏有地雷的方块以免游戏过程中误点;

3、胜负判定:如果只剩下藏有地雷的方块未被点击,则游戏胜利;在此之前如果点击了藏有地雷的方块,则游戏失败;

4、 游戏有三个难度等级:1级(1颗地雷)、2级(2颗地雷)、3级(3颗地雷)

具体要求:

1). 点击绿旗,变量“难度等级”和“用时”的值都为0,舞台下方显示输入框,并提示“请输入难度等级(1~3)”,如图所示;

2). 输入完成后,“难度等级〞的值变为输入的数字,瞬间出现4 行4 列排列整齐的方块,其中随机的一些方块中藏有地雷(有地雷的方块数与难度等级相同),剩余方块中各有一个数字,同时变量“用时” 开始每隔 1秒增加1,如图所示;

例如:输入2,难度等级为 2,有2个方块中藏有地雷。

3). 每次用鼠标点击方块,如果该方块中藏的不是地雷,则该方块中显示一个数字(数字表示该方块周围的8个方块中藏的地雷数量),如图所示;

例如:方块中的数字1表示该方块周围的8个方块中藏有1颗地雷。

4). 每次将鼠标指针移到任意一个没有旗帜的方块上,然后按下空格键,可以插旗标记你认为藏有地雷的方块;也可以将鼠标指针移到被标记的方块上,然后按下空格键取消标记,如图所示(被标记的方块点击后无任何效果);

5). 每次用鼠标点击方块,如果被点击的方块中藏有地雷,那么此方块中的地雷爆炸,其它方块中藏的地雷都显示出来,“用时”不再变化,显示“失败”,游戏结束(游戏界面不再发生任何变化,无法再进行游戏的任何操作),如图所示;(参考视频)

6). 当只剩下藏有地雷的方块未被点击时,“用时”不再变化,显示“胜利”,游戏结束(游戏界面不再发生任何变化,无法再进行游戏的任何操作)如图所示。(参考视频)

评判标准:
  • 5 分:满足"具体要求"中的1);

  • 15分:满足"具体要求"中的2)

  • 20分:满足"具体要求"中的3);

  • 20分:满足"具体要求"中的4);

  • 20分:满足"具体要求"中的5)

  • 20分:满足"具体要求"中的6)

效果预览


在编程之前,先来看一下作品的完整效果吧:


思路分析


本题包含两个角色,分别是方块和结果,如图所示:

其中方块角色一共有8个造型,如图:

而结果角色只包含两个造型,如图所示:

本题综合性非常强,考查的知识点包括克隆、变量、列表、按键处理、事件广播机制和自制积木等。
扫雷是微软于1992年发行的一款大众类的益智小游戏,其主要目的是让用户训练使用鼠标。
扫雷游戏的玩法很简单,有初级、中级、高级和自定义等模式,雷区中随机布置一定数量的地雷,玩家需要尽快找出所有不是地雷的方块,但不许踩到地雷。
本题的目标就是创作一个简易版的扫雷游戏,说实话难度不小。还是请出我们的老朋友---分解思维,将作品分成如下几个模块:
  • 随机地雷位置
  • 克隆4x4方块
  • 打开方块
  • 插旗子标记地雷
  • 计时并判断胜负
看起来是不是挺复杂的,尤其是我们怎么知道每个方块周围的地雷数量呢,是不是每次点击方块的时候都要计算一下呀?
实际上,我们有更简单的方案,还记得之前超平老师一直强调的数据思维,也就是数据驱动视图(MV)模型吗?
针对本作品,在4 x 4的方块中,只要地雷数量和位置确定了,每个方块周围的地雷数量也就确定了。
比如,只有1颗地雷的情况,如下:

又比如,有两颗地雷的情况,如下:

再比如,有3颗地雷的情况,如下:

一旦每个方块的地雷数量确定了,不管是点击方块翻开数字还是按下空格键插上小旗子就变得非常简单了。
如此一来,我们就需要解决如下两个关键问题了:
1). 如何记录每个方块的信息;
2). 如何计算每个方块周围的地雷数量;
针对第一个问题,相信你已经有正确的答案了,没错,就是列表。4 x 4的方块矩阵,对应于长度为16的列表,用0、1、2、3来表示记录每个方块周围的地雷数量,同时使用-1来表示地雷。
以上图中的3颗地雷为例,其列表数据如下:

然后就是第二个问题,怎么计算每个方块周围的地雷数量呢?
直接使用枚举算法,对每个方块进行处理,一共有8个方向,分别是上、下、左、右、左上、右上、左下和右下,如图:

搞定了这两个关键问题,其它相对就比较简单了,接下来,我们就进入程序实现环节

程序实现


根据上面的思路分析,我们分7步来编写程序:
  • 设置难度等级

  • 随机设置地雷
  • 计算方块周围地雷数量
  • 克隆4x4方块
  • 打开方块
  • 插旗子标记地雷
  • 计时并判断胜负
1. 设置难度等级
先创建一个变量“难度等级”,选中方块角色,在绿旗指令下编写代码如下:

当输入1、2、3时,会将对应的数字保存到变量“难度等级”中。
2. 随机设置地雷
我们要根据难度等级随机生成对应数量的地雷,根据前面的分析,先创建一个列表“方块矩阵”,运用插队算法将对应数量的-1随机插入列表。
为了方便,我们定义自制积木如下:

代码不多,说明两点:
1). 列表的长度为16,和16个方块一一对应,非地雷方块一共有 “16 - 难度等级”个,将其初始化为0;
2). 地雷方块有“难度等级”个,使用插队算法,将-1插入到随机位置;
3. 计算方块周围地雷数量
随机设置好地雷之后,列表“方块矩阵”中有“难度等级”个 -1,我们要根据这个列表来计算每个方块周围的地雷数量,并将计算的结果更新到列表中。
这里一共有16个方块,要分别进行计算,而每个方块又需要分别判断左上、正上、右上、左下、正下、右下、左方和右方。
为了方便起见,我们创建一个自制积木用于计算指定方块周围的地雷数量,代码如下:

代码不多,但是信息量巨大,强调4点:
1). 这里的参数“id”表示每个方块的编号,其取值范围是1~16;
2). “_行”和“_列”是私有变量,分别表示当前方块所处的行和列,其取值范围是1~4,在计算过程中使用了整除和余数运算的技巧;
3). 变量“地雷数量“是全局变量,其初始值为0,在计算出其值后,就更新到列表中;
4). 一共有8个方向,为了方便讲解,这里使用了4个自制积木,分别用于计算上方、下方、左方和右方;
计算上方的自制积木代码如下:

计算下方的自制积木如下:

计算左方的自制积木如下:

计算右方的自制积木如下:

代码挺多的,但是逻辑并不复杂,就是分别判断每个方向是否存在,是不是地雷,这样就可以统计出当前方块周围的地雷数量了。
需要说明的是,这4个自制积木并不是必须的,超平老师只是为了更好讲解,拆分成4个部分。
这样一来,我们的数据部分就已经准备就绪了,接下来的工作相对就要简单一些了。
4. 克隆4x4方块
这个是我们非常熟悉的内容了,直接使用”克隆4兄弟“模型即可,根据题目要求,需要定义自制积木,代码如下:

都是非常熟悉的代码,说明3点:
1). 定义自制积木时,需要勾选”运行时不刷新屏幕“,确保瞬间完成克隆;
2). 这里的坐标需要自己来确定,尽量让4 x 4方块在舞台上居中即可;
3).  这里的_ID要定义成私有变量,最后的“将_ID设为0”指令的作用是将本体的ID设置为0,从而和克隆区分开,在这个作品中并不是必须的,不过还是建议加上,养成良好的习惯;
准备工作完成,我们在绿旗代码块调用”设置地雷“、”计算雷数“和”克隆矩阵“这3个自制积木,代码如下:

代码并不多,说明两点:
1). 自制积木”计算雷数“要依赖于”设置地雷“,注意二者的先后顺序;
2). 一共有16个方块需要处理,但是地雷方块无需计算,直接跳过;
接下来,将克隆体显示出来即可,如图:

这样,我们就可以看到4 x 4的方块矩阵了,如图:

如果仅从显示效果来看,只需要克隆部分就可以了,没必要这么大费周折。实际上,我们已经将最核心也是最难的数据部分处理好了,接下来就一马平川了。
5. 打开方块
使用鼠标点击方块时,会出现两种情况:
  • 是地雷,换成爆炸造型,同时将其它地雷显示出来;
  • 不是地雷,显示相应的数字造型;
同时,还需要判断游戏是否成功,即所有的非数字方块都已经打开了。在方块角色中,继续编写代码如下:

代码较多,细节也挺多,强调4点:
1). 对于角色的点击,不要直接使用事件模块中的”当角色被点击“指令,避免在游戏结束后还可以点击,使用组合指令”等待条件“ + ”碰到鼠标指针“ + ”按下鼠标“,效果最好,同时要加上”等待按下鼠标不成立“,避免连续点击;
2). 每个方块都有自己的ID编号,通过ID和列表就可以获取每个方块的信息,如果当前方块是地雷,就换成爆炸造型,然后发送一个”失败“的广播消息;
3). 如果是数字方块,要换成对应的数字造型,由于造型编号是从1开始的,需要在获取方块对应的地雷数量后,再+1,刚好和其造型相对应;
4). 这里的变量”正确点击“是用来记录已打开数字方块的数量,需要在绿旗指令下进行初始化设置,当所有数字方块都打开时,发送一个”成功“的广播消息;
关于成功和失败的代码实现,我们放在第7步中讲解。
6. 插旗子标记地雷
在方块角色中继续编写代码如下:

代码难度不大,说明3点:
1). 插旗子的条件是鼠标放到方块上并且按下空格键,这里的关键是按下空格键,因此我们先判断按下空格键,这里再次使用了简单好用的”等待条件“指令;
2). 关于按键处理,一定要加上”按下xx键不成立“,确保不会按下一次响应多次的尴尬情况;
3). 第一次按下是插上棋子进行标记,第二次按下是取消标记,所以又进行了一次按键判断,然后重复这个过程,要确保是两次不同的按键,还需要增加一个”等待0.1秒“指令将它们隔离开;
7. 计时并判断胜负
创建变量”用时“,在绿旗代码块中增加如下代码:

重点是红色部分,前面使用的变量”正确点击“也是在这里进行初始化设置的。
切换到结果角色,编写代码如下:

代码非常简单,注意一点,成功或失败后,发送了一个”停止“的广播消息。
相应的,在方块角色中要将其他地雷方块显示出来,切换到方块角色,编写代码如下:

代码非常简单,注意两个条件缺一不可,被点击的地雷方块显示的是爆炸造型,其它地雷方块才显示地雷造型;
还有很重要的一点别忘了,不管是成功还是结束都需要停止方块角色的脚步,代码如下:

代码超级简单,着重强调一点:
1). 不要直接使用”停止全部脚本“指令暴力结束,对于克隆体而言,执行”停止全部脚本“指令后会删除所有克隆体,切记切记;

至此,整个作品就创作好了,还是非常有难度的,是时候体验一下自己的扫雷游戏了


总结与思考


本题是中级组编程部分第6题,分数为100分,积木块数量200个左右,涉及到的知识点主要包括:

  • 克隆编程;

  • 全局变量和私有变量;

  • 列表处理;

  • 按键处理;

  • 事件广播机制;

  • 自制积木;

作为本次国赛中级组最后一题(初级组没有此题),也是压轴题,题目难度非常大,综合性非常强,完成时间30分钟左右。关键点有两个,一是如何记录每个方块的信息,二是如何计算每个方块周围的地雷数量。

第一点相对还比较容易解决,通常就是列表和私有变量相结合,这也是我们处理各种m x n矩阵作品的标准配置了。

真正有挑战性的是第二点,大部分同学都卡在这个地方了,这个是可以理解的,毕竟是高强度的国赛,时间非常紧张,那我们的应对策略是什么呢?

超平老师提供两条建议供你参考:

1). 平时多练习,多创作,尤其是经典游戏,有的同学平时就已经做过扫雷游戏,这样一来就相当于重做一遍,自然驾轻就熟了;

2). 完成一部分,快速拿到部分分数,对于这个作品,要求1和要求2比较简单,这20分应该是可以轻松拿到的;

超平老师给你留一道思考题,如果要将游戏改成10 x 10 的方块矩阵,该怎么做呢?

你还有什么好的方法吗,非常欢迎您和超平老师交流分享。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要素材和源码的,可以添加本人微信

另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。

超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好备考第15届蓝桥杯赛事,力争取得优异的成绩。

扫码或长按加入微信群

超平的编程课
青少儿编程教育专家,中国人民大学硕士,大学讲师,曾任知名上市机构金牌讲师,16年编程教研经验。大耳猴少儿编程联合创始人,致力于通过编程教育提升孩子的逻辑思维、数学思维和计算思维,迎接AI时代。
 最新文章