Cocos扫雷游戏核心算法思想
关键词:Cocos游戏开发,扫雷游戏,算法,JS面向对象
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~
- 扫雷游戏实现核心思路解析
数据和视图尽量分离。采用面向对象的实现设计数据模块。格子作为一类对象,雷场作为一类对象,雷场由格子构成。
- 扫雷游戏核心数据模块
- Cell.js单元格类
// 单个单元格,用于保存数据
// x,y,坐标,或者行和列,
// info显示文本,空表示什么都没有,周边也没有地雷
// *表示此处是一颗地雷,数字表示其周边有几颗地雷
function Cell(x, y, info){
this.x = x;
this.y = y;
http://this.info = info;
};
module.exports = Cell;
- MineField.js雷场类
// 雷场(行数,列数,地雷数)
function MineField(rowNum, colNum, mineNum){
this.rowNum = rowNum;
this.colNum = colNum;
this.mineNum = mineNum;
// 调用【1】画格子
this.init();
// 调用【2】藏地雷
this.hideMine();
// 调用【3】留暗号
this.markNumber();
};
module.exports = MineField;
【1】画格子
雷场由Cell的对象构成的数组组成,实质就是给雷场的cells数组赋值。
// 【1】利用原型扩展方法:初始化雷场的所有格子数据
MineField.prototype.init = function(){
let cellsNum = this.rowNum * this.colNum;
this.cells = new Array(cellsNum);
for(let i=0; i<this.rowNum; i++){
for(let j=0; j<this.colNum; j++){
let index = this.getIndexByXY(i,j);//this.colNum * i + j;
this.cells[index] = new Cell(i, j, "");
}
}
};
补充提炼通过坐标获取格子索引的方法,以供后续其它地方用:
// 【1-1】通过坐标获取单元格的所处格子的索引
MineField.prototype.getIndexByXY = function(x, y){
return x * this.colNum + y;
}
// 通过单元格对象获取单元格所处格子的索引
MineField.prototype.getIndexByCell = function(cell){
return this.getIndexByXY(cell.x, cell.y);
}
在此文件头部引入Cell类:
var Cell = require("Cell");
【2】藏地雷
实质就是修改雷场的cells数组中的随机一些索引的cell的info属性值。
// 【2】藏地雷:将地雷数据设置到this.cells中的Cell的info中去
MineField.prototype.hideMine = function(){
// 随机无重复元素的数组,且范围限定在[0,this.rowNum*this.colNum);
let end = this.colNum * this.rowNum;
// 记录所有地雷所在的cells的索引
this.mineIndexs = ArrayUtils.randChoiseFromTo(0, end, this.mineNum);
consol