Code edit (1 edits merged)
Please save this source code
User prompt
Star Chess Arena
Initial prompt
Create a two-player chess game mobile app using Flutter (for Android and iOS). Each player starts with 10 stars. Before each game, both players bet any number of stars from 0 to 10. The winner takes all the stars that were bet. Update each player's star count accordingly. The app should allow real-time multiplayer via online matchmaking or QR code pairing. Make the UI clean, modern, and mobile-friendly.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var ChessPiece = Container.expand(function (type, color, row, col) {
var self = Container.call(this);
self.pieceType = type;
self.color = color;
self.row = row;
self.col = col;
self.hasMoved = false;
var assetId = color + type.charAt(0).toUpperCase() + type.slice(1);
var pieceGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
if (currentPlayer !== self.color) return;
if (gameState !== 'playing') return;
selectedPiece = self;
selectedSquare = {
row: self.row,
col: self.col
};
validMoves = getValidMoves(self);
updateBoardDisplay();
};
return self;
});
var Square = Container.expand(function (row, col, isLight) {
var self = Container.call(this);
self.row = row;
self.col = col;
self.isLight = isLight;
self.piece = null;
var squareGraphics = self.attachAsset(isLight ? 'lightSquare' : 'darkSquare', {
anchorX: 0,
anchorY: 0
});
self.down = function (x, y, obj) {
if (gameState !== 'playing') return;
if (selectedPiece && isValidMove(selectedPiece.row, selectedPiece.col, self.row, self.col)) {
movePiece(selectedPiece, self.row, self.col);
} else {
clearSelection();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1e293b
});
/****
* Game Code
****/
// Game state variables
var gameState = 'betting'; // 'betting', 'playing', 'gameOver'
var currentPlayer = 'white';
var selectedPiece = null;
var selectedSquare = null;
var validMoves = [];
var board = [];
var pieces = [];
// Player data
var playerStars = storage.playerStars || 10;
var opponentStars = storage.opponentStars || 10;
var playerBet = 0;
var opponentBet = 0;
var betPhase = 'playerBetting'; // 'playerBetting', 'opponentBetting', 'waitingForOpponent'
// UI elements
var boardContainer = new Container();
var squareOverlays = [];
var starDisplay, betDisplay, gameStatusDisplay;
// Initialize chess board
function initializeBoard() {
board = [];
pieces = [];
// Create 8x8 board
for (var row = 0; row < 8; row++) {
board[row] = [];
for (var col = 0; col < 8; col++) {
board[row][col] = null;
}
}
// Setup initial piece positions
var pieceSetup = [['rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook'], ['pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']];
// Place black pieces
for (var row = 0; row < 2; row++) {
for (var col = 0; col < 8; col++) {
var piece = new ChessPiece(pieceSetup[row][col], 'black', row, col);
pieces.push(piece);
board[row][col] = piece;
boardContainer.addChild(piece);
piece.x = 124 + col * 225 + 112.5;
piece.y = 466 + row * 225 + 112.5;
}
}
// Place white pieces
for (var row = 6; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var pieceType = pieceSetup[7 - row][col];
var piece = new ChessPiece(pieceType, 'white', row, col);
pieces.push(piece);
board[row][col] = piece;
boardContainer.addChild(piece);
piece.x = 124 + col * 225 + 112.5;
piece.y = 466 + row * 225 + 112.5;
}
}
}
// Create visual board squares
function createBoardDisplay() {
boardContainer.x = 124;
boardContainer.y = 466;
game.addChild(boardContainer);
// Create board background
var boardBg = boardContainer.attachAsset('chessBoard', {
anchorX: 0,
anchorY: 0
});
// Create squares
for (var row = 0; row < 8; row++) {
squareOverlays[row] = [];
for (var col = 0; col < 8; col++) {
var isLight = (row + col) % 2 === 0;
var square = new Square(row, col, isLight);
square.x = col * 225;
square.y = row * 225;
boardContainer.addChild(square);
squareOverlays[row][col] = square;
}
}
}
// Get valid moves for a piece
function getValidMoves(piece) {
var moves = [];
if (piece.pieceType === 'pawn') {
var direction = piece.color === 'white' ? -1 : 1;
var startRow = piece.color === 'white' ? 6 : 1;
// Forward move
if (isValidSquare(piece.row + direction, piece.col) && !board[piece.row + direction][piece.col]) {
moves.push({
row: piece.row + direction,
col: piece.col
});
// Double move from start
if (piece.row === startRow && !board[piece.row + 2 * direction][piece.col]) {
moves.push({
row: piece.row + 2 * direction,
col: piece.col
});
}
}
// Captures
for (var dc = -1; dc <= 1; dc += 2) {
var newRow = piece.row + direction;
var newCol = piece.col + dc;
if (isValidSquare(newRow, newCol) && board[newRow][newCol] && board[newRow][newCol].color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
}
} else if (piece.pieceType === 'rook') {
// Horizontal and vertical 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 = piece.row + dir[0] * i;
var newCol = piece.col + dir[1] * i;
if (!isValidSquare(newRow, newCol)) break;
var targetPiece = board[newRow][newCol];
if (!targetPiece) {
moves.push({
row: newRow,
col: newCol
});
} else {
if (targetPiece.color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
break;
}
}
}
} else if (piece.pieceType === 'bishop') {
// Diagonal 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 = piece.row + dir[0] * i;
var newCol = piece.col + dir[1] * i;
if (!isValidSquare(newRow, newCol)) break;
var targetPiece = board[newRow][newCol];
if (!targetPiece) {
moves.push({
row: newRow,
col: newCol
});
} else {
if (targetPiece.color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
break;
}
}
}
} else if (piece.pieceType === 'queen') {
// Combination of rook and bishop moves
var directions = [[0, 1], [0, -1], [1, 0], [-1, 0], [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 = piece.row + dir[0] * i;
var newCol = piece.col + dir[1] * i;
if (!isValidSquare(newRow, newCol)) break;
var targetPiece = board[newRow][newCol];
if (!targetPiece) {
moves.push({
row: newRow,
col: newCol
});
} else {
if (targetPiece.color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
break;
}
}
}
} else if (piece.pieceType === 'king') {
// One square in any direction
var directions = [[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]];
for (var d = 0; d < directions.length; d++) {
var dir = directions[d];
var newRow = piece.row + dir[0];
var newCol = piece.col + dir[1];
if (isValidSquare(newRow, newCol)) {
var targetPiece = board[newRow][newCol];
if (!targetPiece || targetPiece.color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
}
}
} else if (piece.pieceType === 'knight') {
// L-shaped moves
var knightMoves = [[2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]];
for (var m = 0; m < knightMoves.length; m++) {
var move = knightMoves[m];
var newRow = piece.row + move[0];
var newCol = piece.col + move[1];
if (isValidSquare(newRow, newCol)) {
var targetPiece = board[newRow][newCol];
if (!targetPiece || targetPiece.color !== piece.color) {
moves.push({
row: newRow,
col: newCol
});
}
}
}
}
return moves;
}
function isValidSquare(row, col) {
return row >= 0 && row < 8 && col >= 0 && col < 8;
}
function isValidMove(fromRow, fromCol, toRow, toCol) {
for (var i = 0; i < validMoves.length; i++) {
if (validMoves[i].row === toRow && validMoves[i].col === toCol) {
return true;
}
}
return false;
}
function movePiece(piece, newRow, newCol) {
var capturedPiece = board[newRow][newCol];
// Remove piece from old position
board[piece.row][piece.col] = null;
// Handle capture
if (capturedPiece) {
capturedPiece.destroy();
LK.getSound('capture').play();
} else {
LK.getSound('pieceMove').play();
}
// Update piece position
piece.row = newRow;
piece.col = newCol;
piece.hasMoved = true;
board[newRow][newCol] = piece;
// Animate piece movement
tween(piece, {
x: 124 + newCol * 225 + 112.5,
y: 466 + newRow * 225 + 112.5
}, {
duration: 300,
easing: tween.easeOut
});
// Clear selection
clearSelection();
// Switch turns
currentPlayer = currentPlayer === 'white' ? 'black' : 'white';
updateGameStatus();
// Check for game over conditions
checkGameOver();
}
function clearSelection() {
selectedPiece = null;
selectedSquare = null;
validMoves = [];
updateBoardDisplay();
}
function updateBoardDisplay() {
// Clear all overlays
for (var row = 0; row < 8; row++) {
for (var col = 0; col < 8; col++) {
var square = squareOverlays[row][col];
square.removeChildren();
var isLight = (row + col) % 2 === 0;
var squareGraphics = square.attachAsset(isLight ? 'lightSquare' : 'darkSquare', {
anchorX: 0,
anchorY: 0
});
}
}
// Show selected square
if (selectedSquare) {
var selectedSquareOverlay = squareOverlays[selectedSquare.row][selectedSquare.col];
selectedSquareOverlay.removeChildren();
var selectedGraphics = selectedSquareOverlay.attachAsset('selectedSquare', {
anchorX: 0,
anchorY: 0
});
}
// Show valid moves
for (var i = 0; i < validMoves.length; i++) {
var move = validMoves[i];
var moveSquare = squareOverlays[move.row][move.col];
moveSquare.removeChildren();
var moveGraphics = moveSquare.attachAsset('validMoveSquare', {
anchorX: 0,
anchorY: 0
});
}
}
function checkGameOver() {
// Simple game over check - if king is captured
var whiteKingExists = false;
var blackKingExists = false;
for (var i = 0; i < pieces.length; i++) {
var piece = pieces[i];
if (piece.parent && piece.pieceType === 'king') {
if (piece.color === 'white') whiteKingExists = true;
if (piece.color === 'black') blackKingExists = true;
}
}
if (!whiteKingExists) {
endGame('black');
} else if (!blackKingExists) {
endGame('white');
}
}
function endGame(winner) {
gameState = 'gameOver';
// Award stars
if (winner === 'white') {
playerStars += opponentBet;
opponentStars -= opponentBet;
} else {
playerStars -= playerBet;
opponentStars += playerBet;
}
// Save to storage
storage.playerStars = playerStars;
storage.opponentStars = opponentStars;
updateStarDisplay();
if (winner === 'white') {
LK.showYouWin();
} else {
LK.showGameOver();
}
}
function createUI() {
// Star display
starDisplay = new Text2('Stars: ' + playerStars, {
size: 60,
fill: 0xFFFFFF
});
starDisplay.anchor.set(0.5, 0);
LK.gui.top.addChild(starDisplay);
starDisplay.y = 100;
// Game status display
gameStatusDisplay = new Text2('Place your bet!', {
size: 50,
fill: 0xFFFFFF
});
gameStatusDisplay.anchor.set(0.5, 0);
LK.gui.top.addChild(gameStatusDisplay);
gameStatusDisplay.y = 180;
// Betting interface
createBettingUI();
}
function createBettingUI() {
// Bet amount display
betDisplay = new Text2('Bet: ' + playerBet + ' stars', {
size: 50,
fill: 0xFFFFFF
});
betDisplay.anchor.set(0.5, 1);
LK.gui.bottom.addChild(betDisplay);
betDisplay.y = -200;
// Bet buttons
var decreaseBetBtn = LK.getAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
var increaseBetBtn = LK.getAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
var confirmBetBtn = LK.getAsset('betButton', {
anchorX: 0.5,
anchorY: 0.5
});
LK.gui.bottom.addChild(decreaseBetBtn);
LK.gui.bottom.addChild(increaseBetBtn);
LK.gui.bottom.addChild(confirmBetBtn);
decreaseBetBtn.x = -200;
decreaseBetBtn.y = -100;
increaseBetBtn.x = 0;
increaseBetBtn.y = -100;
confirmBetBtn.x = 200;
confirmBetBtn.y = -100;
var decreaseText = new Text2('-', {
size: 40,
fill: 0xFFFFFF
});
decreaseText.anchor.set(0.5, 0.5);
decreaseBetBtn.addChild(decreaseText);
var increaseText = new Text2('+', {
size: 40,
fill: 0xFFFFFF
});
increaseText.anchor.set(0.5, 0.5);
increaseBetBtn.addChild(increaseText);
var confirmText = new Text2('Confirm', {
size: 30,
fill: 0xFFFFFF
});
confirmText.anchor.set(0.5, 0.5);
confirmBetBtn.addChild(confirmText);
// Button interactions
decreaseBetBtn.down = function () {
if (playerBet > 0) {
playerBet--;
updateBetDisplay();
}
};
increaseBetBtn.down = function () {
if (playerBet < playerStars) {
playerBet++;
updateBetDisplay();
}
};
confirmBetBtn.down = function () {
if (gameState === 'betting') {
confirmBet();
}
};
}
function updateBetDisplay() {
betDisplay.setText('Bet: ' + playerBet + ' stars');
}
function updateStarDisplay() {
starDisplay.setText('Stars: ' + playerStars);
}
function updateGameStatus() {
if (gameState === 'betting') {
gameStatusDisplay.setText('Place your bet!');
} else if (gameState === 'playing') {
gameStatusDisplay.setText(currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1) + "'s turn");
}
}
function confirmBet() {
// For now, simulate opponent bet (random between 0 and their stars)
opponentBet = Math.floor(Math.random() * (Math.min(opponentStars, 10) + 1));
gameState = 'playing';
updateGameStatus();
// Hide betting UI
LK.gui.bottom.removeChildren();
// Show bet results
var betResultText = new Text2('You bet: ' + playerBet + ' | Opponent bet: ' + opponentBet, {
size: 40,
fill: 0xFFFFFF
});
betResultText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(betResultText);
betResultText.y = -50;
}
// Initialize everything
createBoardDisplay();
initializeBoard();
createUI();
updateBoardDisplay();
game.update = function () {
// Game loop - handle any continuous updates if needed
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,533 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var ChessPiece = Container.expand(function (type, color, row, col) {
+ var self = Container.call(this);
+ self.pieceType = type;
+ self.color = color;
+ self.row = row;
+ self.col = col;
+ self.hasMoved = false;
+ var assetId = color + type.charAt(0).toUpperCase() + type.slice(1);
+ var pieceGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.down = function (x, y, obj) {
+ if (currentPlayer !== self.color) return;
+ if (gameState !== 'playing') return;
+ selectedPiece = self;
+ selectedSquare = {
+ row: self.row,
+ col: self.col
+ };
+ validMoves = getValidMoves(self);
+ updateBoardDisplay();
+ };
+ return self;
+});
+var Square = Container.expand(function (row, col, isLight) {
+ var self = Container.call(this);
+ self.row = row;
+ self.col = col;
+ self.isLight = isLight;
+ self.piece = null;
+ var squareGraphics = self.attachAsset(isLight ? 'lightSquare' : 'darkSquare', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.down = function (x, y, obj) {
+ if (gameState !== 'playing') return;
+ if (selectedPiece && isValidMove(selectedPiece.row, selectedPiece.col, self.row, self.col)) {
+ movePiece(selectedPiece, self.row, self.col);
+ } else {
+ clearSelection();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1e293b
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameState = 'betting'; // 'betting', 'playing', 'gameOver'
+var currentPlayer = 'white';
+var selectedPiece = null;
+var selectedSquare = null;
+var validMoves = [];
+var board = [];
+var pieces = [];
+// Player data
+var playerStars = storage.playerStars || 10;
+var opponentStars = storage.opponentStars || 10;
+var playerBet = 0;
+var opponentBet = 0;
+var betPhase = 'playerBetting'; // 'playerBetting', 'opponentBetting', 'waitingForOpponent'
+// UI elements
+var boardContainer = new Container();
+var squareOverlays = [];
+var starDisplay, betDisplay, gameStatusDisplay;
+// Initialize chess board
+function initializeBoard() {
+ board = [];
+ pieces = [];
+ // Create 8x8 board
+ for (var row = 0; row < 8; row++) {
+ board[row] = [];
+ for (var col = 0; col < 8; col++) {
+ board[row][col] = null;
+ }
+ }
+ // Setup initial piece positions
+ var pieceSetup = [['rook', 'knight', 'bishop', 'queen', 'king', 'bishop', 'knight', 'rook'], ['pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']];
+ // Place black pieces
+ for (var row = 0; row < 2; row++) {
+ for (var col = 0; col < 8; col++) {
+ var piece = new ChessPiece(pieceSetup[row][col], 'black', row, col);
+ pieces.push(piece);
+ board[row][col] = piece;
+ boardContainer.addChild(piece);
+ piece.x = 124 + col * 225 + 112.5;
+ piece.y = 466 + row * 225 + 112.5;
+ }
+ }
+ // Place white pieces
+ for (var row = 6; row < 8; row++) {
+ for (var col = 0; col < 8; col++) {
+ var pieceType = pieceSetup[7 - row][col];
+ var piece = new ChessPiece(pieceType, 'white', row, col);
+ pieces.push(piece);
+ board[row][col] = piece;
+ boardContainer.addChild(piece);
+ piece.x = 124 + col * 225 + 112.5;
+ piece.y = 466 + row * 225 + 112.5;
+ }
+ }
+}
+// Create visual board squares
+function createBoardDisplay() {
+ boardContainer.x = 124;
+ boardContainer.y = 466;
+ game.addChild(boardContainer);
+ // Create board background
+ var boardBg = boardContainer.attachAsset('chessBoard', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ // Create squares
+ for (var row = 0; row < 8; row++) {
+ squareOverlays[row] = [];
+ for (var col = 0; col < 8; col++) {
+ var isLight = (row + col) % 2 === 0;
+ var square = new Square(row, col, isLight);
+ square.x = col * 225;
+ square.y = row * 225;
+ boardContainer.addChild(square);
+ squareOverlays[row][col] = square;
+ }
+ }
+}
+// Get valid moves for a piece
+function getValidMoves(piece) {
+ var moves = [];
+ if (piece.pieceType === 'pawn') {
+ var direction = piece.color === 'white' ? -1 : 1;
+ var startRow = piece.color === 'white' ? 6 : 1;
+ // Forward move
+ if (isValidSquare(piece.row + direction, piece.col) && !board[piece.row + direction][piece.col]) {
+ moves.push({
+ row: piece.row + direction,
+ col: piece.col
+ });
+ // Double move from start
+ if (piece.row === startRow && !board[piece.row + 2 * direction][piece.col]) {
+ moves.push({
+ row: piece.row + 2 * direction,
+ col: piece.col
+ });
+ }
+ }
+ // Captures
+ for (var dc = -1; dc <= 1; dc += 2) {
+ var newRow = piece.row + direction;
+ var newCol = piece.col + dc;
+ if (isValidSquare(newRow, newCol) && board[newRow][newCol] && board[newRow][newCol].color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ }
+ } else if (piece.pieceType === 'rook') {
+ // Horizontal and vertical 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 = piece.row + dir[0] * i;
+ var newCol = piece.col + dir[1] * i;
+ if (!isValidSquare(newRow, newCol)) break;
+ var targetPiece = board[newRow][newCol];
+ if (!targetPiece) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ } else {
+ if (targetPiece.color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ break;
+ }
+ }
+ }
+ } else if (piece.pieceType === 'bishop') {
+ // Diagonal 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 = piece.row + dir[0] * i;
+ var newCol = piece.col + dir[1] * i;
+ if (!isValidSquare(newRow, newCol)) break;
+ var targetPiece = board[newRow][newCol];
+ if (!targetPiece) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ } else {
+ if (targetPiece.color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ break;
+ }
+ }
+ }
+ } else if (piece.pieceType === 'queen') {
+ // Combination of rook and bishop moves
+ var directions = [[0, 1], [0, -1], [1, 0], [-1, 0], [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 = piece.row + dir[0] * i;
+ var newCol = piece.col + dir[1] * i;
+ if (!isValidSquare(newRow, newCol)) break;
+ var targetPiece = board[newRow][newCol];
+ if (!targetPiece) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ } else {
+ if (targetPiece.color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ break;
+ }
+ }
+ }
+ } else if (piece.pieceType === 'king') {
+ // One square in any direction
+ var directions = [[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]];
+ for (var d = 0; d < directions.length; d++) {
+ var dir = directions[d];
+ var newRow = piece.row + dir[0];
+ var newCol = piece.col + dir[1];
+ if (isValidSquare(newRow, newCol)) {
+ var targetPiece = board[newRow][newCol];
+ if (!targetPiece || targetPiece.color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ }
+ }
+ } else if (piece.pieceType === 'knight') {
+ // L-shaped moves
+ var knightMoves = [[2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]];
+ for (var m = 0; m < knightMoves.length; m++) {
+ var move = knightMoves[m];
+ var newRow = piece.row + move[0];
+ var newCol = piece.col + move[1];
+ if (isValidSquare(newRow, newCol)) {
+ var targetPiece = board[newRow][newCol];
+ if (!targetPiece || targetPiece.color !== piece.color) {
+ moves.push({
+ row: newRow,
+ col: newCol
+ });
+ }
+ }
+ }
+ }
+ return moves;
+}
+function isValidSquare(row, col) {
+ return row >= 0 && row < 8 && col >= 0 && col < 8;
+}
+function isValidMove(fromRow, fromCol, toRow, toCol) {
+ for (var i = 0; i < validMoves.length; i++) {
+ if (validMoves[i].row === toRow && validMoves[i].col === toCol) {
+ return true;
+ }
+ }
+ return false;
+}
+function movePiece(piece, newRow, newCol) {
+ var capturedPiece = board[newRow][newCol];
+ // Remove piece from old position
+ board[piece.row][piece.col] = null;
+ // Handle capture
+ if (capturedPiece) {
+ capturedPiece.destroy();
+ LK.getSound('capture').play();
+ } else {
+ LK.getSound('pieceMove').play();
+ }
+ // Update piece position
+ piece.row = newRow;
+ piece.col = newCol;
+ piece.hasMoved = true;
+ board[newRow][newCol] = piece;
+ // Animate piece movement
+ tween(piece, {
+ x: 124 + newCol * 225 + 112.5,
+ y: 466 + newRow * 225 + 112.5
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ // Clear selection
+ clearSelection();
+ // Switch turns
+ currentPlayer = currentPlayer === 'white' ? 'black' : 'white';
+ updateGameStatus();
+ // Check for game over conditions
+ checkGameOver();
+}
+function clearSelection() {
+ selectedPiece = null;
+ selectedSquare = null;
+ validMoves = [];
+ updateBoardDisplay();
+}
+function updateBoardDisplay() {
+ // Clear all overlays
+ for (var row = 0; row < 8; row++) {
+ for (var col = 0; col < 8; col++) {
+ var square = squareOverlays[row][col];
+ square.removeChildren();
+ var isLight = (row + col) % 2 === 0;
+ var squareGraphics = square.attachAsset(isLight ? 'lightSquare' : 'darkSquare', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ }
+ }
+ // Show selected square
+ if (selectedSquare) {
+ var selectedSquareOverlay = squareOverlays[selectedSquare.row][selectedSquare.col];
+ selectedSquareOverlay.removeChildren();
+ var selectedGraphics = selectedSquareOverlay.attachAsset('selectedSquare', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ }
+ // Show valid moves
+ for (var i = 0; i < validMoves.length; i++) {
+ var move = validMoves[i];
+ var moveSquare = squareOverlays[move.row][move.col];
+ moveSquare.removeChildren();
+ var moveGraphics = moveSquare.attachAsset('validMoveSquare', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ }
+}
+function checkGameOver() {
+ // Simple game over check - if king is captured
+ var whiteKingExists = false;
+ var blackKingExists = false;
+ for (var i = 0; i < pieces.length; i++) {
+ var piece = pieces[i];
+ if (piece.parent && piece.pieceType === 'king') {
+ if (piece.color === 'white') whiteKingExists = true;
+ if (piece.color === 'black') blackKingExists = true;
+ }
+ }
+ if (!whiteKingExists) {
+ endGame('black');
+ } else if (!blackKingExists) {
+ endGame('white');
+ }
+}
+function endGame(winner) {
+ gameState = 'gameOver';
+ // Award stars
+ if (winner === 'white') {
+ playerStars += opponentBet;
+ opponentStars -= opponentBet;
+ } else {
+ playerStars -= playerBet;
+ opponentStars += playerBet;
+ }
+ // Save to storage
+ storage.playerStars = playerStars;
+ storage.opponentStars = opponentStars;
+ updateStarDisplay();
+ if (winner === 'white') {
+ LK.showYouWin();
+ } else {
+ LK.showGameOver();
+ }
+}
+function createUI() {
+ // Star display
+ starDisplay = new Text2('Stars: ' + playerStars, {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ starDisplay.anchor.set(0.5, 0);
+ LK.gui.top.addChild(starDisplay);
+ starDisplay.y = 100;
+ // Game status display
+ gameStatusDisplay = new Text2('Place your bet!', {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ gameStatusDisplay.anchor.set(0.5, 0);
+ LK.gui.top.addChild(gameStatusDisplay);
+ gameStatusDisplay.y = 180;
+ // Betting interface
+ createBettingUI();
+}
+function createBettingUI() {
+ // Bet amount display
+ betDisplay = new Text2('Bet: ' + playerBet + ' stars', {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ betDisplay.anchor.set(0.5, 1);
+ LK.gui.bottom.addChild(betDisplay);
+ betDisplay.y = -200;
+ // Bet buttons
+ var decreaseBetBtn = LK.getAsset('betButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var increaseBetBtn = LK.getAsset('betButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var confirmBetBtn = LK.getAsset('betButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ LK.gui.bottom.addChild(decreaseBetBtn);
+ LK.gui.bottom.addChild(increaseBetBtn);
+ LK.gui.bottom.addChild(confirmBetBtn);
+ decreaseBetBtn.x = -200;
+ decreaseBetBtn.y = -100;
+ increaseBetBtn.x = 0;
+ increaseBetBtn.y = -100;
+ confirmBetBtn.x = 200;
+ confirmBetBtn.y = -100;
+ var decreaseText = new Text2('-', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ decreaseText.anchor.set(0.5, 0.5);
+ decreaseBetBtn.addChild(decreaseText);
+ var increaseText = new Text2('+', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ increaseText.anchor.set(0.5, 0.5);
+ increaseBetBtn.addChild(increaseText);
+ var confirmText = new Text2('Confirm', {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ confirmText.anchor.set(0.5, 0.5);
+ confirmBetBtn.addChild(confirmText);
+ // Button interactions
+ decreaseBetBtn.down = function () {
+ if (playerBet > 0) {
+ playerBet--;
+ updateBetDisplay();
+ }
+ };
+ increaseBetBtn.down = function () {
+ if (playerBet < playerStars) {
+ playerBet++;
+ updateBetDisplay();
+ }
+ };
+ confirmBetBtn.down = function () {
+ if (gameState === 'betting') {
+ confirmBet();
+ }
+ };
+}
+function updateBetDisplay() {
+ betDisplay.setText('Bet: ' + playerBet + ' stars');
+}
+function updateStarDisplay() {
+ starDisplay.setText('Stars: ' + playerStars);
+}
+function updateGameStatus() {
+ if (gameState === 'betting') {
+ gameStatusDisplay.setText('Place your bet!');
+ } else if (gameState === 'playing') {
+ gameStatusDisplay.setText(currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1) + "'s turn");
+ }
+}
+function confirmBet() {
+ // For now, simulate opponent bet (random between 0 and their stars)
+ opponentBet = Math.floor(Math.random() * (Math.min(opponentStars, 10) + 1));
+ gameState = 'playing';
+ updateGameStatus();
+ // Hide betting UI
+ LK.gui.bottom.removeChildren();
+ // Show bet results
+ var betResultText = new Text2('You bet: ' + playerBet + ' | Opponent bet: ' + opponentBet, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ betResultText.anchor.set(0.5, 1);
+ LK.gui.bottom.addChild(betResultText);
+ betResultText.y = -50;
+}
+// Initialize everything
+createBoardDisplay();
+initializeBoard();
+createUI();
+updateBoardDisplay();
+game.update = function () {
+ // Game loop - handle any continuous updates if needed
+};
\ No newline at end of file