User prompt
can the texts colour to white
User prompt
Set a pixel-art style background that looks like an old arcade game screen. Use dark tones with neon grid lines to create a retro gaming atmosphere.
Code edit (1 edits merged)
Please save this source code
Initial prompt
Tic Tac Toe: Human vs Computer
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // BoardCell: Represents a single cell in the Tic Tac Toe grid var BoardCell = Container.expand(function () { var self = Container.call(this); // Cell state: 0 = empty, 1 = player (X), 2 = AI (O) self.state = 0; self.row = 0; self.col = 0; // Draw cell background (box) var cellBg = self.attachAsset('cellBg', { anchorX: 0.5, anchorY: 0.5 }); self.cellBg = cellBg; // X and O graphics (hidden by default) var xMark = self.attachAsset('xMark', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.xMark = xMark; var oMark = self.attachAsset('oMark', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.oMark = oMark; // Highlight overlay (for winning line) var highlight = self.attachAsset('highlight', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.highlight = highlight; // Set cell state and update graphics self.setState = function (state) { self.state = state; if (state === 1) { self.xMark.alpha = 1; self.oMark.alpha = 0; } else if (state === 2) { self.xMark.alpha = 0; self.oMark.alpha = 1; } else { self.xMark.alpha = 0; self.oMark.alpha = 0; } }; // Show highlight overlay self.showHighlight = function () { self.highlight.alpha = 0.5; }; // Hide highlight overlay self.hideHighlight = function () { self.highlight.alpha = 0; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Neon vertical grid line (thin, bright cyan) // Neon horizontal grid line (thin, bright cyan) // Neon grid background: large dark rectangle, grid lines will be drawn with additional assets below // --- Game Variables --- // --- Arcade Neon Grid Background --- // Add the dark arcade background var arcadeBg = LK.getAsset('arcadeBg', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(arcadeBg); // Add neon grid lines (2 vertical, 2 horizontal to make 3x3 grid) var gridLineThickness = 8; var gridColor = 0x00fff7; var gridLines = []; // Vertical lines (after each column except last) for (var i = 1; i < boardSize; i++) { var vLine = LK.getAsset('neonVLine', { anchorX: 0.5, anchorY: 0, x: boardOriginX + i * cellSize, y: boardOriginY, alpha: 0.7 }); game.addChild(vLine); gridLines.push(vLine); } // Horizontal lines (after each row except last) for (var i = 1; i < boardSize; i++) { var hLine = LK.getAsset('neonHLine', { anchorX: 0, anchorY: 0.5, x: boardOriginX, y: boardOriginY + i * cellSize, alpha: 0.7 }); game.addChild(hLine); gridLines.push(hLine); } // --- Asset Initialization --- // Cell background (light gray box) // X mark (red) // O mark (blue ellipse) // Highlight overlay (yellow, semi-transparent) var boardSize = 3; var cellSize = 480; // px (for 3x3 grid, fits well in 2048x2732) var board = []; // 2D array of BoardCell var boardState = []; // 2D array of 0 (empty), 1 (player), 2 (AI) var currentPlayer = 1; // 1 = player, 2 = AI var gameActive = true; var winningLine = null; // Array of [row, col] for winning cells // UI elements var statusText = null; var playAgainBtn = null; // --- Board Setup --- // Center the board var boardOriginX = Math.floor((2048 - cellSize * boardSize) / 2); var boardOriginY = Math.floor((2732 - cellSize * boardSize) / 2); // Create board cells for (var row = 0; row < boardSize; row++) { board[row] = []; boardState[row] = []; for (var col = 0; col < boardSize; col++) { var cell = new BoardCell(); cell.x = boardOriginX + col * cellSize + cellSize / 2; cell.y = boardOriginY + row * cellSize + cellSize / 2; cell.row = row; cell.col = col; cell.setState(0); cell.hideHighlight(); board[row][col] = cell; boardState[row][col] = 0; game.addChild(cell); // Cell tap handler cell.down = function (cellRef) { return function (x, y, obj) { if (!gameActive) return; if (currentPlayer !== 1) return; if (boardState[cellRef.row][cellRef.col] !== 0) return; playerMove(cellRef.row, cellRef.col); }; }(cell); } } // --- Status Text --- statusText = new Text2('Your turn', { size: 120, fill: 0x222222 }); statusText.anchor.set(0.5, 0); LK.gui.top.addChild(statusText); // --- Play Again Button --- playAgainBtn = new Text2('Play Again', { size: 100, fill: 0xFFFFFF }); playAgainBtn.anchor.set(0.5, 0.5); playAgainBtn.x = 2048 / 2; playAgainBtn.y = 2732 - 350; playAgainBtn.visible = false; playAgainBtn.bg = LK.getAsset('playAgainBg', { width: 600, height: 180, color: 0x2a6edb, anchorX: 0.5, anchorY: 0.5 }); playAgainBtn.bg.y = 0; playAgainBtn.bg.x = 0; playAgainBtn.addChild(playAgainBtn.bg); playAgainBtn.setChildIndex(playAgainBtn.bg, 0); game.addChild(playAgainBtn); // Play Again tap handler playAgainBtn.down = function (x, y, obj) { if (!gameActive) { resetGame(); } }; // --- Game Logic --- function playerMove(row, col) { if (!gameActive) return; if (boardState[row][col] !== 0) return; boardState[row][col] = 1; board[row][col].setState(1); currentPlayer = 2; updateStatus(); checkGameEnd(); if (gameActive) { LK.setTimeout(aiMove, 400); } } function aiMove() { if (!gameActive) return; // Find best move for AI (O) var move = findBestAIMove(); if (move) { boardState[move.row][move.col] = 2; board[move.row][move.col].setState(2); currentPlayer = 1; updateStatus(); checkGameEnd(); } } function updateStatus() { if (!gameActive) return; if (currentPlayer === 1) { statusText.setText('Your turn'); } else { statusText.setText('AI\'s turn'); } } function checkGameEnd() { var result = checkWinner(); if (result.winner) { gameActive = false; highlightWinningLine(result.line); if (result.winner === 1) { statusText.setText('You win!'); } else if (result.winner === 2) { statusText.setText('AI wins!'); } showPlayAgain(); } else if (isBoardFull()) { gameActive = false; statusText.setText('Draw!'); showPlayAgain(); } } function showPlayAgain() { playAgainBtn.visible = true; } function hidePlayAgain() { playAgainBtn.visible = false; } function resetGame() { // Reset board state for (var row = 0; row < boardSize; row++) { for (var col = 0; col < boardSize; col++) { boardState[row][col] = 0; board[row][col].setState(0); board[row][col].hideHighlight(); } } currentPlayer = 1; gameActive = true; winningLine = null; statusText.setText('Your turn'); hidePlayAgain(); } // --- AI Logic --- function findBestAIMove() { // 1. Win if possible for (var row = 0; row < boardSize; row++) { for (var col = 0; col < boardSize; col++) { if (boardState[row][col] === 0) { boardState[row][col] = 2; if (checkWinner().winner === 2) { boardState[row][col] = 0; return { row: row, col: col }; } boardState[row][col] = 0; } } } // 2. Block player win for (var row = 0; row < boardSize; row++) { for (var col = 0; col < boardSize; col++) { if (boardState[row][col] === 0) { boardState[row][col] = 1; if (checkWinner().winner === 1) { boardState[row][col] = 0; return { row: row, col: col }; } boardState[row][col] = 0; } } } // 3. Take center if available if (boardState[1][1] === 0) { return { row: 1, col: 1 }; } // 4. Take a corner if available var corners = [{ row: 0, col: 0 }, { row: 0, col: 2 }, { row: 2, col: 0 }, { row: 2, col: 2 }]; for (var i = 0; i < corners.length; i++) { var c = corners[i]; if (boardState[c.row][c.col] === 0) { return { row: c.row, col: c.col }; } } // 5. Take any side var sides = [{ row: 0, col: 1 }, { row: 1, col: 0 }, { row: 1, col: 2 }, { row: 2, col: 1 }]; for (var i = 0; i < sides.length; i++) { var s = sides[i]; if (boardState[s.row][s.col] === 0) { return { row: s.row, col: s.col }; } } // 6. No moves left return null; } // --- Win/Draw Detection --- function checkWinner() { // Rows, columns, diagonals for (var i = 0; i < boardSize; i++) { // Row if (boardState[i][0] !== 0 && boardState[i][0] === boardState[i][1] && boardState[i][1] === boardState[i][2]) { return { winner: boardState[i][0], line: [[i, 0], [i, 1], [i, 2]] }; } // Column if (boardState[0][i] !== 0 && boardState[0][i] === boardState[1][i] && boardState[1][i] === boardState[2][i]) { return { winner: boardState[0][i], line: [[0, i], [1, i], [2, i]] }; } } // Diagonal \ if (boardState[0][0] !== 0 && boardState[0][0] === boardState[1][1] && boardState[1][1] === boardState[2][2]) { return { winner: boardState[0][0], line: [[0, 0], [1, 1], [2, 2]] }; } // Diagonal / if (boardState[0][2] !== 0 && boardState[0][2] === boardState[1][1] && boardState[1][1] === boardState[2][0]) { return { winner: boardState[0][2], line: [[0, 2], [1, 1], [2, 0]] }; } return { winner: 0, line: null }; } function isBoardFull() { for (var row = 0; row < boardSize; row++) { for (var col = 0; col < boardSize; col++) { if (boardState[row][col] === 0) return false; } } return true; } function highlightWinningLine(line) { if (!line) return; for (var i = 0; i < line.length; i++) { var rc = line[i]; board[rc[0]][rc[1]].showHighlight(); } } // --- Prevent interaction in top-left 100x100 px (no cells are placed there) --- // --- No need for dragging or move handlers --- // --- No music, sound, or pause --- // --- No background beyond white --- // --- No keyboard controls --- // --- No dynamic resizing/orientation code --- // --- No leaderboard, game over, or win popups (handled by LK) --- // --- End of game code ---
===================================================================
--- original.js
+++ change.js
@@ -67,15 +67,55 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0xffffff
+ backgroundColor: 0x000000
});
/****
* Game Code
****/
-// --- Game Variables ---
+// Neon vertical grid line (thin, bright cyan)
+// Neon horizontal grid line (thin, bright cyan)
+// Neon grid background: large dark rectangle, grid lines will be drawn with additional assets below
+// --- Game Variables ---
+// --- Arcade Neon Grid Background ---
+// Add the dark arcade background
+var arcadeBg = LK.getAsset('arcadeBg', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+});
+game.addChild(arcadeBg);
+// Add neon grid lines (2 vertical, 2 horizontal to make 3x3 grid)
+var gridLineThickness = 8;
+var gridColor = 0x00fff7;
+var gridLines = [];
+// Vertical lines (after each column except last)
+for (var i = 1; i < boardSize; i++) {
+ var vLine = LK.getAsset('neonVLine', {
+ anchorX: 0.5,
+ anchorY: 0,
+ x: boardOriginX + i * cellSize,
+ y: boardOriginY,
+ alpha: 0.7
+ });
+ game.addChild(vLine);
+ gridLines.push(vLine);
+}
+// Horizontal lines (after each row except last)
+for (var i = 1; i < boardSize; i++) {
+ var hLine = LK.getAsset('neonHLine', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: boardOriginX,
+ y: boardOriginY + i * cellSize,
+ alpha: 0.7
+ });
+ game.addChild(hLine);
+ gridLines.push(hLine);
+}
// --- Asset Initialization ---
// Cell background (light gray box)
// X mark (red)
// O mark (blue ellipse)