diff --git a/index.html b/index.html
index 31d1727d8fc9eb45a7de3599149f05f478bd8470..3975e8178df7c3ec2f99bec8a1f4e5393c070f6a 100644
--- a/index.html
+++ b/index.html
@@ -7,6 +7,7 @@
+
diff --git a/js/game_manager.js b/js/game_manager.js
index b1a2de3b4175cf47554de7c383162c2bc52dcfe8..26c73d6920573a13b04df319912fe172d6da844a 100644
--- a/js/game_manager.js
+++ b/js/game_manager.js
@@ -3,81 +3,40 @@ function GameManager(size, actuator) {
this.actuator = actuator;
this.startTiles = 2;
- this.grid = [];
+ this.grid = new Grid(this.size);
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);
- }
- }
+ this.actuate();
};
// Set up the initial tiles to start the game with
GameManager.prototype.addStartTiles = function () {
for (var i = 0; i < this.startTiles; i++) {
- this.addTile();
+ this.addRandomTile();
}
};
// 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;
+GameManager.prototype.addRandomTile = function () {
+ var tile = new Tile(this.grid.randomAvailableCell());
+ this.grid.insertTile(tile);
};
// Sends the updated grid to the actuator
-GameManager.prototype.update = function () {
- this.actuator.update(this.grid);
+GameManager.prototype.actuate = function () {
+ this.actuator.actuate(this.grid);
};
// Move the grid in the specified direction
GameManager.prototype.move = function (direction) {
// 0: up, 1: right, 2:down, 3: left
- this.update();
+ this.actuate();
};
diff --git a/js/grid.js b/js/grid.js
new file mode 100644
index 0000000000000000000000000000000000000000..4dfad06ef9944a8fa3e173df41b1fe4e5f5032df
--- /dev/null
+++ b/js/grid.js
@@ -0,0 +1,57 @@
+function Grid(size) {
+ this.size = size;
+
+ this.cells = [];
+
+ this.build();
+}
+
+// Build a grid of the specified size
+Grid.prototype.build = function () {
+ for (var x = 0; x < this.size; x++) {
+ var row = this.cells[x] = [];
+
+ for (var y = 0; y < this.size; y++) {
+ row.push(null);
+ }
+ }
+};
+
+// Find the first available random position
+Grid.prototype.randomAvailableCell = function () {
+ var cells = this.availableCells();
+
+ if (cells.length) {
+ return cells[Math.floor(Math.random() * cells.length)];
+ }
+};
+
+Grid.prototype.availableCells = function () {
+ var cells = [];
+
+ for (var x = 0; x < this.size; x++) {
+ for (var y = 0; y < this.size; y++) {
+ var cell = { x: x, y: y };
+
+ if (this.cellAvailable(cell)) {
+ cells.push(cell);
+ }
+ }
+ }
+
+ return cells;
+};
+
+// Check if the specified cell is taken
+Grid.prototype.cellAvailable = function (cell) {
+ return !this.cellOccupied(cell);
+};
+
+Grid.prototype.cellOccupied = function (cell) {
+ return !!this.cells[cell.x][cell.y];
+};
+
+// Inserts a tile at its position
+Grid.prototype.insertTile = function (tile) {
+ this.cells[tile.x][tile.y] = tile;
+};
diff --git a/js/html_actuator.js b/js/html_actuator.js
index c3594019daa888ba9646481976977040a9f7d7e5..25022e8ed377852feecc8f3d5e852323412101e8 100644
--- a/js/html_actuator.js
+++ b/js/html_actuator.js
@@ -2,9 +2,9 @@ function HTMLActuator() {
}
-HTMLActuator.prototype.update = function (grid) {
+HTMLActuator.prototype.actuate = function (grid) {
// Temporary debug visualizer
- grid.forEach(function (row) {
+ grid.cells.forEach(function (row) {
var mapped = row.map(function (tile) {
return tile ? tile.value : " ";
}).join(" | ");