mirror of
https://github.com/danog/2048.git
synced 2024-12-12 09:19:54 +01:00
02a24c0610
Added rebuilding of game state from localstoage on page load Added New Game button to allow game restarts now that refreshes resume the game
113 lines
2.6 KiB
JavaScript
113 lines
2.6 KiB
JavaScript
function Grid(size, previousCellState) {
|
|
this.size = size;
|
|
this.cells = previousCellState ? this.buildFromPreviousState(previousCellState) : this.buildNew();
|
|
}
|
|
|
|
// Build a grid of the specified size
|
|
Grid.prototype.buildNew = function () {
|
|
var cells = [];
|
|
for (var x = 0; x < this.size; x++) {
|
|
var row = cells[x] = [];
|
|
|
|
for (var y = 0; y < this.size; y++) {
|
|
row.push(null);
|
|
}
|
|
}
|
|
return cells;
|
|
};
|
|
|
|
Grid.prototype.buildFromPreviousState = function (state) {
|
|
var cells = [];
|
|
for (var x = 0; x < this.size; x++) {
|
|
var row = cells[x] = [];
|
|
|
|
for (var y = 0; y < this.size; y++) {
|
|
var tileState = state[x][y];
|
|
row.push(tileState ? new Tile(tileState.position, tileState.value) : null);
|
|
}
|
|
}
|
|
return cells;
|
|
};
|
|
|
|
// 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 = [];
|
|
|
|
this.eachCell(function (x, y, tile) {
|
|
if (!tile) {
|
|
cells.push({ x: x, y: y });
|
|
}
|
|
});
|
|
|
|
return cells;
|
|
};
|
|
|
|
// Call callback for every cell
|
|
Grid.prototype.eachCell = function (callback) {
|
|
for (var x = 0; x < this.size; x++) {
|
|
for (var y = 0; y < this.size; y++) {
|
|
callback(x, y, this.cells[x][y]);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Check if there are any cells available
|
|
Grid.prototype.cellsAvailable = function () {
|
|
return !!this.availableCells().length;
|
|
};
|
|
|
|
// Check if the specified cell is taken
|
|
Grid.prototype.cellAvailable = function (cell) {
|
|
return !this.cellOccupied(cell);
|
|
};
|
|
|
|
Grid.prototype.cellOccupied = function (cell) {
|
|
return !!this.cellContent(cell);
|
|
};
|
|
|
|
Grid.prototype.cellContent = function (cell) {
|
|
if (this.withinBounds(cell)) {
|
|
return this.cells[cell.x][cell.y];
|
|
} else {
|
|
return null;
|
|
}
|
|
};
|
|
|
|
// Inserts a tile at its position
|
|
Grid.prototype.insertTile = function (tile) {
|
|
this.cells[tile.x][tile.y] = tile;
|
|
};
|
|
|
|
Grid.prototype.removeTile = function (tile) {
|
|
this.cells[tile.x][tile.y] = null;
|
|
};
|
|
|
|
Grid.prototype.withinBounds = function (position) {
|
|
return position.x >= 0 && position.x < this.size &&
|
|
position.y >= 0 && position.y < this.size;
|
|
};
|
|
|
|
Grid.prototype.gridState = function () {
|
|
var cellState = [];
|
|
for (var x = 0; x < this.size; x++) {
|
|
var row = cellState[x] = [];
|
|
|
|
for (var y = 0; y < this.size; y++) {
|
|
row.push(this.cells[x][y] ? this.cells[x][y].tileState() : null);
|
|
}
|
|
}
|
|
|
|
return {
|
|
size: this.size,
|
|
cells: cellState
|
|
}
|
|
};
|