首页>少儿编程>用scratch做一个扫雷游戏(上)-方向数组与后台数据

用scratch做一个扫雷游戏(上)-方向数组与后台数据

很早就曾尝试利用scratch写一个扫雷游戏,但点击后展开非雷区的效果实现的不是很理想,于是就无限期的搁置了下来,前几天学习到c++的宽度搜索,一边将所有可能的数据逐一放入队列,一边推进队头重新搜索新产生的可能数据,发现同曾经的盲目尝试有点儿异曲同工。于是重新拾起了信心,来完成这个搁置许久的项目。

scratch_mineswiper_game_1_p1

完整的扫雷游戏应该具备多个难度,对应不同大小的雷区,因为博主仅追求验证可行性,所以就将行列写成固定的数字了,这里规定行数为12行,列数为18列,总计216个格子。同样,点击后生成雷区是更为人性化的方法,为了程序看起来逻辑更清晰(偷懒就偷懒呗),这里也暂时不实现这个效果了。

scratch_mineswiper_game_1_p2

设置一个列表map,设置一个变量minecount,首先为列表填充216次,填充数值为0,0代表周边8个格子内没有地雷,后续我们可以根据表中216个数据不同的值,我们让216个克隆体演员展现不同的造型。变量minecount是一个统计地雷个数的计数器,这一块自定义积木允许输入一个参数,这个参数代表最大的地雷个数,我们将minecount初始设置为1,每次成功随机投放一颗地雷后自增1,当minecount自增到大于给定雷数时,布雷环节结束。前面的0值代表周边无雷,这里用数字10代表该格内有地雷一颗。

scratch_mineswiper_game_1_p3

列表类似一个一维的数组,但在游戏中我们实际展示它们是是二维的,所以我们需要用计算的方式获取到它们之间的位置关系。对于一个上述3列的表格,当前单元格的上方单元格,应该是当前单元格的编号减去列数,比如当前单元格是列表中的第5个格子,要找到它头顶的格子,只需要用5减去列数3,即第2号的格子会在5的上方,后续的数据处理我们需要统计一个地雷周边的8个单元格,这8个单元格的相对位置如上图右侧所示。

scratch_mineswiper_game_1_p4

我们可以遍历一下map列表,当找到项目值为10的格子10,我们利用上述相对位置,将其周边8个格子的值都提升1,当两个雷的位置接近时,如上图右侧,第一颗雷提升了自己的周边值,接着第二颗雷又提升了一下,于是夹在他们中间的这些格子总计被提升了两次,所以最终值会变为2。(之所以用10代表地雷,是因为极端情况下,一个空格周边都是地雷的时候,这个空格最终的值会是8。所以0~8这几个值都可能会被占用。)

scratch_mineswiper_game_1_p5

提升周边单元格值的时候会遇到很多限制,比如旁边并不是空格,而是一颗地雷,所以我们一边检测一边做提升值的操作,如果周边的某一格是地雷,那么不处理,如果单元格的坐标值(根据上方提供的位置公式)小于1或值大于216,那么超出了列表范围,从图形上看是上下超限了,那么也不处理,还有一种更为复杂的情况,左右超限。因为实际显示界面为18x12的方阵,从左至右依次排列,判断靠左的单元格,我们可以判断其位置求余18后等于1,而靠右的单元格,求余18后等于0的那一波就是了。靠左的单元格不能再求更左边的值,靠右的单元格不再求更右边的值,举个例子,19求余18等于1,靠左,如果再去提升其左边的值,会把18提升为1,但18号格子实际上是第一排的最后一个,位于最右侧。

scratch_mineswiper_game_1_p6

我们先实现一个方向数组的自定义积木,要求一个参数,该参数填写需要的列数,博主将填写的数字是18,因为这个实例是一个18x12的方阵。填充完方向数组,我们来实现数据处理的自定义积木,这里需要增加两个变量direction和filter,direction用来遍历方向数组,filter用来过滤一些不允许提升值的情况程序逻辑如下,


获取到当前地雷的位置,这个可以在生成地雷的同时获取到
通过direction遍历方向数组
  设置filter的值为0
  根据方向数组当前值定位周边单元格
  该单元格值为10时改变filter为1,最后通过filter判断是否需要提升值,过滤地雷
  判断该单元格坐标是否在1到216之间,否则filter为1,过滤上下边界
  判断当前地雷是否靠左,如果靠左且方向值为-19,filter为1
  判断当前地雷是否靠左,如果靠左且方向值为-1,filter为1
  判断当前地雷是否靠左,如果靠左且方向值为+17,filter为1
  判断当前地雷是否靠右,如果靠右且方向值为+19,filter为1
  判断当前地雷是否靠右,如果靠右且方向值为+1,filter为1
  判断当前地雷是否靠右,如果靠右且方向值为-17,filter为1
  经过九九八十一难,filter仍旧为0的情况,提升该周边单元格的值
  direction变量自增1

数据处理用的积木命名为了过滤器,完整程序如下,因条件较多,看不清图片的可以放大一些。

scratch_mineswiper_game_1_p7

回到最初生成数据的自定义积木,在每完成一次布雷操作后用过滤器处理一下数据。

scratch_mineswiper_game_1_p8

现在还没办法显示在屏幕上,我们可以点击一下map列表,可以看到数据已经被正确生成了。

scratch_mineswiper_game_1_p9

实例下载

实际中包含了页面布局展现的内容,具体教程请参见下一篇博文:
《用scratch做一个扫雷游戏(中)-造型编号与数据展现》

Scratch扫雷游戏布局

标签: Scratch

移动端可扫我直达哦~

推荐阅读

scratch 2024-06-10

推箱子游戏的人物行进动作与下一关卡的过渡

做这个案例花了很长的时间,主要的时间是用在了寻找一个合适的游戏角色上,虽然网上有很多的4方向的人物动作图,但部分是工种不匹配,总不能找个英俊潇洒的美男子,或是弱不经风的大小姐来干推箱子这种体力活吧,更不用说携带管制刀具的剑士,或是呼风...

少儿编程 Scratch

scratch 2024-06-10

推箱子游戏的地图布局与箱子的运动逻辑

为了利用自定义积木的屏幕免刷新,所以地图布局按惯例扔给了一块自定义积木,整个游戏的逻辑依赖于“关卡缓存”这张列表,首当其冲的就是布局,对于这个游戏,博主将屏幕统一划分成了10横12纵的栅格,不显示的部分都用“0值”填充,虽然实际的游戏...

少儿编程 Scratch

scratch 2024-06-10

Scratch推箱子游戏地图制作-与Excel间的数据交换

在Scratch基础教程这个系列中提到过Excel这个软件,这其实是一个伪装成电子表格的万能工具,我们可以用它来处理数据,也可以用它来转换html格式的表格以便把表格内容发布到网站。当然也有用Excel来画像素图,甚至制作游戏的,对于...

少儿编程 Scratch

scratch 2024-05-31

滚动长方体游戏的边界检测与游戏结果判断

在进行滚动长方体操作时,我们设置了一个名为“方块状态”的变量,根据长方体的初始状态与旋转后的最终状态,我们分析后将其分为3个状态,即下图中的这几个状态:分别是竖直状态;长的一边靠近X轴的状态;以及长的一边靠近Y轴的状态。因为视角变化的...

少儿编程 Scratch

scratch 2024-05-30

Scratch滚动长方体游戏的地图布局与移动

在之前的教程中,我们曾经实现过一个跑酷游戏,通过固定人物,不断平移背景来实现移动效果。在滚动长方体这个小游戏中,博主把长方体的活动范围也限定在了原点附近,所以同样需要移动地图来衬托长方体的移动。一个长方体,绕某根坐标轴旋转的时候,不出...

少儿编程 Scratch

scratch 2024-05-30

Scratch中等距视角下长方体的滚动动作

刚学会上网那会,玩过一个网页版的滚动长方体的游戏,控制一个长方体在一个等距视角下翻滚。当把长方体垂直放入目标方格时,游戏判定胜利,进入下一关。前几天学习了一下2.5d视角的坐标换算与图形变换,准备来实现一个低配版本的滚动长方体游戏。实...

少儿编程 Scratch

scratch 2024-05-28

Scratch利用私有变量拼装可回溯的地图

在Scratch中可以利用两张设置更多的图片来循环播放,形成一个移动的背景,某天突然想到,如果用克隆体像铺砖块一样实现一个背景,又该如何组织呢,于是就动手尝试了一下。发现在生成克隆体的时候可以给克隆体一个私有变量以确定克隆体的x坐标,...

少儿编程 Scratch

scratch 2024-05-24

一个正方形在2.5D视角下是如何转动的?

沿着纵轴旋转45度的无透视游戏叫等距视角的游戏,通俗来说也叫2.5D游戏。很多小游戏都采用了这样的视觉,这个视角在2维的基础上塑造出了立体的视觉效果,相比正视图更有视觉表现力。这个视角看得挺多,但真正要想像一个方块如何在这个视角下转动...

少儿编程 Scratch

scratch 2024-05-22

Scratch版本开心消消乐游戏中方块的消除与补充逻辑

方块的补充是博主考虑时间最久的一个环节,纠结于是否需要扩大数据列表,把删除掉的积木在列表尾部补齐,又担心如果一列消除掉太多,Scratch角色超出边界后坐标移位。反复尝试过程中发现即便相同编号的克隆体堆叠在一起,但只要加一个限制条件,...

少儿编程 Scratch

scratch 2024-05-22

Scratch版本开心消消乐游戏中的消除统计

我们在alpha版本中基本完成了鼠标操作,并且把游戏进程推到了进程2,接下来尝试完成游戏的消除统计部分,对于消除的逻辑,博主一开始是使用了一个计数器,用于统计相同方块的数量,先把方块推入列表,下一块方块或下二块方块出现不同方块时,重置...

少儿编程 Scratch

scratch 2024-05-21

用Scratch做一个开心消消乐游戏-游戏逻辑与鼠标动作

准备实现一个类似开心消消乐的游戏,对于游戏的细节思考并测试了好多天,这也是博主几天没有更新博客的原因。制作过程中,有一个模糊的总结,单纯的思考并无助于推动项目的进展,实际动手制作尝试,倒是经常有意外的惊吓与惊喜。引用一句不是特别符合的...

少儿编程 Scratch