/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Cell = Container.expand(function () {
var self = Container.call(this);
var cellBg = self.attachAsset('cell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
self.row = 0;
self.col = 0;
self.value = 0; // 0 = empty, 1 = X, 2 = O
self.marker = null;
self.highlight = function () {
tween(cellBg, {
alpha: 1
}, {
duration: 200
});
};
self.unhighlight = function () {
tween(cellBg, {
alpha: 0.8
}, {
duration: 200
});
};
self.setMarker = function (playerValue) {
if (self.value !== 0) {
return false;
}
self.value = playerValue;
if (playerValue === 1) {
self.marker = self.attachAsset('x_marker', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
} else {
self.marker = self.attachAsset('o_marker', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
}
tween(self.marker, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
return true;
};
self.reset = function () {
self.value = 0;
if (self.marker) {
tween(self.marker, {
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
if (self.marker) {
self.marker.destroy();
self.marker = null;
}
}
});
}
};
self.down = function (x, y, obj) {
if (gameState === STATE_PLAYER_TURN && self.value === 0) {
if (self.setMarker(currentPlayer)) {
LK.getSound('place').play();
checkGameState();
if (gameState === STATE_PLAYER_TURN) {
// Game continues, switch player
currentPlayer = currentPlayer === 1 ? 2 : 1;
updateTurnIndicator();
}
}
}
};
return self;
});
var WinLine = Container.expand(function () {
var self = Container.call(this);
var line = self.attachAsset('board_bg', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0,
tint: 0x00ff00
});
line.width = 800;
line.height = 20;
self.showLine = function (startX, startY, endX, endY) {
self.x = (startX + endX) / 2;
self.y = (startY + endY) / 2;
// Calculate rotation and length
var dx = endX - startX;
var dy = endY - startY;
var distance = Math.sqrt(dx * dx + dy * dy);
var angle = Math.atan2(dy, dx);
line.width = distance;
line.rotation = angle;
tween(line, {
alpha: 0.7
}, {
duration: 500
});
};
self.hide = function () {
tween(line, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x004488
});
/****
* Game Code
****/
// Game constants
var GRID_SIZE = 4;
var CELL_SIZE = 180;
var CELL_SPACING = 10;
var BOARD_SIZE = CELL_SIZE * GRID_SIZE + CELL_SPACING * (GRID_SIZE - 1);
// Game states
var STATE_PLAYER_TURN = 0;
var STATE_GAME_OVER = 1;
// Game variables
var gameBoard = [];
var gameState = STATE_PLAYER_TURN;
var currentPlayer = 1; // 1 = X, 2 = O
var winningCombos = [];
// GUI elements
var turnIndicator;
var gameOverText;
// Create board background
var boardBg = LK.getAsset('board_bg', {
anchorX: 0.5,
anchorY: 0.5,
width: BOARD_SIZE + 40,
height: BOARD_SIZE + 40
});
boardBg.x = 2048 / 2;
boardBg.y = 2732 / 2;
game.addChild(boardBg);
// Initialize turn indicator
turnIndicator = new Text2('X\'s Turn', {
size: 80,
fill: 0xFFFFFF
});
turnIndicator.anchor.set(0.5, 0);
LK.gui.top.addChild(turnIndicator);
turnIndicator.y = 100;
// Initialize game over text (hidden initially)
gameOverText = new Text2('', {
size: 100,
fill: 0xFFFFFF
});
gameOverText.anchor.set(0.5, 0.5);
gameOverText.visible = false;
LK.gui.center.addChild(gameOverText);
function initializeBoard() {
// Clear any existing board
if (gameBoard.length > 0) {
for (var i = 0; i < gameBoard.length; i++) {
for (var j = 0; j < gameBoard[i].length; j++) {
if (gameBoard[i][j]) {
gameBoard[i][j].destroy();
}
}
}
}
// Create new board
gameBoard = [];
var startX = 2048 / 2 - BOARD_SIZE / 2 + CELL_SIZE / 2;
var startY = 2732 / 2 - BOARD_SIZE / 2 + CELL_SIZE / 2;
for (var row = 0; row < GRID_SIZE; row++) {
gameBoard[row] = [];
for (var col = 0; col < GRID_SIZE; col++) {
var cell = new Cell();
cell.row = row;
cell.col = col;
cell.x = startX + col * (CELL_SIZE + CELL_SPACING);
cell.y = startY + row * (CELL_SIZE + CELL_SPACING);
gameBoard[row][col] = cell;
game.addChild(cell);
}
}
// Define winning combinations
defineWinningCombinations();
}
function defineWinningCombinations() {
winningCombos = [];
// Rows
for (var row = 0; row < GRID_SIZE; row++) {
winningCombos.push([{
row: row,
col: 0
}, {
row: row,
col: 1
}, {
row: row,
col: 2
}, {
row: row,
col: 3
}]);
}
// Columns
for (var col = 0; col < GRID_SIZE; col++) {
winningCombos.push([{
row: 0,
col: col
}, {
row: 1,
col: col
}, {
row: 2,
col: col
}, {
row: 3,
col: col
}]);
}
// Diagonals
winningCombos.push([{
row: 0,
col: 0
}, {
row: 1,
col: 1
}, {
row: 2,
col: 2
}, {
row: 3,
col: 3
}]);
winningCombos.push([{
row: 0,
col: 3
}, {
row: 1,
col: 2
}, {
row: 2,
col: 1
}, {
row: 3,
col: 0
}]);
}
function checkGameState() {
// Check for win
var winResult = checkForWin();
if (winResult) {
gameState = STATE_GAME_OVER;
showWinLine(winResult.combo);
updateGameOverText(currentPlayer === 1 ? "X Wins!" : "O Wins!");
LK.getSound('win').play();
LK.setScore(LK.getScore() + 1);
return;
}
// Check for draw
if (checkForDraw()) {
gameState = STATE_GAME_OVER;
updateGameOverText("Draw!");
LK.getSound('draw').play();
return;
}
}
function checkForWin() {
for (var i = 0; i < winningCombos.length; i++) {
var combo = winningCombos[i];
var first = gameBoard[combo[0].row][combo[0].col].value;
if (first !== 0) {
var isWin = true;
for (var j = 1; j < combo.length; j++) {
if (gameBoard[combo[j].row][combo[j].col].value !== first) {
isWin = false;
break;
}
}
if (isWin) {
return {
player: first,
combo: combo
};
}
}
}
return null;
}
function checkForDraw() {
for (var row = 0; row < GRID_SIZE; row++) {
for (var col = 0; col < GRID_SIZE; col++) {
if (gameBoard[row][col].value === 0) {
return false; // Still empty cells
}
}
}
return true;
}
function showWinLine(combo) {
var startCell = gameBoard[combo[0].row][combo[0].col];
var endCell = gameBoard[combo[combo.length - 1].row][combo[combo.length - 1].col];
var winLine = new WinLine();
game.addChild(winLine);
winLine.showLine(startCell.x, startCell.y, endCell.x, endCell.y);
}
function updateTurnIndicator() {
turnIndicator.setText(currentPlayer === 1 ? "X's Turn" : "O's Turn");
}
function updateGameOverText(text) {
gameOverText.setText(text);
gameOverText.visible = true;
// Show restart button after a delay
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
function restartGame() {
// Reset game state
gameState = STATE_PLAYER_TURN;
currentPlayer = 1;
// Reset board
for (var row = 0; row < GRID_SIZE; row++) {
for (var col = 0; col < GRID_SIZE; col++) {
gameBoard[row][col].reset();
}
}
// Update UI
updateTurnIndicator();
gameOverText.visible = false;
}
// Game setup
initializeBoard();
updateTurnIndicator();
// Play background music
LK.playMusic('bgmusic', {
loop: true,
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
// Game main loop
game.update = function () {
// This is called every frame
// No specific per-frame updates needed for this game
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,376 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Cell = Container.expand(function () {
+ var self = Container.call(this);
+ var cellBg = self.attachAsset('cell', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ });
+ self.row = 0;
+ self.col = 0;
+ self.value = 0; // 0 = empty, 1 = X, 2 = O
+ self.marker = null;
+ self.highlight = function () {
+ tween(cellBg, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ };
+ self.unhighlight = function () {
+ tween(cellBg, {
+ alpha: 0.8
+ }, {
+ duration: 200
+ });
+ };
+ self.setMarker = function (playerValue) {
+ if (self.value !== 0) {
+ return false;
+ }
+ self.value = playerValue;
+ if (playerValue === 1) {
+ self.marker = self.attachAsset('x_marker', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ } else {
+ self.marker = self.attachAsset('o_marker', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ }
+ tween(self.marker, {
+ alpha: 1,
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ return true;
+ };
+ self.reset = function () {
+ self.value = 0;
+ if (self.marker) {
+ tween(self.marker, {
+ alpha: 0
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ if (self.marker) {
+ self.marker.destroy();
+ self.marker = null;
+ }
+ }
+ });
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (gameState === STATE_PLAYER_TURN && self.value === 0) {
+ if (self.setMarker(currentPlayer)) {
+ LK.getSound('place').play();
+ checkGameState();
+ if (gameState === STATE_PLAYER_TURN) {
+ // Game continues, switch player
+ currentPlayer = currentPlayer === 1 ? 2 : 1;
+ updateTurnIndicator();
+ }
+ }
+ }
+ };
+ return self;
+});
+var WinLine = Container.expand(function () {
+ var self = Container.call(this);
+ var line = self.attachAsset('board_bg', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0,
+ tint: 0x00ff00
+ });
+ line.width = 800;
+ line.height = 20;
+ self.showLine = function (startX, startY, endX, endY) {
+ self.x = (startX + endX) / 2;
+ self.y = (startY + endY) / 2;
+ // Calculate rotation and length
+ var dx = endX - startX;
+ var dy = endY - startY;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ var angle = Math.atan2(dy, dx);
+ line.width = distance;
+ line.rotation = angle;
+ tween(line, {
+ alpha: 0.7
+ }, {
+ duration: 500
+ });
+ };
+ self.hide = function () {
+ tween(line, {
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x004488
+});
+
+/****
+* Game Code
+****/
+// Game constants
+var GRID_SIZE = 4;
+var CELL_SIZE = 180;
+var CELL_SPACING = 10;
+var BOARD_SIZE = CELL_SIZE * GRID_SIZE + CELL_SPACING * (GRID_SIZE - 1);
+// Game states
+var STATE_PLAYER_TURN = 0;
+var STATE_GAME_OVER = 1;
+// Game variables
+var gameBoard = [];
+var gameState = STATE_PLAYER_TURN;
+var currentPlayer = 1; // 1 = X, 2 = O
+var winningCombos = [];
+// GUI elements
+var turnIndicator;
+var gameOverText;
+// Create board background
+var boardBg = LK.getAsset('board_bg', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ width: BOARD_SIZE + 40,
+ height: BOARD_SIZE + 40
+});
+boardBg.x = 2048 / 2;
+boardBg.y = 2732 / 2;
+game.addChild(boardBg);
+// Initialize turn indicator
+turnIndicator = new Text2('X\'s Turn', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+turnIndicator.anchor.set(0.5, 0);
+LK.gui.top.addChild(turnIndicator);
+turnIndicator.y = 100;
+// Initialize game over text (hidden initially)
+gameOverText = new Text2('', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+gameOverText.anchor.set(0.5, 0.5);
+gameOverText.visible = false;
+LK.gui.center.addChild(gameOverText);
+function initializeBoard() {
+ // Clear any existing board
+ if (gameBoard.length > 0) {
+ for (var i = 0; i < gameBoard.length; i++) {
+ for (var j = 0; j < gameBoard[i].length; j++) {
+ if (gameBoard[i][j]) {
+ gameBoard[i][j].destroy();
+ }
+ }
+ }
+ }
+ // Create new board
+ gameBoard = [];
+ var startX = 2048 / 2 - BOARD_SIZE / 2 + CELL_SIZE / 2;
+ var startY = 2732 / 2 - BOARD_SIZE / 2 + CELL_SIZE / 2;
+ for (var row = 0; row < GRID_SIZE; row++) {
+ gameBoard[row] = [];
+ for (var col = 0; col < GRID_SIZE; col++) {
+ var cell = new Cell();
+ cell.row = row;
+ cell.col = col;
+ cell.x = startX + col * (CELL_SIZE + CELL_SPACING);
+ cell.y = startY + row * (CELL_SIZE + CELL_SPACING);
+ gameBoard[row][col] = cell;
+ game.addChild(cell);
+ }
+ }
+ // Define winning combinations
+ defineWinningCombinations();
+}
+function defineWinningCombinations() {
+ winningCombos = [];
+ // Rows
+ for (var row = 0; row < GRID_SIZE; row++) {
+ winningCombos.push([{
+ row: row,
+ col: 0
+ }, {
+ row: row,
+ col: 1
+ }, {
+ row: row,
+ col: 2
+ }, {
+ row: row,
+ col: 3
+ }]);
+ }
+ // Columns
+ for (var col = 0; col < GRID_SIZE; col++) {
+ winningCombos.push([{
+ row: 0,
+ col: col
+ }, {
+ row: 1,
+ col: col
+ }, {
+ row: 2,
+ col: col
+ }, {
+ row: 3,
+ col: col
+ }]);
+ }
+ // Diagonals
+ winningCombos.push([{
+ row: 0,
+ col: 0
+ }, {
+ row: 1,
+ col: 1
+ }, {
+ row: 2,
+ col: 2
+ }, {
+ row: 3,
+ col: 3
+ }]);
+ winningCombos.push([{
+ row: 0,
+ col: 3
+ }, {
+ row: 1,
+ col: 2
+ }, {
+ row: 2,
+ col: 1
+ }, {
+ row: 3,
+ col: 0
+ }]);
+}
+function checkGameState() {
+ // Check for win
+ var winResult = checkForWin();
+ if (winResult) {
+ gameState = STATE_GAME_OVER;
+ showWinLine(winResult.combo);
+ updateGameOverText(currentPlayer === 1 ? "X Wins!" : "O Wins!");
+ LK.getSound('win').play();
+ LK.setScore(LK.getScore() + 1);
+ return;
+ }
+ // Check for draw
+ if (checkForDraw()) {
+ gameState = STATE_GAME_OVER;
+ updateGameOverText("Draw!");
+ LK.getSound('draw').play();
+ return;
+ }
+}
+function checkForWin() {
+ for (var i = 0; i < winningCombos.length; i++) {
+ var combo = winningCombos[i];
+ var first = gameBoard[combo[0].row][combo[0].col].value;
+ if (first !== 0) {
+ var isWin = true;
+ for (var j = 1; j < combo.length; j++) {
+ if (gameBoard[combo[j].row][combo[j].col].value !== first) {
+ isWin = false;
+ break;
+ }
+ }
+ if (isWin) {
+ return {
+ player: first,
+ combo: combo
+ };
+ }
+ }
+ }
+ return null;
+}
+function checkForDraw() {
+ for (var row = 0; row < GRID_SIZE; row++) {
+ for (var col = 0; col < GRID_SIZE; col++) {
+ if (gameBoard[row][col].value === 0) {
+ return false; // Still empty cells
+ }
+ }
+ }
+ return true;
+}
+function showWinLine(combo) {
+ var startCell = gameBoard[combo[0].row][combo[0].col];
+ var endCell = gameBoard[combo[combo.length - 1].row][combo[combo.length - 1].col];
+ var winLine = new WinLine();
+ game.addChild(winLine);
+ winLine.showLine(startCell.x, startCell.y, endCell.x, endCell.y);
+}
+function updateTurnIndicator() {
+ turnIndicator.setText(currentPlayer === 1 ? "X's Turn" : "O's Turn");
+}
+function updateGameOverText(text) {
+ gameOverText.setText(text);
+ gameOverText.visible = true;
+ // Show restart button after a delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 2000);
+}
+function restartGame() {
+ // Reset game state
+ gameState = STATE_PLAYER_TURN;
+ currentPlayer = 1;
+ // Reset board
+ for (var row = 0; row < GRID_SIZE; row++) {
+ for (var col = 0; col < GRID_SIZE; col++) {
+ gameBoard[row][col].reset();
+ }
+ }
+ // Update UI
+ updateTurnIndicator();
+ gameOverText.visible = false;
+}
+// Game setup
+initializeBoard();
+updateTurnIndicator();
+// Play background music
+LK.playMusic('bgmusic', {
+ loop: true,
+ fade: {
+ start: 0,
+ end: 0.3,
+ duration: 1000
+ }
+});
+// Game main loop
+game.update = function () {
+ // This is called every frame
+ // No specific per-frame updates needed for this game
+};
\ No newline at end of file