FunPack 第十期 Kitronik ARCADE
实现功能
本次Funpack活动提供了两个任务选择,由于感觉游戏板移植游戏比较好玩,最终选择了任务一,移植PC端经典游戏扫雷。
代码实现
扫雷游戏规则:
扫雷的玩法:
在一个自定义大小的方块矩阵中随机布置一定量的地雷,再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。
操作方法:
左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以及辅助判断,在一个数字周围的地雷标记完时,左键单击数字相当于对数字周围未打开的方块均进行一次左键单击操作:
左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。
右键单击:在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗),标记之后再一次按下右键显示,若再一次按右键则取消标记。
自动展开:左键单击数字,当点击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时左键数字无效。
游戏板上没有鼠标,所以使用上下左右按键实现选择框的移动,A代替鼠标左键,B代替鼠标右键。
规则如上,接下来根据规则实现游戏,需实现的有
- 地图自动生成
- 地图显示
- 选择框的移动
- AB按键的逻辑实现已经游戏成功失败判断
- 地图自动生成
我们在运行扫雷游戏时,会发现每一次雷出现的位置都不相同,所以我们需要随机生成这些雷,然后还会发现雷周围的数字会加1,我们也是根据这些数字来完成“扫雷”这一目标。
- 一维数组映射二维平面
使用一个60大小的一维数组ImageList对应屏幕上的6*10的图块地图
- 地雷的生成
设定一个变量MineNums记录地雷的数量,然后在ImageList中随机选择MineNums个位将索引值置为-1(-1表示地雷)
然后根据地雷的位置,计算数组其余位置的值(二维地图中,当前位置周围8个图块中地雷的个数)
- 加密数组
此时若直接显示,则所有雷都一清二楚,所以需要将ImageList做一个加密处理,此处进行简单的偏移隐藏信息,那么要实现这一功能,我们就需要将第一层进行加密,我们为每一个格子加20,就完成了加密,在后面A键按下时,只需要将所选位置的索引值减去20即可完成解密,按B键时加20进行深度加密,当达到一定加密层数时变回到第一层加密状态。
- 地图的显示
地图的显示主要是根据ImageList数组中不同的索引位置和索引值在二维平面上显示图块。
- 1~8用对应数字表示
- -1用地雷表示
- 0用空格表示
- 19~38用未翻开的快表示
- 39~58为B键标记状态,用小红旗表示
- 59~79为第二次按B键,用?表示
- 其余地雷的各种状态由-2,-3表示
- 选择框的移动
由于Kitronik ARCADE游戏手柄并不支持触屏操作,所以我们需要创建一个选择框,通过上下左右按键移动选择框选择想要操作的方块.
- 选择框的创建
由于需要移动选择框,所以此处将选择框设置为一个Player的精灵角色,通过控制精灵的位置达到移动的效果
- 选择框的上下左右移动
选择框的移动操作只需要改变选择框精灵的X,Y值即可实现移动,此处注意左上角表情处只能上下移动
- AB按键的逻辑实现已经游戏成功失败判断
A键的实现
- 检查方块的值,若为20则表示为空白块,执行自动翻开周围方块任务
- 若不为20则直接将值-20实现解密操作,判断解密结果,若为-1则扫雷失败,放开全部埋有地雷的块,并将失败标志置位,等待点击左上角表情重新开始
- 若点击的块是已经翻开的数字,则判断周围地雷是否标记完全,若标记完全则自动翻开周围块,此处需要使用递归的方法实现。
- 若点开为地雷则游戏失败
- 若游戏失败,点击左上角表情重新开始游戏
B键的实现
- B键只是简单的再加密操作,若当前图块不在-1~18的范围内,则执行+20操作或者还原。
- B键标记时若地雷都标记出来则游戏胜利,进入下一关
以上基本为游戏实现的主要部分,其余只是一些提示已经即使操作,详细代码请查看游戏源码
实现演示以及说明
开机操作提示
进入关卡界面
自动翻开空白以及标记功能
成功提示
失败提示
心得体会
本次活动从下单开始就一直不顺利,第一块板子屏幕白屏退货之后想着有始有终又购买了一块,但第二块同样出现问题,然后就是等待退货流程耽误了大半个月,在活动老师知道我这个情况之后还是鼓励我完成任务,直接给我寄了一块过来,在最后所剩不多的时间里匆匆忙忙完成任务对我来说是一种挑战也是一种抗压的锻炼。可能游戏并不完美,但认真做出来能流畅运行的时候还是很有成就感。