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