User prompt
alt barda kllanılan gemiden sonra rastgele başka bir gemi gelsin
User prompt
oyun alanında diğer eşleşmelerden sonra beliren aynı renk gemiler de ayn yana olursa da birleşip üst seviye gemi olsun
User prompt
birbirine temas eden aynı renk gemiler birleşip tek bir üst seviye gemi olsun
User prompt
oyun ilk açıldığında oyun alanında gemi olmasın ve alt barda 3 farklı gemi olsun ve en fazla 3 gemi olabilsin oyun alanına koyulan gemiler yer değiştiremesin en üst seviye gemiler birleştiğinde çevresindeki gemiler batsın ve bonus puan versin
User prompt
altta bir bar içinde farklı gemiler olsun. başlangıçta birinci seviye gemi varken yeni gemiler açıldıkça alt barda yeni gemiler de çıksın .oyuncu bu gemileri sürükleme yöntemi ile oyun alanına bıaksın. 3 ve daha fazla sayıda aynı tür gemi yan yana alt alta veya L şeklinde hizalandığında birleşip tek bir gemi olsun ve üst seviye gemi olsun
User prompt
Please fix the bug: 'ReferenceError: mergeShips is not defined' in or related to this line: 'mergeShips(draggingShip, targetShip);' Line Number: 372
User prompt
arka plana bir deniz koy
User prompt
Please fix the bug: 'TypeError: Cannot read properties of null (reading 'gridX')' in or related to this line: 'var key = ship.gridX + "," + ship.gridY;' Line Number: 195
User prompt
3 aynı tür gemi birbirine temas edince birleşip bir üst seviye olsun
Code edit (1 edits merged)
Please save this source code
User prompt
Pirate Merge Armada
Initial prompt
merge pirate tarzı gemi birleştirme oyunu yapmak istiyorum
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Ship class for mergeable ships
var Ship = Container.expand(function () {
var self = Container.call(this);
// Level of the ship (1-6)
self.level = 1;
self.gridX = 0;
self.gridY = 0;
self.isDragging = false;
// Attach ship asset
var shipSprite = self.attachAsset('ship' + self.level, {
anchorX: 0.5,
anchorY: 0.5
});
// Update ship sprite to match level
self.setLevel = function (level) {
self.level = level;
self.removeChild(shipSprite);
var newSprite = self.attachAsset('ship' + level, {
anchorX: 0.5,
anchorY: 0.5
});
shipSprite = newSprite;
};
// Animate merge
self.animateMerge = function () {
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 120,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
}
});
};
// Animate spawn
self.animateSpawn = function () {
self.scaleX = 0.2;
self.scaleY = 0.2;
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 180,
easing: tween.easeOut
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0e1621
});
/****
* Game Code
****/
// Pirate ship assets for different levels (1-6)
// --- Game Constants ---
var GRID_SIZE = 5;
var CELL_SIZE = 230;
var GRID_MARGIN = 30;
var BOARD_WIDTH = GRID_SIZE * CELL_SIZE;
var BOARD_HEIGHT = GRID_SIZE * CELL_SIZE;
var BOARD_X = Math.floor((2048 - BOARD_WIDTH) / 2);
var BOARD_Y = Math.floor((2732 - BOARD_HEIGHT) / 2) + 60; // leave top margin for GUI
// --- Game State ---
var grid = []; // 2D array [y][x] of Ship or null
var ships = []; // All ship objects
var draggingShip = null;
var dragStartGrid = null;
var dragOffsetX = 0;
var dragOffsetY = 0;
var isMerging = false;
var score = 0;
var scoreTxt = null;
// --- GUI ---
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFE066
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Board Background ---
for (var y = 0; y < GRID_SIZE; y++) {
for (var x = 0; x < GRID_SIZE; x++) {
var cell = LK.getAsset('cell', {
anchorX: 0.5,
anchorY: 0.5,
x: BOARD_X + x * CELL_SIZE + CELL_SIZE / 2,
y: BOARD_Y + y * CELL_SIZE + CELL_SIZE / 2
});
game.addChild(cell);
}
}
// --- Grid Initialization ---
for (var y = 0; y < GRID_SIZE; y++) {
grid[y] = [];
for (var x = 0; x < GRID_SIZE; x++) {
grid[y][x] = null;
}
}
// --- Helper Functions ---
function getCellPos(x, y) {
return {
x: BOARD_X + x * CELL_SIZE + CELL_SIZE / 2,
y: BOARD_Y + y * CELL_SIZE + CELL_SIZE / 2
};
}
function isInsideGrid(x, y) {
return x >= 0 && x < GRID_SIZE && y >= 0 && y < GRID_SIZE;
}
function getGridFromPos(px, py) {
var gx = Math.floor((px - BOARD_X) / CELL_SIZE);
var gy = Math.floor((py - BOARD_Y) / CELL_SIZE);
if (isInsideGrid(gx, gy)) {
return {
x: gx,
y: gy
};
}
return null;
}
function spawnRandomShip() {
// Find all empty cells
var empties = [];
for (var y = 0; y < GRID_SIZE; y++) {
for (var x = 0; x < GRID_SIZE; x++) {
if (!grid[y][x]) empties.push({
x: x,
y: y
});
}
}
if (empties.length === 0) return false;
var idx = Math.floor(Math.random() * empties.length);
var cell = empties[idx];
var level = Math.random() < 0.85 ? 1 : 2; // 85% level 1, 15% level 2
var ship = new Ship();
ship.setLevel(level);
ship.gridX = cell.x;
ship.gridY = cell.y;
var pos = getCellPos(cell.x, cell.y);
ship.x = pos.x;
ship.y = pos.y;
ship.animateSpawn();
grid[cell.y][cell.x] = ship;
ships.push(ship);
game.addChild(ship);
return true;
}
function canMerge(shipA, shipB) {
return shipA && shipB && shipA.level === shipB.level && shipA !== shipB;
}
// Find all connected ships of the same level (DFS)
function findConnectedSameLevelShips(startShip) {
var visited = {};
var stack = [startShip];
var result = [];
while (stack.length > 0) {
var ship = stack.pop();
var key = ship.gridX + "," + ship.gridY;
if (visited[key]) continue;
visited[key] = true;
result.push(ship);
// Check 4 neighbors
var dirs = [[0, 1], [1, 0], [-1, 0], [0, -1]];
for (var d = 0; d < dirs.length; d++) {
var nx = ship.gridX + dirs[d][0];
var ny = ship.gridY + dirs[d][1];
if (isInsideGrid(nx, ny)) {
var neighbor = grid[ny][nx];
if (neighbor && neighbor.level === startShip.level && !visited[nx + "," + ny]) {
stack.push(neighbor);
}
}
}
}
return result;
}
// Merge 3 or more ships of the same level into one higher-level ship
function mergeThreeOrMoreShips(shipsToMerge) {
if (shipsToMerge.length < 3) return;
// Pick the first ship as the merge target
var target = shipsToMerge[0];
var newLevel = target.level + 1;
if (newLevel > 6) newLevel = 6;
target.setLevel(newLevel);
target.animateMerge();
// Remove the other ships
for (var i = 1; i < shipsToMerge.length; i++) {
var ship = shipsToMerge[i];
grid[ship.gridY][ship.gridX] = null;
var idx = ships.indexOf(ship);
if (idx !== -1) ships.splice(idx, 1);
ship.destroy();
}
// Update grid for target
grid[target.gridY][target.gridX] = target;
// Update score
var addScore = Math.pow(2, newLevel + 1) * 10 * shipsToMerge.length;
score += addScore;
scoreTxt.setText(score);
}
function hasMovesAvailable() {
// If any empty cell or any mergeable neighbor, return true
for (var y = 0; y < GRID_SIZE; y++) {
for (var x = 0; x < GRID_SIZE; x++) {
var ship = grid[y][x];
if (!ship) return true;
// Check neighbors
var dirs = [[0, 1], [1, 0], [-1, 0], [0, -1]];
for (var d = 0; d < dirs.length; d++) {
var nx = x + dirs[d][0];
var ny = y + dirs[d][1];
if (isInsideGrid(nx, ny) && grid[ny][nx] && grid[ny][nx].level === ship.level) {
return true;
}
}
}
}
return false;
}
// --- Initial Ships ---
for (var i = 0; i < 3; i++) {
spawnRandomShip();
}
// After initial spawn, check for any 3+ merges and resolve them
for (var y = 0; y < GRID_SIZE; y++) {
for (var x = 0; x < GRID_SIZE; x++) {
var ship = grid[y][x];
if (ship) {
var connected = findConnectedSameLevelShips(ship);
if (connected.length >= 3) {
mergeThreeOrMoreShips(connected);
}
}
}
}
// --- Drag & Drop Logic ---
game.down = function (x, y, obj) {
if (isMerging) return;
// Find ship at this position
var gridPos = getGridFromPos(x, y);
if (!gridPos) return;
var ship = grid[gridPos.y][gridPos.x];
if (!ship) return;
draggingShip = ship;
dragStartGrid = {
x: ship.gridX,
y: ship.gridY
};
dragOffsetX = x - ship.x;
dragOffsetY = y - ship.y;
ship.isDragging = true;
// Bring to front
game.removeChild(ship);
game.addChild(ship);
// Animate
tween(ship, {
scaleX: 1.15,
scaleY: 1.15
}, {
duration: 100,
easing: tween.easeOut
});
};
game.move = function (x, y, obj) {
if (!draggingShip || isMerging) return;
// Move ship with finger
draggingShip.x = x - dragOffsetX;
draggingShip.y = y - dragOffsetY;
};
game.up = function (x, y, obj) {
if (!draggingShip || isMerging) return;
// Snap to nearest cell
var gridPos = getGridFromPos(draggingShip.x, draggingShip.y);
if (!gridPos) {
// Out of bounds, return to original
var orig = getCellPos(dragStartGrid.x, dragStartGrid.y);
tween(draggingShip, {
x: orig.x,
y: orig.y,
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
draggingShip.isDragging = false;
draggingShip = null;
return;
}
var targetShip = grid[gridPos.y][gridPos.x];
if (targetShip && canMerge(draggingShip, targetShip)) {
// Merge!
isMerging = true;
var pos = getCellPos(gridPos.x, gridPos.y);
tween(draggingShip, {
x: pos.x,
y: pos.y
}, {
duration: 100,
easing: tween.linear,
onFinish: function onFinish() {
mergeShips(draggingShip, targetShip);
// Move merged ship to cell
targetShip.gridX = gridPos.x;
targetShip.gridY = gridPos.y;
grid[dragStartGrid.y][dragStartGrid.x] = null;
grid[gridPos.y][gridPos.x] = targetShip;
isMerging = false;
draggingShip = null;
// After merge, check for 3+ merge at the merged cell
var connected = findConnectedSameLevelShips(targetShip);
if (connected.length >= 3) {
mergeThreeOrMoreShips(connected);
}
// After merge, spawn new ship
if (!spawnRandomShip()) {
// No space, check for moves
if (!hasMovesAvailable()) {
LK.showGameOver();
}
}
}
});
} else if (!targetShip) {
// Move to empty cell
var pos = getCellPos(gridPos.x, gridPos.y);
tween(draggingShip, {
x: pos.x,
y: pos.y,
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn,
onFinish: function onFinish() {
// Update grid
grid[dragStartGrid.y][dragStartGrid.x] = null;
grid[gridPos.y][gridPos.x] = draggingShip;
draggingShip.gridX = gridPos.x;
draggingShip.gridY = gridPos.y;
draggingShip.isDragging = false;
draggingShip = null;
// After move, check for 3+ merge at the new cell
var connected = findConnectedSameLevelShips(draggingShip);
if (connected.length >= 3) {
mergeThreeOrMoreShips(connected);
}
// After move, spawn new ship
if (!spawnRandomShip()) {
if (!hasMovesAvailable()) {
LK.showGameOver();
}
}
}
});
} else {
// Occupied, can't merge, return to original
var orig = getCellPos(dragStartGrid.x, dragStartGrid.y);
tween(draggingShip, {
x: orig.x,
y: orig.y,
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
draggingShip.isDragging = false;
draggingShip = null;
}
};
// --- Game Update (not used for logic, but could be for future animations) ---
game.update = function () {
// No per-frame logic needed for MVP
}; ===================================================================
--- original.js
+++ change.js
@@ -169,20 +169,55 @@
}
function canMerge(shipA, shipB) {
return shipA && shipB && shipA.level === shipB.level && shipA !== shipB;
}
-function mergeShips(shipA, shipB) {
- // Merge shipA into shipB, remove shipA
- var newLevel = shipB.level + 1;
+// Find all connected ships of the same level (DFS)
+function findConnectedSameLevelShips(startShip) {
+ var visited = {};
+ var stack = [startShip];
+ var result = [];
+ while (stack.length > 0) {
+ var ship = stack.pop();
+ var key = ship.gridX + "," + ship.gridY;
+ if (visited[key]) continue;
+ visited[key] = true;
+ result.push(ship);
+ // Check 4 neighbors
+ var dirs = [[0, 1], [1, 0], [-1, 0], [0, -1]];
+ for (var d = 0; d < dirs.length; d++) {
+ var nx = ship.gridX + dirs[d][0];
+ var ny = ship.gridY + dirs[d][1];
+ if (isInsideGrid(nx, ny)) {
+ var neighbor = grid[ny][nx];
+ if (neighbor && neighbor.level === startShip.level && !visited[nx + "," + ny]) {
+ stack.push(neighbor);
+ }
+ }
+ }
+ }
+ return result;
+}
+// Merge 3 or more ships of the same level into one higher-level ship
+function mergeThreeOrMoreShips(shipsToMerge) {
+ if (shipsToMerge.length < 3) return;
+ // Pick the first ship as the merge target
+ var target = shipsToMerge[0];
+ var newLevel = target.level + 1;
if (newLevel > 6) newLevel = 6;
- shipB.setLevel(newLevel);
- shipB.animateMerge();
- // Remove shipA from grid and scene
- grid[shipA.gridY][shipA.gridX] = null;
- ships.splice(ships.indexOf(shipA), 1);
- shipA.destroy();
+ target.setLevel(newLevel);
+ target.animateMerge();
+ // Remove the other ships
+ for (var i = 1; i < shipsToMerge.length; i++) {
+ var ship = shipsToMerge[i];
+ grid[ship.gridY][ship.gridX] = null;
+ var idx = ships.indexOf(ship);
+ if (idx !== -1) ships.splice(idx, 1);
+ ship.destroy();
+ }
+ // Update grid for target
+ grid[target.gridY][target.gridX] = target;
// Update score
- var addScore = Math.pow(2, newLevel + 1) * 10;
+ var addScore = Math.pow(2, newLevel + 1) * 10 * shipsToMerge.length;
score += addScore;
scoreTxt.setText(score);
}
function hasMovesAvailable() {
@@ -207,8 +242,20 @@
// --- Initial Ships ---
for (var i = 0; i < 3; i++) {
spawnRandomShip();
}
+// After initial spawn, check for any 3+ merges and resolve them
+for (var y = 0; y < GRID_SIZE; y++) {
+ for (var x = 0; x < GRID_SIZE; x++) {
+ var ship = grid[y][x];
+ if (ship) {
+ var connected = findConnectedSameLevelShips(ship);
+ if (connected.length >= 3) {
+ mergeThreeOrMoreShips(connected);
+ }
+ }
+ }
+}
// --- Drag & Drop Logic ---
game.down = function (x, y, obj) {
if (isMerging) return;
// Find ship at this position
@@ -281,8 +328,13 @@
grid[dragStartGrid.y][dragStartGrid.x] = null;
grid[gridPos.y][gridPos.x] = targetShip;
isMerging = false;
draggingShip = null;
+ // After merge, check for 3+ merge at the merged cell
+ var connected = findConnectedSameLevelShips(targetShip);
+ if (connected.length >= 3) {
+ mergeThreeOrMoreShips(connected);
+ }
// After merge, spawn new ship
if (!spawnRandomShip()) {
// No space, check for moves
if (!hasMovesAvailable()) {
@@ -309,8 +361,13 @@
draggingShip.gridX = gridPos.x;
draggingShip.gridY = gridPos.y;
draggingShip.isDragging = false;
draggingShip = null;
+ // After move, check for 3+ merge at the new cell
+ var connected = findConnectedSameLevelShips(draggingShip);
+ if (connected.length >= 3) {
+ mergeThreeOrMoreShips(connected);
+ }
// After move, spawn new ship
if (!spawnRandomShip()) {
if (!hasMovesAvailable()) {
LK.showGameOver();
deniz arka plan. In-Game asset. 2d. High contrast. No shadows
3d piksar tarzı şeffaf kare. In-Game asset. 2d. High contrast. No shadows
3d pixar tarzı korsan gemisi beyaz renk. In-Game asset. 2d. High contrast. No shadows
beyaz bölgeler sarı olsun
beyaz kısımlar açık yeşil olsun
beyaz kısımlar mavi olsun
mavi kısımlar koyu mor olsun
mor kısımlar siyah olsun