basic grid implementation with initial setup
basic grid implementation with initial setup

file:b/.jshintrc (new)
--- /dev/null
+++ b/.jshintrc
@@ -1,1 +1,20 @@
+{
+    "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
+}
 

file:a/index.html -> file:b/index.html
--- a/index.html
+++ b/index.html
@@ -5,6 +5,11 @@
   <title>2048</title>
 
   <link href="style/main.css" rel="stylesheet" type="text/css">
+
+  <script src="js/html_actuator.js"></script>
+  <script src="js/tile.js"></script>
+  <script src="js/game_manager.js"></script>
+  <script src="js/application.js"></script>
 </head>
 <body>
   <div class="container">

file:b/js/application.js (new)
--- /dev/null
+++ b/js/application.js
@@ -1,1 +1,5 @@
+document.addEventListener("DOMContentLoaded", function () {
+  var actuator = new HTMLActuator;
+  var manager  = new GameManager(4, actuator);
+});
 

--- /dev/null
+++ b/js/game_manager.js
@@ -1,1 +1,84 @@
+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();
+};
+

--- /dev/null
+++ b/js/html_actuator.js
@@ -1,1 +1,14 @@
+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);
+  });
+};
+

file:b/js/tile.js (new)
--- /dev/null
+++ b/js/tile.js
@@ -1,1 +1,8 @@
+function Tile(position, value) {
+  this.x                = position.x;
+  this.y                = position.y;
+  this.value            = value || 2;
 
+  this.previousPosition = null;
+}
+

comments