/****
* Classes
****/
var ChessPiece = Container.expand(function (type, color) {
var self = Container.call(this);
self.type = type;
self.color = color;
self.hasMoved = false;
var assetName = color + type.charAt(0).toUpperCase() + type.slice(1);
var pieceGraphic = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.getValidMoves = function (board, fromRow, fromCol) {
var moves = [];
switch (self.type) {
case 'pawn':
moves = getPawnMoves(board, fromRow, fromCol, self.color);
break;
case 'rook':
moves = getRookMoves(board, fromRow, fromCol, self.color);
break;
case 'knight':
moves = getKnightMoves(board, fromRow, fromCol, self.color);
break;
case 'bishop':
moves = getBishopMoves(board, fromRow, fromCol, self.color);
break;
case 'queen':
moves = getQueenMoves(board, fromRow, fromCol, self.color);
break;
case 'king':
moves = getKingMoves(board, fromRow, fromCol, self.color);
break;
}
return moves;
};
return self;
});
var ChessSquare = Container.expand(function (row, col) {
var self = Container.call(this);
self.row = row;
self.col = col;
self.piece = null;
self.isLight = (row + col) % 2 === 0;
self.isHighlighted = false;
self.isSelected = false;
var squareGraphic = self.attachAsset(self.isLight ? 'lightSquare' : 'darkSquare', {
anchorX: 0.5,
anchorY: 0.5
});
var highlightGraphic = self.attachAsset('highlightSquare', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
var selectedGraphic = self.attachAsset('selectedSquare', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.setHighlight = function (highlight) {
self.isHighlighted = highlight;
highlightGraphic.alpha = highlight ? 0.5 : 0;
};
self.setSelected = function (selected) {
self.isSelected = selected;
selectedGraphic.alpha = selected ? 0.5 : 0;
};
self.setPiece = function (piece) {
if (self.piece) {
self.removeChild(self.piece);
}
self.piece = piece;
if (piece) {
self.addChild(piece);
}
};
self.down = function (x, y, obj) {
handleSquareClick(self);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B4513
});
/****
* Game Code
****/
var boardSize = 1800;
var squareSize = 225;
var boardStartX = (2048 - boardSize) / 2;
var boardStartY = (2732 - boardSize) / 2;
var board = [];
var selectedSquare = null;
var currentPlayer = 'white';
var gameOver = false;
var turnText = new Text2('White to move', {
size: 80,
fill: 0xFFFFFF
});
turnText.anchor.set(0.5, 0);
LK.gui.top.addChild(turnText);
function initializeBoard() {
for (var row = 0; row < 8; row++) {
board[row] = [];
for (var col = 0; col < 8; col++) {
var square = new ChessSquare(row, col);
square.x = boardStartX + col * squareSize + squareSize / 2;
square.y = boardStartY + row * squareSize + squareSize / 2;
board[row][col] = square;
game.addChild(square);
}
}
}
function setupPieces() {
var pieceOrder = ['rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook'];
for (var col = 0; col < 8; col++) {
board[0][col].setPiece(new ChessPiece(pieceOrder[col], 'black'));
board[1][col].setPiece(new ChessPiece('pawn', 'black'));
board[6][col].setPiece(new ChessPiece('pawn', 'white'));
board[7][col].setPiece(new ChessPiece(pieceOrder[col], 'white'));
}
}
function handleSquareClick(square) {
if (gameOver) return;
// Only allow player to control white pieces
if (currentPlayer === 'black') return;
if (selectedSquare) {
if (selectedSquare === square) {
clearSelection();
} else if (square.isHighlighted) {
movePiece(selectedSquare, square);
clearSelection();
switchPlayer();
// Trigger AI move after player move
if (currentPlayer === 'black' && !gameOver) {
LK.setTimeout(function () {
makeAIMove();
}, 500);
}
} else {
clearSelection();
if (square.piece && square.piece.color === 'white') {
selectSquare(square);
}
}
} else {
if (square.piece && square.piece.color === 'white') {
selectSquare(square);
}
}
}
function selectSquare(square) {
selectedSquare = square;
square.setSelected(true);
var validMoves = square.piece.getValidMoves(board, square.row, square.col);
for (var i = 0; i < validMoves.length; i++) {
var move = validMoves[i];
board[move.row][move.col].setHighlight(true);
}
}
function clearSelection() {
if (selectedSquare) {
selectedSquare.setSelected(false);
selectedSquare = null;
}
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
board[row][col].setHighlight(false);
}
}
}
function movePiece(fromSquare, toSquare) {
var piece = fromSquare.piece;
if (toSquare.piece) {
LK.setScore(LK.getScore() + getPieceValue(toSquare.piece.type));
}
toSquare.setPiece(piece);
fromSquare.setPiece(null);
piece.hasMoved = true;
if (isCheckmate(currentPlayer === 'white' ? 'black' : 'white')) {
gameOver = true;
turnText.setText(currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1) + ' wins!');
LK.showYouWin();
}
}
function switchPlayer() {
currentPlayer = currentPlayer === 'white' ? 'black' : 'white';
turnText.setText(currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1) + ' to move');
}
function getPieceValue(type) {
switch (type) {
case 'pawn':
return 1;
case 'knight':
return 3;
case 'bishop':
return 3;
case 'rook':
return 5;
case 'queen':
return 9;
case 'king':
return 0;
default:
return 0;
}
}
function isValidSquare(row, col) {
return row >= 0 && row < 8 && col >= 0 && col < 8;
}
function getPawnMoves(board, row, col, color) {
var moves = [];
var direction = color === 'white' ? -1 : 1;
var startRow = color === 'white' ? 6 : 1;
var newRow = row + direction;
if (isValidSquare(newRow, col) && !board[newRow][col].piece) {
moves.push({
row: newRow,
col: col
});
if (row === startRow) {
newRow = row + 2 * direction;
if (isValidSquare(newRow, col) && !board[newRow][col].piece) {
moves.push({
row: newRow,
col: col
});
}
}
}
for (var i = -1; i <= 1; i += 2) {
var newCol = col + i;
newRow = row + direction;
if (isValidSquare(newRow, newCol) && board[newRow][newCol].piece && board[newRow][newCol].piece.color !== color) {
moves.push({
row: newRow,
col: newCol
});
}
}
return moves;
}
function getRookMoves(board, row, col, color) {
var moves = [];
var directions = [[0, 1], [0, -1], [1, 0], [-1, 0]];
for (var d = 0; d < directions.length; d++) {
var dir = directions[d];
for (var i = 1; i < 8; i++) {
var newRow = row + dir[0] * i;
var newCol = col + dir[1] * i;
if (!isValidSquare(newRow, newCol)) break;
if (board[newRow][newCol].piece) {
if (board[newRow][newCol].piece.color !== color) {
moves.push({
row: newRow,
col: newCol
});
}
break;
}
moves.push({
row: newRow,
col: newCol
});
}
}
return moves;
}
function getKnightMoves(board, row, col, color) {
var moves = [];
var knightMoves = [[2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]];
for (var i = 0; i < knightMoves.length; i++) {
var move = knightMoves[i];
var newRow = row + move[0];
var newCol = col + move[1];
if (isValidSquare(newRow, newCol)) {
if (!board[newRow][newCol].piece || board[newRow][newCol].piece.color !== color) {
moves.push({
row: newRow,
col: newCol
});
}
}
}
return moves;
}
function getBishopMoves(board, row, col, color) {
var moves = [];
var directions = [[1, 1], [1, -1], [-1, 1], [-1, -1]];
for (var d = 0; d < directions.length; d++) {
var dir = directions[d];
for (var i = 1; i < 8; i++) {
var newRow = row + dir[0] * i;
var newCol = col + dir[1] * i;
if (!isValidSquare(newRow, newCol)) break;
if (board[newRow][newCol].piece) {
if (board[newRow][newCol].piece.color !== color) {
moves.push({
row: newRow,
col: newCol
});
}
break;
}
moves.push({
row: newRow,
col: newCol
});
}
}
return moves;
}
function getQueenMoves(board, row, col, color) {
var rookMoves = getRookMoves(board, row, col, color);
var bishopMoves = getBishopMoves(board, row, col, color);
return rookMoves.concat(bishopMoves);
}
function getKingMoves(board, row, col, color) {
var moves = [];
var directions = [[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]];
for (var i = 0; i < directions.length; i++) {
var dir = directions[i];
var newRow = row + dir[0];
var newCol = col + dir[1];
if (isValidSquare(newRow, newCol)) {
if (!board[newRow][newCol].piece || board[newRow][newCol].piece.color !== color) {
moves.push({
row: newRow,
col: newCol
});
}
}
}
return moves;
}
function findKing(color) {
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var piece = board[row][col].piece;
if (piece && piece.type === 'king' && piece.color === color) {
return {
row: row,
col: col
};
}
}
}
return null;
}
function isInCheck(color) {
var king = findKing(color);
if (!king) return false;
var enemyColor = color === 'white' ? 'black' : 'white';
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var piece = board[row][col].piece;
if (piece && piece.color === enemyColor) {
var moves = piece.getValidMoves(board, row, col);
for (var i = 0; i < moves.length; i++) {
if (moves[i].row === king.row && moves[i].col === king.col) {
return true;
}
}
}
}
}
return false;
}
function isCheckmate(color) {
if (!isInCheck(color)) return false;
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var piece = board[row][col].piece;
if (piece && piece.color === color) {
var moves = piece.getValidMoves(board, row, col);
if (moves.length > 0) {
return false;
}
}
}
}
return true;
}
function getAllValidMoves(color) {
var allMoves = [];
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var piece = board[row][col].piece;
if (piece && piece.color === color) {
var moves = piece.getValidMoves(board, row, col);
for (var i = 0; i < moves.length; i++) {
allMoves.push({
fromRow: row,
fromCol: col,
toRow: moves[i].row,
toCol: moves[i].col,
piece: piece
});
}
}
}
}
return allMoves;
}
function evaluateMove(move) {
var score = 0;
var targetSquare = board[move.toRow][move.toCol];
// Capture bonus
if (targetSquare.piece) {
score += getPieceValue(targetSquare.piece.type) * 10;
}
// Center control bonus
var centerDistance = Math.abs(move.toRow - 3.5) + Math.abs(move.toCol - 3.5);
score += (7 - centerDistance) * 2;
// Random factor to add variety
score += Math.random() * 5;
return score;
}
function makeAIMove() {
if (gameOver || currentPlayer !== 'black') return;
var possibleMoves = getAllValidMoves('black');
if (possibleMoves.length === 0) return;
// Find best move
var bestMove = possibleMoves[0];
var bestScore = evaluateMove(bestMove);
for (var i = 1; i < possibleMoves.length; i++) {
var score = evaluateMove(possibleMoves[i]);
if (score > bestScore) {
bestScore = score;
bestMove = possibleMoves[i];
}
}
// Execute the move
var fromSquare = board[bestMove.fromRow][bestMove.fromCol];
var toSquare = board[bestMove.toRow][bestMove.toCol];
movePiece(fromSquare, toSquare);
switchPlayer();
}
initializeBoard();
setupPieces(); ===================================================================
--- original.js
+++ change.js
@@ -128,23 +128,31 @@
}
}
function handleSquareClick(square) {
if (gameOver) return;
+ // Only allow player to control white pieces
+ if (currentPlayer === 'black') return;
if (selectedSquare) {
if (selectedSquare === square) {
clearSelection();
} else if (square.isHighlighted) {
movePiece(selectedSquare, square);
clearSelection();
switchPlayer();
+ // Trigger AI move after player move
+ if (currentPlayer === 'black' && !gameOver) {
+ LK.setTimeout(function () {
+ makeAIMove();
+ }, 500);
+ }
} else {
clearSelection();
- if (square.piece && square.piece.color === currentPlayer) {
+ if (square.piece && square.piece.color === 'white') {
selectSquare(square);
}
}
} else {
- if (square.piece && square.piece.color === currentPlayer) {
+ if (square.piece && square.piece.color === 'white') {
selectSquare(square);
}
}
}
@@ -379,6 +387,61 @@
}
}
return true;
}
+function getAllValidMoves(color) {
+ var allMoves = [];
+ for (var row = 0; row < 8; row++) {
+ for (var col = 0; col < 8; col++) {
+ var piece = board[row][col].piece;
+ if (piece && piece.color === color) {
+ var moves = piece.getValidMoves(board, row, col);
+ for (var i = 0; i < moves.length; i++) {
+ allMoves.push({
+ fromRow: row,
+ fromCol: col,
+ toRow: moves[i].row,
+ toCol: moves[i].col,
+ piece: piece
+ });
+ }
+ }
+ }
+ }
+ return allMoves;
+}
+function evaluateMove(move) {
+ var score = 0;
+ var targetSquare = board[move.toRow][move.toCol];
+ // Capture bonus
+ if (targetSquare.piece) {
+ score += getPieceValue(targetSquare.piece.type) * 10;
+ }
+ // Center control bonus
+ var centerDistance = Math.abs(move.toRow - 3.5) + Math.abs(move.toCol - 3.5);
+ score += (7 - centerDistance) * 2;
+ // Random factor to add variety
+ score += Math.random() * 5;
+ return score;
+}
+function makeAIMove() {
+ if (gameOver || currentPlayer !== 'black') return;
+ var possibleMoves = getAllValidMoves('black');
+ if (possibleMoves.length === 0) return;
+ // Find best move
+ var bestMove = possibleMoves[0];
+ var bestScore = evaluateMove(bestMove);
+ for (var i = 1; i < possibleMoves.length; i++) {
+ var score = evaluateMove(possibleMoves[i]);
+ if (score > bestScore) {
+ bestScore = score;
+ bestMove = possibleMoves[i];
+ }
+ }
+ // Execute the move
+ var fromSquare = board[bestMove.fromRow][bestMove.fromCol];
+ var toSquare = board[bestMove.toRow][bestMove.toCol];
+ movePiece(fromSquare, toSquare);
+ switchPlayer();
+}
initializeBoard();
setupPieces();
\ No newline at end of file