User prompt
Fix bugs
User prompt
- Players receive a random colored block to place on a 7x9 grid. - Drag and drop the block onto any empty cell. - When three or more adjacent blocks of the same color connect, they merge into a new color and clear, scoring points. - Merges can trigger chain reactions for bonus points. - The game ends when the grid is full and no moves remain. - Aim for high scores by planning merges and creating cascades.
User prompt
Can not see the game, fix it
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of null (reading 'grid')' in or related to this line: 'var bdata = prevState.grid[c] && prevState.grid[c][r] ? prevState.grid[c][r] : null;' Line Number: 252
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of null (reading 'grid')' in or related to this line: 'var bdata = prevState.grid[c][r];' Line Number: 249
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Fix the game
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 210
User prompt
Reset game codes to its functional
User prompt
Fix errors
User prompt
Undo deleted asset
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 209
User prompt
Please fix the bug: 'Uncaught ReferenceError: copyNextBlocksState is not defined' in or related to this line: 'return arr;' Line Number: 209
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Block = Container.expand(function (color) { var self = Container.call(this); self.color = color || 'red'; self.gridX = -1; self.gridY = -1; self.isEmpty = false; // Color mapping var colorAssets = { 'red': 'face_red', 'blue': 'face_blue', 'green': 'face_green', 'yellow': 'face_yellow', 'white': 'face_white', 'rainbow': 'face_rainbow' }; var assetName = colorAssets[self.color] || 'face_red'; var blockGraphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.setColor = function (newColor) { self.color = newColor; self.removeChild(blockGraphics); var newAssetName = colorAssets[newColor] || 'face_red'; blockGraphics = self.attachAsset(newAssetName, { anchorX: 0.5, anchorY: 0.5 }); }; return self; }); var Grid = Container.expand(function () { var self = Container.call(this); self.gridWidth = 7; self.gridHeight = 9; self.cellSize = 80; self.cells = []; // Initialize empty grid for (var y = 0; y < self.gridHeight; y++) { self.cells[y] = []; for (var x = 0; x < self.gridWidth; x++) { self.cells[y][x] = null; } } // Draw grid background for (var y = 0; y < self.gridHeight; y++) { for (var x = 0; x < self.gridWidth; x++) { var cell = self.attachAsset('block_gray', { anchorX: 0.5, anchorY: 0.5, x: x * self.cellSize, y: y * self.cellSize, alpha: 0.3 }); } } self.isValidPosition = function (gridX, gridY) { return gridX >= 0 && gridX < self.gridWidth && gridY >= 0 && gridY < self.gridHeight; }; self.isEmpty = function (gridX, gridY) { if (!self.isValidPosition(gridX, gridY)) return false; return self.cells[gridY][gridX] === null; }; self.placeBlock = function (block, gridX, gridY) { if (!self.isEmpty(gridX, gridY)) return false; self.cells[gridY][gridX] = block; block.gridX = gridX; block.gridY = gridY; block.x = gridX * self.cellSize; block.y = gridY * self.cellSize; return true; }; self.removeBlock = function (gridX, gridY) { if (!self.isValidPosition(gridX, gridY)) return null; var block = self.cells[gridY][gridX]; if (block) { self.cells[gridY][gridX] = null; block.gridX = -1; block.gridY = -1; } return block; }; self.getBlock = function (gridX, gridY) { if (!self.isValidPosition(gridX, gridY)) return null; return self.cells[gridY][gridX]; }; self.worldToGrid = function (worldX, worldY) { var localPos = self.toLocal({ x: worldX, y: worldY }); var gridX = Math.floor((localPos.x + self.cellSize / 2) / self.cellSize); var gridY = Math.floor((localPos.y + self.cellSize / 2) / self.cellSize); return { x: gridX, y: gridY }; }; self.findConnectedBlocks = function (startX, startY, color, visited) { if (!visited) visited = []; var block = self.getBlock(startX, startY); if (!block || block.color !== color) return []; var key = startX + ',' + startY; if (visited.indexOf(key) !== -1) return []; visited.push(key); var connected = [{ x: startX, y: startY }]; // Check 4 directions var directions = [{ x: 0, y: -1 }, { x: 1, y: 0 }, { x: 0, y: 1 }, { x: -1, y: 0 }]; for (var i = 0; i < directions.length; i++) { var dir = directions[i]; var newX = startX + dir.x; var newY = startY + dir.y; var moreConnected = self.findConnectedBlocks(newX, newY, color, visited); connected = connected.concat(moreConnected); } return connected; }; self.checkForMerges = function () { var toMerge = []; var processed = []; for (var y = 0; y < self.gridHeight; y++) { for (var x = 0; x < self.gridWidth; x++) { var key = x + ',' + y; if (processed.indexOf(key) !== -1) continue; var block = self.getBlock(x, y); if (!block) continue; var connected = self.findConnectedBlocks(x, y, block.color, []); for (var i = 0; i < connected.length; i++) { var pos = connected[i]; processed.push(pos.x + ',' + pos.y); } if (connected.length >= 3) { toMerge.push(connected); } } } return toMerge; }; self.performMerges = function (mergeGroups) { var totalScore = 0; for (var i = 0; i < mergeGroups.length; i++) { var group = mergeGroups[i]; var score = group.length * 10; totalScore += score; // Find center position for new block var centerX = 0, centerY = 0; for (var j = 0; j < group.length; j++) { centerX += group[j].x; centerY += group[j].y; } centerX = Math.floor(centerX / group.length); centerY = Math.floor(centerY / group.length); // Remove all blocks in group for (var j = 0; j < group.length; j++) { var pos = group[j]; var block = self.removeBlock(pos.x, pos.y); if (block) { block.destroy(); } } // Create new block with next color var firstBlock = self.getBlock(group[0].x, group[0].y); var currentColor = firstBlock ? firstBlock.color : 'red'; var nextColor = self.getNextColor(currentColor); if (self.isEmpty(centerX, centerY)) { var newBlock = new Block(nextColor); game.addChild(newBlock); self.placeBlock(newBlock, centerX, centerY); } } return totalScore; }; self.getNextColor = function (color) { var colorSequence = ['red', 'blue', 'green', 'yellow', 'white', 'rainbow']; var index = colorSequence.indexOf(color); if (index === -1 || index === colorSequence.length - 1) { return 'red'; } return colorSequence[index + 1]; }; self.isFull = function () { for (var y = 0; y < self.gridHeight; y++) { for (var x = 0; x < self.gridWidth; x++) { if (self.isEmpty(x, y)) return false; } } return true; }; return self; }); /**** * Initialize Game ****/ // Game state variables var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game state variables var gameGrid; var currentBlock; var draggedBlock = null; var colors = ['red', 'blue', 'green', 'yellow']; var isProcessingMerges = false; // UI elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var nextBlockTxt = new Text2('Next Block:', { size: 40, fill: 0xFFFFFF }); nextBlockTxt.anchor.set(0, 0); nextBlockTxt.x = 50; nextBlockTxt.y = 150; LK.gui.topLeft.addChild(nextBlockTxt); // Initialize grid gameGrid = new Grid(); gameGrid.x = (2048 - (gameGrid.gridWidth - 1) * gameGrid.cellSize) / 2; gameGrid.y = (2732 - (gameGrid.gridHeight - 1) * gameGrid.cellSize) / 2; game.addChild(gameGrid); // Create first block function createNewBlock() { if (currentBlock) { currentBlock.destroy(); } var randomColor = colors[Math.floor(Math.random() * colors.length)]; currentBlock = new Block(randomColor); currentBlock.x = 2048 / 2; currentBlock.y = 150; game.addChild(currentBlock); // Check if game is over if (gameGrid.isFull()) { LK.showGameOver(); } } // Game input handling game.down = function (x, y, obj) { if (isProcessingMerges) return; if (currentBlock && currentBlock.intersects({ x: x, y: y, width: 1, height: 1 })) { draggedBlock = currentBlock; } }; game.move = function (x, y, obj) { if (draggedBlock && !isProcessingMerges) { draggedBlock.x = x; draggedBlock.y = y; } }; game.up = function (x, y, obj) { if (draggedBlock && !isProcessingMerges) { var gridPos = gameGrid.worldToGrid(x, y); if (gameGrid.isEmpty(gridPos.x, gridPos.y)) { // Place block on grid if (gameGrid.placeBlock(draggedBlock, gridPos.x, gridPos.y)) { draggedBlock = null; currentBlock = null; // Check for merges processMerges(); } else { // Return block to original position draggedBlock.x = 2048 / 2; draggedBlock.y = 150; } } else { // Return block to original position draggedBlock.x = 2048 / 2; draggedBlock.y = 150; } } draggedBlock = null; }; function processMerges() { isProcessingMerges = true; function checkMerges() { var mergeGroups = gameGrid.checkForMerges(); if (mergeGroups.length > 0) { var score = gameGrid.performMerges(mergeGroups); LK.setScore(LK.getScore() + score); scoreTxt.setText('Score: ' + LK.getScore()); // Flash screen for satisfying feedback LK.effects.flashScreen(0x00ff00, 300); // Check for more merges after a short delay LK.setTimeout(checkMerges, 500); } else { // No more merges, create new block isProcessingMerges = false; createNewBlock(); } } checkMerges(); } // Update score display scoreTxt.setText('Score: ' + LK.getScore()); // Create initial block createNewBlock();
===================================================================
--- original.js
+++ change.js
@@ -1,275 +1,332 @@
/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
* Classes
****/
-// --- Block Class ---
-var Block = Container.expand(function () {
+var Block = Container.expand(function (color) {
var self = Container.call(this);
- self.colorId = null;
- self.gridX = null;
- self.gridY = null;
- self.setColor = function (colorId) {
- self.colorId = colorId;
- if (self.asset) self.removeChild(self.asset);
- self.asset = self.attachAsset(colorId, {
+ self.color = color || 'red';
+ self.gridX = -1;
+ self.gridY = -1;
+ self.isEmpty = false;
+ // Color mapping
+ var colorAssets = {
+ 'red': 'face_red',
+ 'blue': 'face_blue',
+ 'green': 'face_green',
+ 'yellow': 'face_yellow',
+ 'white': 'face_white',
+ 'rainbow': 'face_rainbow'
+ };
+ var assetName = colorAssets[self.color] || 'face_red';
+ var blockGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.setColor = function (newColor) {
+ self.color = newColor;
+ self.removeChild(blockGraphics);
+ var newAssetName = colorAssets[newColor] || 'face_red';
+ blockGraphics = self.attachAsset(newAssetName, {
anchorX: 0.5,
anchorY: 0.5
});
- self.asset.width = CELL_SIZE;
- self.asset.height = CELL_SIZE;
};
- self.setGridPos = function (gx, gy) {
- self.gridX = gx;
- self.gridY = gy;
- self.x = GRID_OFFSET_X + gx * CELL_SIZE + CELL_SIZE / 2;
- self.y = GRID_OFFSET_Y + gy * CELL_SIZE + CELL_SIZE / 2;
+ return self;
+});
+var Grid = Container.expand(function () {
+ var self = Container.call(this);
+ self.gridWidth = 7;
+ self.gridHeight = 9;
+ self.cellSize = 80;
+ self.cells = [];
+ // Initialize empty grid
+ for (var y = 0; y < self.gridHeight; y++) {
+ self.cells[y] = [];
+ for (var x = 0; x < self.gridWidth; x++) {
+ self.cells[y][x] = null;
+ }
+ }
+ // Draw grid background
+ for (var y = 0; y < self.gridHeight; y++) {
+ for (var x = 0; x < self.gridWidth; x++) {
+ var cell = self.attachAsset('block_gray', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: x * self.cellSize,
+ y: y * self.cellSize,
+ alpha: 0.3
+ });
+ }
+ }
+ self.isValidPosition = function (gridX, gridY) {
+ return gridX >= 0 && gridX < self.gridWidth && gridY >= 0 && gridY < self.gridHeight;
};
+ self.isEmpty = function (gridX, gridY) {
+ if (!self.isValidPosition(gridX, gridY)) return false;
+ return self.cells[gridY][gridX] === null;
+ };
+ self.placeBlock = function (block, gridX, gridY) {
+ if (!self.isEmpty(gridX, gridY)) return false;
+ self.cells[gridY][gridX] = block;
+ block.gridX = gridX;
+ block.gridY = gridY;
+ block.x = gridX * self.cellSize;
+ block.y = gridY * self.cellSize;
+ return true;
+ };
+ self.removeBlock = function (gridX, gridY) {
+ if (!self.isValidPosition(gridX, gridY)) return null;
+ var block = self.cells[gridY][gridX];
+ if (block) {
+ self.cells[gridY][gridX] = null;
+ block.gridX = -1;
+ block.gridY = -1;
+ }
+ return block;
+ };
+ self.getBlock = function (gridX, gridY) {
+ if (!self.isValidPosition(gridX, gridY)) return null;
+ return self.cells[gridY][gridX];
+ };
+ self.worldToGrid = function (worldX, worldY) {
+ var localPos = self.toLocal({
+ x: worldX,
+ y: worldY
+ });
+ var gridX = Math.floor((localPos.x + self.cellSize / 2) / self.cellSize);
+ var gridY = Math.floor((localPos.y + self.cellSize / 2) / self.cellSize);
+ return {
+ x: gridX,
+ y: gridY
+ };
+ };
+ self.findConnectedBlocks = function (startX, startY, color, visited) {
+ if (!visited) visited = [];
+ var block = self.getBlock(startX, startY);
+ if (!block || block.color !== color) return [];
+ var key = startX + ',' + startY;
+ if (visited.indexOf(key) !== -1) return [];
+ visited.push(key);
+ var connected = [{
+ x: startX,
+ y: startY
+ }];
+ // Check 4 directions
+ var directions = [{
+ x: 0,
+ y: -1
+ }, {
+ x: 1,
+ y: 0
+ }, {
+ x: 0,
+ y: 1
+ }, {
+ x: -1,
+ y: 0
+ }];
+ for (var i = 0; i < directions.length; i++) {
+ var dir = directions[i];
+ var newX = startX + dir.x;
+ var newY = startY + dir.y;
+ var moreConnected = self.findConnectedBlocks(newX, newY, color, visited);
+ connected = connected.concat(moreConnected);
+ }
+ return connected;
+ };
+ self.checkForMerges = function () {
+ var toMerge = [];
+ var processed = [];
+ for (var y = 0; y < self.gridHeight; y++) {
+ for (var x = 0; x < self.gridWidth; x++) {
+ var key = x + ',' + y;
+ if (processed.indexOf(key) !== -1) continue;
+ var block = self.getBlock(x, y);
+ if (!block) continue;
+ var connected = self.findConnectedBlocks(x, y, block.color, []);
+ for (var i = 0; i < connected.length; i++) {
+ var pos = connected[i];
+ processed.push(pos.x + ',' + pos.y);
+ }
+ if (connected.length >= 3) {
+ toMerge.push(connected);
+ }
+ }
+ }
+ return toMerge;
+ };
+ self.performMerges = function (mergeGroups) {
+ var totalScore = 0;
+ for (var i = 0; i < mergeGroups.length; i++) {
+ var group = mergeGroups[i];
+ var score = group.length * 10;
+ totalScore += score;
+ // Find center position for new block
+ var centerX = 0,
+ centerY = 0;
+ for (var j = 0; j < group.length; j++) {
+ centerX += group[j].x;
+ centerY += group[j].y;
+ }
+ centerX = Math.floor(centerX / group.length);
+ centerY = Math.floor(centerY / group.length);
+ // Remove all blocks in group
+ for (var j = 0; j < group.length; j++) {
+ var pos = group[j];
+ var block = self.removeBlock(pos.x, pos.y);
+ if (block) {
+ block.destroy();
+ }
+ }
+ // Create new block with next color
+ var firstBlock = self.getBlock(group[0].x, group[0].y);
+ var currentColor = firstBlock ? firstBlock.color : 'red';
+ var nextColor = self.getNextColor(currentColor);
+ if (self.isEmpty(centerX, centerY)) {
+ var newBlock = new Block(nextColor);
+ game.addChild(newBlock);
+ self.placeBlock(newBlock, centerX, centerY);
+ }
+ }
+ return totalScore;
+ };
+ self.getNextColor = function (color) {
+ var colorSequence = ['red', 'blue', 'green', 'yellow', 'white', 'rainbow'];
+ var index = colorSequence.indexOf(color);
+ if (index === -1 || index === colorSequence.length - 1) {
+ return 'red';
+ }
+ return colorSequence[index + 1];
+ };
+ self.isFull = function () {
+ for (var y = 0; y < self.gridHeight; y++) {
+ for (var x = 0; x < self.gridWidth; x++) {
+ if (self.isEmpty(x, y)) return false;
+ }
+ }
+ return true;
+ };
return self;
});
/****
* Initialize Game
****/
-// --- Draw Board Background ---
+// Game state variables
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
-// --- Game Constants ---
-var GRID_COLS = 7;
-var GRID_ROWS = 9;
-var CELL_SIZE = 200; // Each block is 200x200 px as per asset size
-var GRID_OFFSET_X = Math.floor((2048 - GRID_COLS * CELL_SIZE) / 2);
-var GRID_OFFSET_Y = Math.floor((2732 - GRID_ROWS * CELL_SIZE) / 2);
-var COLORS = [{
- id: 'face_red',
- next: 'face_yellow',
- points: 10
-}, {
- id: 'face_yellow',
- next: 'face_green',
- points: 20
-}, {
- id: 'face_green',
- next: 'face_blue',
- points: 30
-}, {
- id: 'face_blue',
- next: 'face_rainbow',
- points: 40
-}, {
- id: 'face_rainbow',
- next: null,
- points: 100
-}];
-// --- Game State ---
-var grid = [];
-for (var y = 0; y < GRID_ROWS; y++) {
- grid[y] = [];
- for (var x = 0; x < GRID_COLS; x++) {
- grid[y][x] = null;
- }
-}
-var currentBlock = null;
-var dragging = false;
-var dragSprite = null;
-var dragGridX = null;
-var dragGridY = null;
-var scoreText = null;
-// --- Helper Functions ---
-function getRandomColor() {
- var idx = Math.floor(Math.random() * 4); // Only up to face_blue for random
- return COLORS[idx].id;
-}
-function getColorData(id) {
- for (var i = 0; i < COLORS.length; i++) {
- if (COLORS[i].id === id) return COLORS[i];
- }
- return null;
-}
-function isInsideGrid(x, y) {
- return x >= 0 && x < GRID_COLS && y >= 0 && y < GRID_ROWS;
-}
-function getNeighbors(x, y) {
- var n = [];
- if (isInsideGrid(x - 1, y)) n.push({
- x: x - 1,
- y: y
- });
- if (isInsideGrid(x + 1, y)) n.push({
- x: x + 1,
- y: y
- });
- if (isInsideGrid(x, y - 1)) n.push({
- x: x,
- y: y - 1
- });
- if (isInsideGrid(x, y + 1)) n.push({
- x: x,
- y: y + 1
- });
- return n;
-}
-function findCluster(x, y, colorId, visited) {
- if (!isInsideGrid(x, y)) return [];
- if (visited[y * GRID_COLS + x]) return [];
- var block = grid[y][x];
- if (!block || block.colorId !== colorId) return [];
- visited[y * GRID_COLS + x] = true;
- var cluster = [{
- x: x,
- y: y
- }];
- var neighbors = getNeighbors(x, y);
- for (var i = 0; i < neighbors.length; i++) {
- var nx = neighbors[i].x,
- ny = neighbors[i].y;
- cluster = cluster.concat(findCluster(nx, ny, colorId, visited));
- }
- return cluster;
-}
-function clearBlock(x, y) {
- if (grid[y][x]) {
- grid[y][x].destroy();
- grid[y][x] = null;
- }
-}
-function updateScoreText() {
- if (scoreText) scoreText.setText(LK.getScore());
-}
-// --- Draw Board Background ---
-for (var y = 0; y < GRID_ROWS; y++) {
- for (var x = 0; x < GRID_COLS; x++) {
- var bg = LK.getAsset('block_gray', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- bg.width = CELL_SIZE;
- bg.height = CELL_SIZE;
- bg.x = GRID_OFFSET_X + x * CELL_SIZE + CELL_SIZE / 2;
- bg.y = GRID_OFFSET_Y + y * CELL_SIZE + CELL_SIZE / 2;
- game.addChild(bg);
- }
-}
-// --- Score Display ---
-scoreText = new Text2('0', {
- size: 120,
+// Game state variables
+var gameGrid;
+var currentBlock;
+var draggedBlock = null;
+var colors = ['red', 'blue', 'green', 'yellow'];
+var isProcessingMerges = false;
+// UI elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
fill: 0xFFFFFF
});
-scoreText.anchor.set(0.5, 0);
-LK.gui.top.addChild(scoreText);
-updateScoreText();
-// --- Spawn New Block ---
-function spawnBlock() {
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var nextBlockTxt = new Text2('Next Block:', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+nextBlockTxt.anchor.set(0, 0);
+nextBlockTxt.x = 50;
+nextBlockTxt.y = 150;
+LK.gui.topLeft.addChild(nextBlockTxt);
+// Initialize grid
+gameGrid = new Grid();
+gameGrid.x = (2048 - (gameGrid.gridWidth - 1) * gameGrid.cellSize) / 2;
+gameGrid.y = (2732 - (gameGrid.gridHeight - 1) * gameGrid.cellSize) / 2;
+game.addChild(gameGrid);
+// Create first block
+function createNewBlock() {
if (currentBlock) {
currentBlock.destroy();
- currentBlock = null;
}
- var colorId = getRandomColor();
- currentBlock = new Block();
- currentBlock.setColor(colorId);
+ var randomColor = colors[Math.floor(Math.random() * colors.length)];
+ currentBlock = new Block(randomColor);
currentBlock.x = 2048 / 2;
- currentBlock.y = 300;
- currentBlock.asset.width = CELL_SIZE;
- currentBlock.asset.height = CELL_SIZE;
+ currentBlock.y = 150;
game.addChild(currentBlock);
- dragging = false;
- dragSprite = null;
- dragGridX = null;
- dragGridY = null;
+ // Check if game is over
+ if (gameGrid.isFull()) {
+ LK.showGameOver();
+ }
}
-spawnBlock();
-// --- Drag and Drop Handlers ---
+// Game input handling
game.down = function (x, y, obj) {
- if (!currentBlock) return;
- // Only start drag if touch is on the current block
- var dx = x - currentBlock.x;
- var dy = y - currentBlock.y;
- if (Math.abs(dx) < CELL_SIZE / 2 && Math.abs(dy) < CELL_SIZE / 2) {
- dragging = true;
- dragSprite = currentBlock;
+ if (isProcessingMerges) return;
+ if (currentBlock && currentBlock.intersects({
+ x: x,
+ y: y,
+ width: 1,
+ height: 1
+ })) {
+ draggedBlock = currentBlock;
}
};
game.move = function (x, y, obj) {
- if (!dragging || !dragSprite) return;
- // Snap to nearest grid cell
- var gx = Math.floor((x - GRID_OFFSET_X) / CELL_SIZE);
- var gy = Math.floor((y - GRID_OFFSET_Y) / CELL_SIZE);
- if (isInsideGrid(gx, gy)) {
- dragSprite.x = GRID_OFFSET_X + gx * CELL_SIZE + CELL_SIZE / 2;
- dragSprite.y = GRID_OFFSET_Y + gy * CELL_SIZE + CELL_SIZE / 2;
- dragGridX = gx;
- dragGridY = gy;
- } else {
- // Follow finger
- dragSprite.x = x;
- dragSprite.y = y;
- dragGridX = null;
- dragGridY = null;
+ if (draggedBlock && !isProcessingMerges) {
+ draggedBlock.x = x;
+ draggedBlock.y = y;
}
};
game.up = function (x, y, obj) {
- if (!dragging || !dragSprite) return;
- if (dragGridX !== null && dragGridY !== null && !grid[dragGridY][dragGridX]) {
- // Place block
- dragSprite.setGridPos(dragGridX, dragGridY);
- grid[dragGridY][dragGridX] = dragSprite;
- // Check for merges
- handleMerge(dragGridX, dragGridY);
- // Check for game over
- if (isBoardFull()) {
- LK.showGameOver();
- return;
+ if (draggedBlock && !isProcessingMerges) {
+ var gridPos = gameGrid.worldToGrid(x, y);
+ if (gameGrid.isEmpty(gridPos.x, gridPos.y)) {
+ // Place block on grid
+ if (gameGrid.placeBlock(draggedBlock, gridPos.x, gridPos.y)) {
+ draggedBlock = null;
+ currentBlock = null;
+ // Check for merges
+ processMerges();
+ } else {
+ // Return block to original position
+ draggedBlock.x = 2048 / 2;
+ draggedBlock.y = 150;
+ }
+ } else {
+ // Return block to original position
+ draggedBlock.x = 2048 / 2;
+ draggedBlock.y = 150;
}
- spawnBlock();
- } else {
- // Return to top
- dragSprite.x = 2048 / 2;
- dragSprite.y = 300;
}
- dragging = false;
- dragSprite = null;
- dragGridX = null;
- dragGridY = null;
+ draggedBlock = null;
};
-// --- Merge Logic ---
-function handleMerge(gx, gy) {
- var block = grid[gy][gx];
- if (!block) return;
- var colorId = block.colorId;
- var visited = [];
- var cluster = findCluster(gx, gy, colorId, visited);
- if (cluster.length >= 3) {
- // Merge!
- var colorData = getColorData(colorId);
- var nextColor = colorData.next;
- var points = colorData.points * cluster.length;
- // Remove all blocks in cluster
- for (var i = 0; i < cluster.length; i++) {
- var cx = cluster[i].x,
- cy = cluster[i].y;
- if (cx !== gx || cy !== gy) clearBlock(cx, cy);
+function processMerges() {
+ isProcessingMerges = true;
+ function checkMerges() {
+ var mergeGroups = gameGrid.checkForMerges();
+ if (mergeGroups.length > 0) {
+ var score = gameGrid.performMerges(mergeGroups);
+ LK.setScore(LK.getScore() + score);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Flash screen for satisfying feedback
+ LK.effects.flashScreen(0x00ff00, 300);
+ // Check for more merges after a short delay
+ LK.setTimeout(checkMerges, 500);
+ } else {
+ // No more merges, create new block
+ isProcessingMerges = false;
+ createNewBlock();
}
- // Upgrade main block
- if (nextColor) {
- block.setColor(nextColor);
- }
- LK.setScore(LK.getScore() + points);
- updateScoreText();
- // Chain reaction
- handleMerge(gx, gy);
}
+ checkMerges();
}
-// --- Board Full Check ---
-function isBoardFull() {
- for (var y = 0; y < GRID_ROWS; y++) {
- for (var x = 0; x < GRID_COLS; x++) {
- if (!grid[y][x]) return false;
- }
- }
- return true;
-}
-// --- Game Update (not used, but required for LK) ---
-game.update = function () {};
\ No newline at end of file
+// Update score display
+scoreTxt.setText('Score: ' + LK.getScore());
+// Create initial block
+createNewBlock();
\ No newline at end of file