柿霖不是林 发表于 2017-2-13 20:09:56

小程序demo:2048游戏;基于web版2048游戏开发

似乎比以前的2048类游戏都复杂一些,我是没看懂;




11.png (11.32 KB, 下载次数: 16)下载附件2016-12-17 15:00 上传







var Grid = require('./grid.js');
var Tile = require('./tile.js');

function GameManager(size) {
    this.size = size;
    this.startTiles = 2;
}

GameManager.prototype = {
    setup: function() {

      this.grid = new Grid(this.size);
      this.score = 0;
      this.over = false;
      this.won = false;
      this.addStartTiles();
      return this.grid.cells;
    },

    // 初始化数据
    addStartTiles: function() {
      for (var x = 0; x < this.startTiles; x++) {
            this.addRandomTiles();
      }
    },

    // 在一个随机单元格中随机填充2或4
    addRandomTiles: function() {

      if (this.grid.cellsAvailable()) {
            var value = Math.random() < 0.9 ? 2 : 4;
            var cell = this.grid.randomAvailableCell();
            var tile = new Tile(cell, value);
            this.grid.insertTile(tile); // 插入一个单元格
      }

    },

    actuate: function() {

      return {
            grids: this.grid.cells,
            over: this.over,
            won: this.won,
            score: this.score
      }
    },

    // 偏移向量
    getVector: function(direction) {
         
      var map = {
            0: { // 上
                x: -1,
                y: 0
            },
            1: { // 右
                x: 0,
                y: 1
            },
            2: { // 下
                x: 1,
                y: 0
            },
            3: { // 左
                x: 0,
                y: -1
            }
      };
      return map;
    },

    buildTraversals: function(vector) {
      var traversals = {
            x: [],
            y: []
      };

      for (var pos = 0; pos < this.size; pos++) {
            traversals.x.push(pos);
            traversals.y.push(pos);
      }

      // 为什么要加这个,看findFarthestTail
      if (vector.x === 1) {
            // 向右时
            traversals.x = traversals.x.reverse();
      }

      if (vector.y === 1) {
            // 向下
            traversals.y = traversals.y.reverse();
      }

      return traversals;
    },

    // 把当前单元格挪至下一个可放置的区域
    moveTile: function(tile, cell) {
      this.grid.cells = null;
      this.grid.cells = tile;
      tile.updatePosition(cell);
    },

    // 特定方向移动单元格
    move: function(direction) {
      // 0: up, 1: right, 2: down, 3: left
      var self = this;
      var vector = this.getVector(direction);
      var traversals = this.buildTraversals(vector);

      var cell;
      var tile;
      var moved = false;
      self.prepareTiles();

      traversals.x.forEach(function(x) {
            traversals.y.forEach(function(y) {
                // console.log('x:', x, 'y:', y);
                cell = {
                  x: x,
                  y: y
                };
                tile = self.grid.cellContent(cell);

                if (tile) { // 单元格有内容
                  var positions = self.findFarthestTail(cell, vector);
                  var next = self.grid.cellContent(positions.next);

                  if (next && next.value === tile.value && !next.mergedFrom) {
                        // 当前格子和其移动方向格子内容相同,需要合并
                        var merged = new Tile(positions.next, tile.value * 2); // 合并后的格子信息

                        merged.mergedFrom = ;

                        self.grid.insertTile(merged); // 把合并的盒子插入到当前格子数据中
                        self.grid.removeTile(tile); // 删除当前格子内容

                        tile.updatePosition(positions.next);

                        self.score += merged.value;
                        if (merged.value === 2048) self.won = true;
                  } else {
                        self.moveTile(tile, positions.farthest);
                  }

                  // 是否从当前位置移到当前位置
                  if (!self.positionsEqual(cell, tile)) {
                        moved = true;
                  }
                }
            });
      });

      if (moved) {
            this.addRandomTiles();

            if (!this.movesAvailable()) {
                this.over = true;
            }

            return this.actuate();
      }

      // return this.grid.cells

    },

    prepareTiles: function() {

      var tile;
      for (var x = 0; x < this.size; x++) {
            for (var y = 0; y < this.size; y++) {
                tile = this.grid.cells;
                if (tile) {
                  tile.mergedFrom = null;
                  tile.savePosition();
                }
            }
      }
    },

    positionsEqual: function(first, second) {
      return first.x === second.x && first.y === second.y;
    },

    movesAvailable: function() {
      return this.grid.cellsAvailable() || this.tileMatchesAvailable();
    },

    tileMatchesAvailable: function() {
      var self = this;

      var tile;

      for (var x = 0; x < this.size; x++) {
            for (var y = 0; y < this.size; y++) {
                tile = this.grid.cellContent({ x: x, y: y });

                if (tile) {
                  for (var direction = 0; direction < 4; direction++) {
                        var vector = self.getVector(direction);
                        var cell = { x: x + vector.x, y: y + vector.y };

                        var other = self.grid.cellContent(cell);

                        if (other && other.value === tile.value) {
                            return true;
                        }
                  }
                }
            }
      }

      return false;
    },

    // 找到当前偏移方向存在最远的空单元格
    // 如:向右偏移,那么返回当前行最靠右的空单元格及其右侧距离其最远的一个格子,向下一样
    findFarthestTail: function(cell, vector) {
      var previous;

      // 当前单元格在范围内且存在可用单元格
      do {
            previous = cell;
            cell = {
                x: previous.x + vector.x,
                y: previous.y + vector.y
            };
      }
      while (this.grid.withinBounds(cell) && this.grid.emptyCell(cell));

      return {
            farthest: previous,
            next: cell
      }
    },

    // 重新开始
    restart: function() {
      return this.setup();
    }
}

module.exports = GameManager;




**** Hidden Message *****

wu934364328 发表于 2017-11-6 13:19:58

不错,打个call

arman1769012643 发表于 2018-4-9 18:37:19

看一看 感谢

有所思 发表于 2018-5-19 14:01:50

6666666666666666666666666666

qgqceo 发表于 2018-6-2 22:48:37


看一看 感谢

李煜坚 发表于 2018-6-9 13:03:23

:'(:'(:'(:'(:'(:'(:'(:'(

wo_0079 发表于 2018-6-20 14:04:27

666666666666666666666666666666

jack369 发表于 2020-4-7 11:28:45

我有流量,寻求个人游戏开发者合作,有意者联系微信号jim20180688
页: [1]
查看完整版本: 小程序demo:2048游戏;基于web版2048游戏开发