var AI = function () { this.makeMove = function (board) { var validMoves = []; for (var x = 0; x < 8; x++) { for (var y = 0; y < 8; y++) { if (board[x][y].state === 'empty' && board[x][y].isValidMove(x, y, 'white', board)) { validMoves.push({ x: x, y: y }); } } } if (validMoves.length > 0) { var move = validMoves[Math.floor(Math.random() * validMoves.length)]; var tilesToFlip = board[move.x][move.y].isValidMove(move.x, move.y, 'white', board); if (tilesToFlip) { board[move.x][move.y].flip('white'); for (var k = 0; k < tilesToFlip.length; k++) { tilesToFlip[k].flip('white'); } playerTurn = 'black'; } } }; }; var TileCounter = Container.expand(function () { var self = Container.call(this); var blackTileCountText = new Text2('Black: 2', { size: 50, fill: "#ffffff" }); var whiteTileCountText = new Text2('White: 2', { size: 50, fill: "#ffffff" }); self.updateCounts = function (blackCount, whiteCount) { blackTileCountText.setText('Black: ' + blackCount); whiteTileCountText.setText('White: ' + whiteCount); }; blackTileCountText.y = 20; whiteTileCountText.y = 20; whiteTileCountText.x = 2048 - whiteTileCountText.width - 20; self.addChild(blackTileCountText); self.addChild(whiteTileCountText); }); var Tile = Container.expand(function () { var self = Container.call(this); var tileGraphics = self.createAsset('tile', 'Game Tile', .5, .5); self.state = 'empty'; self.isValidMove = function (x, y, player, board) { var opponent = player === 'black' ? 'white' : 'black'; var allTilesToFlip = []; var directions = [{ x: -1, y: 0 }, { x: 1, y: 0 }, { x: 0, y: -1 }, { x: 0, y: 1 }, { x: -1, y: -1 }, { x: -1, y: 1 }, { x: 1, y: -1 }, { x: 1, y: 1 }]; for (var i = 0; i < directions.length; i++) { var dir = directions[i]; var j = 1; var tilesToFlip = []; while (true) { var checkX = x + dir.x * j; var checkY = y + dir.y * j; if (checkX < 0 || checkX >= 8 || checkY < 0 || checkY >= 8) break; var checkTile = board[checkX][checkY]; if (checkTile.state === 'empty') break; if (checkTile.state === opponent) { tilesToFlip.push(checkTile); } else if (checkTile.state === player) { if (tilesToFlip.length > 0) { allTilesToFlip = allTilesToFlip.concat(tilesToFlip); } break; } j++; } } return allTilesToFlip.length > 0 ? allTilesToFlip : false; }; self.flip = function (newState) { self.state = newState; if (self.state === 'black') { self.createAsset('blackTile', 'Black Tile', .5, .5); } else if (self.state === 'white') { self.createAsset('whiteTile', 'White Tile', .5, .5); } }; }); var Game = Container.expand(function () { var self = Container.call(this); var board = []; var ai = new AI(); var playerTurn = 'black'; var gameOver = false; self.checkGameOver = function () { var blackMoves = self.getValidMoves('black'); var whiteMoves = self.getValidMoves('white'); if (blackMoves.length === 0 && whiteMoves.length === 0) { gameOver = true; var blackCount = 0, whiteCount = 0; for (var i = 0; i < 8; i++) { for (var j = 0; j < 8; j++) { if (board[i][j].state === 'black') blackCount++; if (board[i][j].state === 'white') whiteCount++; } } var winner = blackCount > whiteCount ? 'Black wins!' : whiteCount > blackCount ? 'White wins!' : 'Draw!'; var finalScore = 'Final score - Black: ' + blackCount + ' | White: ' + whiteCount; var scoreMessage = finalScore + '\n' + winner; LK.showGameOver(scoreMessage); } }; self.getValidMoves = function (playerColor) { var validMoves = []; for (var x = 0; x < 8; x++) { for (var y = 0; y < 8; y++) { if (board[x][y].state === 'empty' && board[x][y].isValidMove(x, y, playerColor, board)) { validMoves.push({ x: x, y: y }); } } } return validMoves; }; var tile = new Tile(); var boardWidth = 8 * tile.width; var boardHeight = 8 * tile.height; var boardStartX = (2048 - boardWidth) / 2; var boardStartY = (2732 - boardHeight) / 2; for (var i = 0; i < 8; i++) { board[i] = []; for (var j = 0; j < 8; j++) { var tile = self.addChild(new Tile()); tile.x = boardStartX + i * tile.width; tile.y = boardStartY + j * tile.height; board[i][j] = tile; tile.on('down', (function (tile, i, j) { return function (obj) { if (playerTurn === 'black' && tile.state === 'empty') { var tilesToFlip = tile.isValidMove(i, j, playerTurn, board); if (tilesToFlip) { tile.flip('black'); for (var k = 0; k < tilesToFlip.length; k++) { tilesToFlip[k].flip('black'); } if (self.getValidMoves('white').length > 0) { playerTurn = 'white'; } else if (self.getValidMoves('black').length > 0) { playerTurn = 'black'; } else { self.checkGameOver(); } updateTileCounts(); if (playerTurn === 'white' && self.getValidMoves('white').length > 0) { LK.setTimeout(function () { ai.makeMove(board); updateTileCounts(); self.checkGameOver(); if (!gameOver) { playerTurn = 'black'; } }, 500); } else if (playerTurn === 'white') { playerTurn = 'black'; if (self.getValidMoves('black').length === 0) { self.checkGameOver(); } } function updateTileCounts() { var blackCount = 0, whiteCount = 0; for (var i = 0; i < 8; i++) { for (var j = 0; j < 8; j++) { if (board[i][j].state === 'black') blackCount++; if (board[i][j].state === 'white') whiteCount++; } } tileCounter.updateCounts(blackCount, whiteCount); } } } }; })(tile, i, j)); } } board[3][3].flip('white'); board[3][4].flip('black'); board[4][3].flip('black'); board[4][4].flip('white'); var tileCounter = self.addChild(new TileCounter()); self.addChild(tileCounter); LK.on('tick', function () {}); });
var AI = function () {
this.makeMove = function (board) {
var validMoves = [];
for (var x = 0; x < 8; x++) {
for (var y = 0; y < 8; y++) {
if (board[x][y].state === 'empty' && board[x][y].isValidMove(x, y, 'white', board)) {
validMoves.push({
x: x,
y: y
});
}
}
}
if (validMoves.length > 0) {
var move = validMoves[Math.floor(Math.random() * validMoves.length)];
var tilesToFlip = board[move.x][move.y].isValidMove(move.x, move.y, 'white', board);
if (tilesToFlip) {
board[move.x][move.y].flip('white');
for (var k = 0; k < tilesToFlip.length; k++) {
tilesToFlip[k].flip('white');
}
playerTurn = 'black';
}
}
};
};
var TileCounter = Container.expand(function () {
var self = Container.call(this);
var blackTileCountText = new Text2('Black: 2', {
size: 50,
fill: "#ffffff"
});
var whiteTileCountText = new Text2('White: 2', {
size: 50,
fill: "#ffffff"
});
self.updateCounts = function (blackCount, whiteCount) {
blackTileCountText.setText('Black: ' + blackCount);
whiteTileCountText.setText('White: ' + whiteCount);
};
blackTileCountText.y = 20;
whiteTileCountText.y = 20;
whiteTileCountText.x = 2048 - whiteTileCountText.width - 20;
self.addChild(blackTileCountText);
self.addChild(whiteTileCountText);
});
var Tile = Container.expand(function () {
var self = Container.call(this);
var tileGraphics = self.createAsset('tile', 'Game Tile', .5, .5);
self.state = 'empty';
self.isValidMove = function (x, y, player, board) {
var opponent = player === 'black' ? 'white' : 'black';
var allTilesToFlip = [];
var directions = [{
x: -1,
y: 0
}, {
x: 1,
y: 0
}, {
x: 0,
y: -1
}, {
x: 0,
y: 1
}, {
x: -1,
y: -1
}, {
x: -1,
y: 1
}, {
x: 1,
y: -1
}, {
x: 1,
y: 1
}];
for (var i = 0; i < directions.length; i++) {
var dir = directions[i];
var j = 1;
var tilesToFlip = [];
while (true) {
var checkX = x + dir.x * j;
var checkY = y + dir.y * j;
if (checkX < 0 || checkX >= 8 || checkY < 0 || checkY >= 8) break;
var checkTile = board[checkX][checkY];
if (checkTile.state === 'empty') break;
if (checkTile.state === opponent) {
tilesToFlip.push(checkTile);
} else if (checkTile.state === player) {
if (tilesToFlip.length > 0) {
allTilesToFlip = allTilesToFlip.concat(tilesToFlip);
}
break;
}
j++;
}
}
return allTilesToFlip.length > 0 ? allTilesToFlip : false;
};
self.flip = function (newState) {
self.state = newState;
if (self.state === 'black') {
self.createAsset('blackTile', 'Black Tile', .5, .5);
} else if (self.state === 'white') {
self.createAsset('whiteTile', 'White Tile', .5, .5);
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var board = [];
var ai = new AI();
var playerTurn = 'black';
var gameOver = false;
self.checkGameOver = function () {
var blackMoves = self.getValidMoves('black');
var whiteMoves = self.getValidMoves('white');
if (blackMoves.length === 0 && whiteMoves.length === 0) {
gameOver = true;
var blackCount = 0, whiteCount = 0;
for (var i = 0; i < 8; i++) {
for (var j = 0; j < 8; j++) {
if (board[i][j].state === 'black') blackCount++;
if (board[i][j].state === 'white') whiteCount++;
}
}
var winner = blackCount > whiteCount ? 'Black wins!' : whiteCount > blackCount ? 'White wins!' : 'Draw!';
var finalScore = 'Final score - Black: ' + blackCount + ' | White: ' + whiteCount;
var scoreMessage = finalScore + '\n' + winner;
LK.showGameOver(scoreMessage);
}
};
self.getValidMoves = function (playerColor) {
var validMoves = [];
for (var x = 0; x < 8; x++) {
for (var y = 0; y < 8; y++) {
if (board[x][y].state === 'empty' && board[x][y].isValidMove(x, y, playerColor, board)) {
validMoves.push({
x: x,
y: y
});
}
}
}
return validMoves;
};
var tile = new Tile();
var boardWidth = 8 * tile.width;
var boardHeight = 8 * tile.height;
var boardStartX = (2048 - boardWidth) / 2;
var boardStartY = (2732 - boardHeight) / 2;
for (var i = 0; i < 8; i++) {
board[i] = [];
for (var j = 0; j < 8; j++) {
var tile = self.addChild(new Tile());
tile.x = boardStartX + i * tile.width;
tile.y = boardStartY + j * tile.height;
board[i][j] = tile;
tile.on('down', (function (tile, i, j) {
return function (obj) {
if (playerTurn === 'black' && tile.state === 'empty') {
var tilesToFlip = tile.isValidMove(i, j, playerTurn, board);
if (tilesToFlip) {
tile.flip('black');
for (var k = 0; k < tilesToFlip.length; k++) {
tilesToFlip[k].flip('black');
}
if (self.getValidMoves('white').length > 0) {
playerTurn = 'white';
} else if (self.getValidMoves('black').length > 0) {
playerTurn = 'black';
} else {
self.checkGameOver();
}
updateTileCounts();
if (playerTurn === 'white' && self.getValidMoves('white').length > 0) {
LK.setTimeout(function () {
ai.makeMove(board);
updateTileCounts();
self.checkGameOver();
if (!gameOver) {
playerTurn = 'black';
}
}, 500);
} else if (playerTurn === 'white') {
playerTurn = 'black';
if (self.getValidMoves('black').length === 0) {
self.checkGameOver();
}
}
function updateTileCounts() {
var blackCount = 0, whiteCount = 0;
for (var i = 0; i < 8; i++) {
for (var j = 0; j < 8; j++) {
if (board[i][j].state === 'black') blackCount++;
if (board[i][j].state === 'white') whiteCount++;
}
}
tileCounter.updateCounts(blackCount, whiteCount);
}
}
}
};
})(tile, i, j));
}
}
board[3][3].flip('white');
board[3][4].flip('black');
board[4][3].flip('black');
board[4][4].flip('white');
var tileCounter = self.addChild(new TileCounter());
self.addChild(tileCounter);
LK.on('tick', function () {});
});
create a flat, round, black counter. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
create a flat, round, white counter. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
create a flat green square with sharp corners and a very thin darker outline Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.