From cf31e146aad692a8fed02a3aa3c80af183502de8 Mon Sep 17 00:00:00 2001 From: Gabriele Cirulli Date: Sat, 8 Mar 2014 12:50:45 +0100 Subject: [PATCH] basic grid implementation with initial setup --- .jshintrc | 19 +++++++++++ index.html | 5 +++ js/application.js | 4 +++ js/game_manager.js | 83 +++++++++++++++++++++++++++++++++++++++++++++ js/html_actuator.js | 13 +++++++ js/tile.js | 7 ++++ 6 files changed, 131 insertions(+) create mode 100644 .jshintrc create mode 100644 js/application.js create mode 100644 js/game_manager.js create mode 100644 js/html_actuator.js create mode 100644 js/tile.js diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..87dbf9a --- /dev/null +++ b/.jshintrc @@ -0,0 +1,19 @@ +{ + "esnext": true, + "indent": 2, + "maxlen": 80, + "freeze": true, + "camelcase": true, + "unused": true, + "eqnull": true, + "proto": true, + "supernew": true, + "noyield": true, + "evil": true, + "node": true, + "boss": true, + "expr": true, + "loopfunc": true, + "white": true, + "maxdepth": 4 +} diff --git a/index.html b/index.html index c85e844..31d1727 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,11 @@ 2048 + + + + +
diff --git a/js/application.js b/js/application.js new file mode 100644 index 0000000..dde4cc4 --- /dev/null +++ b/js/application.js @@ -0,0 +1,4 @@ +document.addEventListener("DOMContentLoaded", function () { + var actuator = new HTMLActuator; + var manager = new GameManager(4, actuator); +}); diff --git a/js/game_manager.js b/js/game_manager.js new file mode 100644 index 0000000..b1a2de3 --- /dev/null +++ b/js/game_manager.js @@ -0,0 +1,83 @@ +function GameManager(size, actuator) { + this.size = size; // Grid size + this.actuator = actuator; + + this.startTiles = 2; + this.grid = []; + + this.setup(); +} + +// Set up the game +GameManager.prototype.setup = function () { + this.buildGrid(); + this.addStartTiles(); + + // Update the actuator + this.update(); +}; + +// Build a grid of the specified size +GameManager.prototype.buildGrid = function () { + for (var y = 0; y < this.size; y++) { + this.grid[y] = []; + for (var x = 0; x < this.size; x++) { + this.grid[y].push(null); + } + } +}; + +// Set up the initial tiles to start the game with +GameManager.prototype.addStartTiles = function () { + for (var i = 0; i < this.startTiles; i++) { + this.addTile(); + } +}; + +// Adds a tile in a random position +GameManager.prototype.addTile = function () { + this.insertTile(new Tile(this.randomCell())); +}; + +// Find the first available random position +GameManager.prototype.randomCell = function () { + // TODO: build a map of available positions and choose from it + var self = this; + + var position; + + function randomPosition() { + return Math.floor(Math.random() * self.size); + } + + do { + position = { + x: randomPosition(), + y: randomPosition() + }; + } while (this.cellOccupied(position)); + + return position; +}; + +// Check if the specified cell is taken +GameManager.prototype.cellOccupied = function (cell) { + return !!this.grid[cell.x][cell.y]; +}; + +// Insert a tile at the specified position +GameManager.prototype.insertTile = function (tile) { + this.grid[tile.x][tile.y] = tile; +}; + +// Sends the updated grid to the actuator +GameManager.prototype.update = function () { + this.actuator.update(this.grid); +}; + +// Move the grid in the specified direction +GameManager.prototype.move = function (direction) { + // 0: up, 1: right, 2:down, 3: left + + this.update(); +}; diff --git a/js/html_actuator.js b/js/html_actuator.js new file mode 100644 index 0000000..c359401 --- /dev/null +++ b/js/html_actuator.js @@ -0,0 +1,13 @@ +function HTMLActuator() { + +} + +HTMLActuator.prototype.update = function (grid) { + // Temporary debug visualizer + grid.forEach(function (row) { + var mapped = row.map(function (tile) { + return tile ? tile.value : " "; + }).join(" | "); + console.log(mapped); + }); +}; diff --git a/js/tile.js b/js/tile.js new file mode 100644 index 0000000..25664e5 --- /dev/null +++ b/js/tile.js @@ -0,0 +1,7 @@ +function Tile(position, value) { + this.x = position.x; + this.y = position.y; + this.value = value || 2; + + this.previousPosition = null; +}