一、 扫雷游戏实现核心思路解析
数据和视图尽量分离。采用面向对象的实现设计数据模块。格子作为一类对象,雷场作为一类对象,雷场由格子构成。
二、 扫雷游戏核心数据模块
1. Cell.js单元格类
2. MineField.js雷场类
【1】画格子
雷场由Cell的对象构成的数组组成,实质就是给雷场的cells数组赋值。
【2】藏地雷
实质就是修改雷场的cells数组中的随机一些索引的cell的info属性值。
【3】留暗号
实质就是在地雷周边8个格子中标上数字,数值为此单元格周边8个单元格中雷的数量。如下图所示:
【3-1】获取某颗地雷周围所有单元格
如下图所示,假如要获取(0,0)周围8个单元格,则偏移量就
是其周边8个单元格的坐标:
同时,偏移后,我们还要判断这个格子是否超出雷场。即便宜后x、y值不能小于0,且不能大于行或列的最大值。
偏移量offset和判断是否超出雷场区域的方法如下:
【3-2】更新所有地雷周围所有非雷(数字)单元格的数字标记
三、 ArrayUtils.js数组工具类(直接使用)
四、 数据校验测试
1. Game_mgr.js挂载到Canvas节点上
挂载到Canvas节点上,运行测试结果如下:
2. 优化测试-验证数据正确与否
发现显示结果不便于核实数据是否正确,我们优化下,在MineField中添加printResult方法:
五、 数据与视图绑定
新建一个空节点MineField作为雷场,将res中的block拖到MineField内,作为地砖,在block节点内新建空节点around_bombs,在此节点上添加Label组件,用于显示此地砖的信息info。之后将block做成预制体,便于动态生成雷场所有地砖。
动态生成的过程中,将每个地砖跟MineField的cells数组中的元素绑定。
在Game_mgr.js的properties中添加属性,同时通过编辑器绑定属性值:
编译运行,结果如下:
将信息显示到地砖上:
block.cell = this.mineField.cells[index];
// 显示地砖内部信息
this.showBlockInnerInfo(block);
信息显示到地砖上的实现方法(便于后续触摸调用):
// 显示地砖内部信息
showBlockInnerInfo(block){
block.getChildByName("around_bombs").getComponent(cc.Label).string = block.cell.info;
},
编译运行结果如下:
仔细思考,发现刚才Game_mgr.js其实就是控制MineField这个节点的,故我们将其修改为MineField_Ctrl.js。将Canvas上的用户自定义组件remove,在MineField节点上添加MineField_Ctrl组件,将其中block_root属性去掉,将代码中this.block_root替换为this.node。
点击链接加入群聊【Unity/Cocos交流群】