1
0
mirror of https://github.com/danog/2048.git synced 2024-11-30 04:19:06 +01:00

basic grid implementation with initial setup

This commit is contained in:
Gabriele Cirulli 2014-03-08 12:50:45 +01:00
parent 0970a722ba
commit cf31e146aa
6 changed files with 131 additions and 0 deletions

19
.jshintrc Normal file
View File

@ -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
}

View File

@ -5,6 +5,11 @@
<title>2048</title> <title>2048</title>
<link href="style/main.css" rel="stylesheet" type="text/css"> <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> </head>
<body> <body>
<div class="container"> <div class="container">

4
js/application.js Normal file
View File

@ -0,0 +1,4 @@
document.addEventListener("DOMContentLoaded", function () {
var actuator = new HTMLActuator;
var manager = new GameManager(4, actuator);
});

83
js/game_manager.js Normal file
View File

@ -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();
};

13
js/html_actuator.js Normal file
View File

@ -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);
});
};

7
js/tile.js Normal file
View File

@ -0,0 +1,7 @@
function Tile(position, value) {
this.x = position.x;
this.y = position.y;
this.value = value || 2;
this.previousPosition = null;
}