123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- function Grid(size) {
- this.size = size;
- this.cells = this.empty();
- }
- Grid.prototype = {
- // 构造一个空的矩阵[[null,..,size.length],[]]
- empty: function() {
- var cells = [];
- for (var x = 0; x < this.size; x++) {
- var row = cells[x] = [];
- for (var y = 0; y < this.size; y++) {
- row.push(null);
- }
- }
- // [[{x:0,y:0},{x:0,y:1}],[]]
- return cells;
- },
- // 在空格子中随机挑选出一个格子
- randomAvailableCell: function() {
- var cells = this.availableCells();
- // 存在可填充的格子
- if (cells.length) {
- return cells[Math.floor(Math.random() * cells.length)];
- }
- },
- // 获取可填充的格子坐标
- availableCells: function() {
- var cells = [];
- for (var i = 0; i < this.size; i++) {
- for (var j = 0; j < this.size; j++) {
- // 当前格子无内容
- if (!this.cells[i][j]) {
- cells.push({
- x: i,
- y: j
- });
- }
- }
- }
- return cells;
- },
- // 是否存在空单元格
- cellsAvailable: function() {
- return !!this.availableCells().length;
- },
- cellAvailable: function(cell) {
- return !this.cellContent(cell);
- },
- insertTile: function(tile) {
- this.cells[tile.x][tile.y] = tile;
- },
- removeTile: function(tile) {
- this.cells[tile.x][tile.y] = null;
- },
- /*
- * 获取单元格内容
- * @param {object} cell {x:0,y:0} 单元格坐标
- */
- cellContent: function(cell) {
- if (this.withinBounds(cell)) {
- return this.cells[cell.x][cell.y] || null;
- } else {
- return null;
- }
- },
- /*
- * 空单元格,格子还未填充数字
- */
- emptyCell: function(cell) {
- return !this.cellContent(cell);
- },
- withinBounds: function(cell) {
- return cell.x >= 0 && cell.x < this.size && cell.y >= 0 && cell.y < this.size;
- },
- eachCell: function(callback) {
- for (var x = 0; x < this.size; x++) {
- for (var y = 0; y < this.size; y++) {
- callback(x, y, this.cells[x][y]);
- }
- }
- }
- }
- module.exports = Grid;
|