/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Candy = Container.expand(function (i, j, candyType) { var self = Container.call(this); var candyTypes = ["candy1", "candy2", "candy3", "candy4", "candy5", "candy6"]; if (!candyType) { do { candyType = candyTypes[Math.floor(Math.random() * candyTypes.length)]; } while (isPotentialMatch(i, j, candyType)); } self.candyType = candyType; var candyGraphics = self.attachAsset(candyType, { anchorX: 0.5, anchorY: 0.5 }); self.i = i; self.j = j; self.isMoving = false; self.destroyCandy = function () { self.destroy(); }; self.transformToWhite = function () { self.removeChild(candyGraphics); self.candyType = self.candyType + "_white"; candyGraphics = self.attachAsset(self.candyType, { anchorX: 0.5, anchorY: 0.5 }); }; self.moveTo = function (newI, newJ, _onComplete) { self.isMoving = true; self.i = newI; self.j = newJ; tween(self, { x: newI * candySize + candySize / 2 + marginX, y: newJ * candySize + candySize / 2 + marginY }, { duration: 300, onComplete: function onComplete() { self.isMoving = false; if (_onComplete) { _onComplete(); } } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var score = 0; var scoreMultiplier = 1; var scoreTxt = new Text2('Score: 0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); // Anchor to the top-right corner LK.gui.topRight.addChild(scoreTxt); function updateScore(points) { score += points * scoreMultiplier; scoreTxt.setText('Score: ' + score); } var board = []; var boardSize = 9; var candySize = Math.min(2048, 2732) / (boardSize + 0.5); var selectedCandy = null; var marginY = (2732 - boardSize * candySize) / 2; var marginX = (2048 - boardSize * candySize) / 2; var isProcessing = false; function isPotentialMatch(i, j, candyType) { // Oyun başlangıcında 3'lü eşleşmeleri engelliyoruz if (i >= 2 && board[i - 1][j] && board[i - 2][j] && board[i - 1][j].candyType === candyType && board[i - 2][j].candyType === candyType) { return true; } if (j >= 2 && board[i][j - 1] && board[i][j - 2] && board[i][j - 1].candyType === candyType && board[i][j - 2].candyType === candyType) { return true; } return false; } function initializeBoard() { for (var i = 0; i < boardSize; i++) { board[i] = []; for (var j = 0; j < boardSize; j++) { var candy = new Candy(i, j); candy.x = i * candySize + candySize / 2 + marginX; candy.y = j * candySize + candySize / 2 + marginY; board[i][j] = candy; game.addChild(candy); } } } function swapCandies(candy1, candy2) { if (!candy1 || !candy2 || isProcessing) { return; } var dx = Math.abs(candy1.i - candy2.i); var dy = Math.abs(candy1.j - candy2.j); if (dx === 1 && dy === 1 || dx === 0 && dy === 0) { return; // Çapraz veya aynı yere tıklamayı engelle } isProcessing = true; var tempI1 = candy1.i; var tempJ1 = candy1.j; var tempI2 = candy2.i; var tempJ2 = candy2.j; // Tahtada yerlerini değiştir board[tempI1][tempJ1] = candy2; board[tempI2][tempJ2] = candy1; // Görsel olarak yerlerini değiştir candy1.moveTo(tempI2, tempJ2); candy2.moveTo(tempI1, tempJ1); LK.setTimeout(function () { // Yer değiştiren her iki şekeri de kontrol et var matchInfo1 = checkAndDestroyMatches(candy1); var matchInfo2 = checkAndDestroyMatches(candy2); // Eşleşme yoksa geri döndür if (!matchInfo1.hasMatch && !matchInfo2.hasMatch) { board[tempI1][tempJ1] = candy1; board[tempI2][tempJ2] = candy2; candy1.moveTo(tempI1, tempJ1); candy2.moveTo(tempI2, tempJ2); candy1.i = tempI1; candy1.j = tempJ1; candy2.i = tempI2; candy2.j = tempJ2; LK.setTimeout(function () { isProcessing = false; }, 500); } else { if (matchInfo1.hasMatch) { // candy1 eşleşme sağladı if (matchInfo1.isFourMatch) { candy1.transformToWhite(); } else { board[candy1.i][candy1.j] = null; candy1.destroyCandy(); } } if (matchInfo2.hasMatch) { // candy2 eşleşme sağladı if (matchInfo2.isFourMatch) { candy2.transformToWhite(); } else { board[candy2.i][candy2.j] = null; candy2.destroyCandy(); } } LK.setTimeout(function () { processMatches(); }, 300); } }, 600); } function checkAndDestroyMatches(candy) { var hasMatch = false; var isFourMatch = false; var candiesToDestroy = []; var i = candy.i; var j = candy.j; var matchedCandies = [candy]; // Yatay kontrol var left = i - 1; while (left >= 0 && board[left][j] && board[left][j].candyType === candy.candyType) { matchedCandies.push(board[left][j]); left--; } var right = i + 1; while (right < boardSize && board[right][j] && board[right][j].candyType === candy.candyType) { matchedCandies.push(board[right][j]); right++; } if (matchedCandies.length >= 3) { hasMatch = true; if (matchedCandies.length === 4) { isFourMatch = true; } candiesToDestroy = candiesToDestroy.concat(matchedCandies.filter(function (c) { return c !== candy; })); } // Dikey kontrol matchedCandies = [candy]; var up = j - 1; while (up >= 0 && board[i][up] && board[i][up].candyType === candy.candyType) { matchedCandies.push(board[i][up]); up--; } var down = j + 1; while (down < boardSize && board[i][down] && board[i][down].candyType === candy.candyType) { matchedCandies.push(board[i][down]); down++; } if (matchedCandies.length >= 3) { hasMatch = true; if (matchedCandies.length === 4) { isFourMatch = true; } candiesToDestroy = candiesToDestroy.concat(matchedCandies.filter(function (c) { return c !== candy; })); } // Eşleşen şekerleri yok et candiesToDestroy.forEach(function (c) { board[c.i][c.j] = null; c.destroyCandy(); }); if (hasMatch) { if (isFourMatch) { updateScore(100); // 4-match score } else { updateScore(50); // 3-match score } scoreMultiplier++; } else { scoreMultiplier = 1; // Reset multiplier if no match } return { hasMatch: hasMatch, isFourMatch: isFourMatch }; } function processMatches() { refillBoard(); LK.setTimeout(function () { if (checkAllMatches()) { LK.setTimeout(function () { processMatches(); }, 300); } else { isProcessing = false; scoreMultiplier = 1; // Reset multiplier after processing } }, 600); } function checkAllMatches() { var foundMatch = false; for (var i = 0; i < boardSize; i++) { for (var j = 0; j < boardSize; j++) { if (board[i][j]) { var candy = board[i][j]; var candiesToDestroy = []; var matchedCandies = [candy]; // Yatay kontrol var left = i - 1; while (left >= 0 && board[left][j] && board[left][j].candyType === candy.candyType) { matchedCandies.push(board[left][j]); left--; } var right = i + 1; while (right < boardSize && board[right][j] && board[right][j].candyType === candy.candyType) { matchedCandies.push(board[right][j]); right++; } if (matchedCandies.length >= 3) { foundMatch = true; candiesToDestroy = candiesToDestroy.concat(matchedCandies); if (candiesToDestroy.length === 4) { updateScore(100); // 4-match score } else if (candiesToDestroy.length >= 3) { updateScore(50); // 3-match score } } else { // Dikey kontrol matchedCandies = [candy]; var up = j - 1; while (up >= 0 && board[i][up] && board[i][up].candyType === candy.candyType) { matchedCandies.push(board[i][up]); up--; } var down = j + 1; while (down < boardSize && board[i][down] && board[i][down].candyType === candy.candyType) { matchedCandies.push(board[i][down]); down++; } if (matchedCandies.length >= 3) { foundMatch = true; candiesToDestroy = candiesToDestroy.concat(matchedCandies); } } // Eşleşen şekerleri yok et if (candiesToDestroy.length >= 3) { if (candiesToDestroy.length === 4) { updateScore(100); // 4-match score } else if (candiesToDestroy.length >= 3) { updateScore(50); // 3-match score } candiesToDestroy.forEach(function (c) { if (board[c.i][c.j]) { board[c.i][c.j] = null; c.destroyCandy(); } }); } } } } return foundMatch; } function refillBoard() { for (var i = 0; i < boardSize; i++) { var emptySpaces = 0; for (var j = boardSize - 1; j >= 0; j--) { if (!board[i][j]) { emptySpaces++; } else if (emptySpaces > 0) { board[i][j + emptySpaces] = board[i][j]; board[i][j + emptySpaces].moveTo(i, j + emptySpaces); board[i][j] = null; } } for (var j = emptySpaces - 1; j >= 0; j--) { var newCandy = new Candy(i, j); newCandy.x = i * candySize + candySize / 2 + marginX; newCandy.y = -candySize * (emptySpaces - j) + candySize / 2 + marginY; board[i][j] = newCandy; game.addChild(newCandy); newCandy.moveTo(i, j); } } } game.down = function (x, y) { if (isProcessing) { return; } var i = Math.floor((x - marginX) / candySize); var j = Math.floor((y - marginY) / candySize); if (i >= 0 && i < boardSize && j >= 0 && j < boardSize) { if (selectedCandy) { var dx = Math.abs(selectedCandy.i - i); var dy = Math.abs(selectedCandy.j - j); if (dx === 1 && dy === 0 || dx === 0 && dy === 1) { swapCandies(selectedCandy, board[i][j]); } selectedCandy = null; } else { selectedCandy = board[i][j]; } } }; initializeBoard(); var resetButton = LK.getAsset('resetButton', { anchorX: 1, anchorY: 1, x: 2048 - 50, // Positioning the button at the bottom-right corner y: 2732 - 50 }); LK.gui.bottomRight.addChild(resetButton); resetButton.down = function () { LK.showGameOver(); // This will reset the game state }; game.update = function () {}; ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Candy = Container.expand(function (i, j, candyType) {
var self = Container.call(this);
var candyTypes = ["candy1", "candy2", "candy3", "candy4", "candy5", "candy6"];
if (!candyType) {
do {
candyType = candyTypes[Math.floor(Math.random() * candyTypes.length)];
} while (isPotentialMatch(i, j, candyType));
}
self.candyType = candyType;
var candyGraphics = self.attachAsset(candyType, {
anchorX: 0.5,
anchorY: 0.5
});
self.i = i;
self.j = j;
self.isMoving = false;
self.destroyCandy = function () {
self.destroy();
};
self.transformToWhite = function () {
self.removeChild(candyGraphics);
self.candyType = self.candyType + "_white";
candyGraphics = self.attachAsset(self.candyType, {
anchorX: 0.5,
anchorY: 0.5
});
};
self.moveTo = function (newI, newJ, _onComplete) {
self.isMoving = true;
self.i = newI;
self.j = newJ;
tween(self, {
x: newI * candySize + candySize / 2 + marginX,
y: newJ * candySize + candySize / 2 + marginY
}, {
duration: 300,
onComplete: function onComplete() {
self.isMoving = false;
if (_onComplete) {
_onComplete();
}
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var score = 0;
var scoreMultiplier = 1;
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0); // Anchor to the top-right corner
LK.gui.topRight.addChild(scoreTxt);
function updateScore(points) {
score += points * scoreMultiplier;
scoreTxt.setText('Score: ' + score);
}
var board = [];
var boardSize = 9;
var candySize = Math.min(2048, 2732) / (boardSize + 0.5);
var selectedCandy = null;
var marginY = (2732 - boardSize * candySize) / 2;
var marginX = (2048 - boardSize * candySize) / 2;
var isProcessing = false;
function isPotentialMatch(i, j, candyType) {
// Oyun başlangıcında 3'lü eşleşmeleri engelliyoruz
if (i >= 2 && board[i - 1][j] && board[i - 2][j] && board[i - 1][j].candyType === candyType && board[i - 2][j].candyType === candyType) {
return true;
}
if (j >= 2 && board[i][j - 1] && board[i][j - 2] && board[i][j - 1].candyType === candyType && board[i][j - 2].candyType === candyType) {
return true;
}
return false;
}
function initializeBoard() {
for (var i = 0; i < boardSize; i++) {
board[i] = [];
for (var j = 0; j < boardSize; j++) {
var candy = new Candy(i, j);
candy.x = i * candySize + candySize / 2 + marginX;
candy.y = j * candySize + candySize / 2 + marginY;
board[i][j] = candy;
game.addChild(candy);
}
}
}
function swapCandies(candy1, candy2) {
if (!candy1 || !candy2 || isProcessing) {
return;
}
var dx = Math.abs(candy1.i - candy2.i);
var dy = Math.abs(candy1.j - candy2.j);
if (dx === 1 && dy === 1 || dx === 0 && dy === 0) {
return; // Çapraz veya aynı yere tıklamayı engelle
}
isProcessing = true;
var tempI1 = candy1.i;
var tempJ1 = candy1.j;
var tempI2 = candy2.i;
var tempJ2 = candy2.j;
// Tahtada yerlerini değiştir
board[tempI1][tempJ1] = candy2;
board[tempI2][tempJ2] = candy1;
// Görsel olarak yerlerini değiştir
candy1.moveTo(tempI2, tempJ2);
candy2.moveTo(tempI1, tempJ1);
LK.setTimeout(function () {
// Yer değiştiren her iki şekeri de kontrol et
var matchInfo1 = checkAndDestroyMatches(candy1);
var matchInfo2 = checkAndDestroyMatches(candy2);
// Eşleşme yoksa geri döndür
if (!matchInfo1.hasMatch && !matchInfo2.hasMatch) {
board[tempI1][tempJ1] = candy1;
board[tempI2][tempJ2] = candy2;
candy1.moveTo(tempI1, tempJ1);
candy2.moveTo(tempI2, tempJ2);
candy1.i = tempI1;
candy1.j = tempJ1;
candy2.i = tempI2;
candy2.j = tempJ2;
LK.setTimeout(function () {
isProcessing = false;
}, 500);
} else {
if (matchInfo1.hasMatch) {
// candy1 eşleşme sağladı
if (matchInfo1.isFourMatch) {
candy1.transformToWhite();
} else {
board[candy1.i][candy1.j] = null;
candy1.destroyCandy();
}
}
if (matchInfo2.hasMatch) {
// candy2 eşleşme sağladı
if (matchInfo2.isFourMatch) {
candy2.transformToWhite();
} else {
board[candy2.i][candy2.j] = null;
candy2.destroyCandy();
}
}
LK.setTimeout(function () {
processMatches();
}, 300);
}
}, 600);
}
function checkAndDestroyMatches(candy) {
var hasMatch = false;
var isFourMatch = false;
var candiesToDestroy = [];
var i = candy.i;
var j = candy.j;
var matchedCandies = [candy];
// Yatay kontrol
var left = i - 1;
while (left >= 0 && board[left][j] && board[left][j].candyType === candy.candyType) {
matchedCandies.push(board[left][j]);
left--;
}
var right = i + 1;
while (right < boardSize && board[right][j] && board[right][j].candyType === candy.candyType) {
matchedCandies.push(board[right][j]);
right++;
}
if (matchedCandies.length >= 3) {
hasMatch = true;
if (matchedCandies.length === 4) {
isFourMatch = true;
}
candiesToDestroy = candiesToDestroy.concat(matchedCandies.filter(function (c) {
return c !== candy;
}));
}
// Dikey kontrol
matchedCandies = [candy];
var up = j - 1;
while (up >= 0 && board[i][up] && board[i][up].candyType === candy.candyType) {
matchedCandies.push(board[i][up]);
up--;
}
var down = j + 1;
while (down < boardSize && board[i][down] && board[i][down].candyType === candy.candyType) {
matchedCandies.push(board[i][down]);
down++;
}
if (matchedCandies.length >= 3) {
hasMatch = true;
if (matchedCandies.length === 4) {
isFourMatch = true;
}
candiesToDestroy = candiesToDestroy.concat(matchedCandies.filter(function (c) {
return c !== candy;
}));
}
// Eşleşen şekerleri yok et
candiesToDestroy.forEach(function (c) {
board[c.i][c.j] = null;
c.destroyCandy();
});
if (hasMatch) {
if (isFourMatch) {
updateScore(100); // 4-match score
} else {
updateScore(50); // 3-match score
}
scoreMultiplier++;
} else {
scoreMultiplier = 1; // Reset multiplier if no match
}
return {
hasMatch: hasMatch,
isFourMatch: isFourMatch
};
}
function processMatches() {
refillBoard();
LK.setTimeout(function () {
if (checkAllMatches()) {
LK.setTimeout(function () {
processMatches();
}, 300);
} else {
isProcessing = false;
scoreMultiplier = 1; // Reset multiplier after processing
}
}, 600);
}
function checkAllMatches() {
var foundMatch = false;
for (var i = 0; i < boardSize; i++) {
for (var j = 0; j < boardSize; j++) {
if (board[i][j]) {
var candy = board[i][j];
var candiesToDestroy = [];
var matchedCandies = [candy];
// Yatay kontrol
var left = i - 1;
while (left >= 0 && board[left][j] && board[left][j].candyType === candy.candyType) {
matchedCandies.push(board[left][j]);
left--;
}
var right = i + 1;
while (right < boardSize && board[right][j] && board[right][j].candyType === candy.candyType) {
matchedCandies.push(board[right][j]);
right++;
}
if (matchedCandies.length >= 3) {
foundMatch = true;
candiesToDestroy = candiesToDestroy.concat(matchedCandies);
if (candiesToDestroy.length === 4) {
updateScore(100); // 4-match score
} else if (candiesToDestroy.length >= 3) {
updateScore(50); // 3-match score
}
} else {
// Dikey kontrol
matchedCandies = [candy];
var up = j - 1;
while (up >= 0 && board[i][up] && board[i][up].candyType === candy.candyType) {
matchedCandies.push(board[i][up]);
up--;
}
var down = j + 1;
while (down < boardSize && board[i][down] && board[i][down].candyType === candy.candyType) {
matchedCandies.push(board[i][down]);
down++;
}
if (matchedCandies.length >= 3) {
foundMatch = true;
candiesToDestroy = candiesToDestroy.concat(matchedCandies);
}
}
// Eşleşen şekerleri yok et
if (candiesToDestroy.length >= 3) {
if (candiesToDestroy.length === 4) {
updateScore(100); // 4-match score
} else if (candiesToDestroy.length >= 3) {
updateScore(50); // 3-match score
}
candiesToDestroy.forEach(function (c) {
if (board[c.i][c.j]) {
board[c.i][c.j] = null;
c.destroyCandy();
}
});
}
}
}
}
return foundMatch;
}
function refillBoard() {
for (var i = 0; i < boardSize; i++) {
var emptySpaces = 0;
for (var j = boardSize - 1; j >= 0; j--) {
if (!board[i][j]) {
emptySpaces++;
} else if (emptySpaces > 0) {
board[i][j + emptySpaces] = board[i][j];
board[i][j + emptySpaces].moveTo(i, j + emptySpaces);
board[i][j] = null;
}
}
for (var j = emptySpaces - 1; j >= 0; j--) {
var newCandy = new Candy(i, j);
newCandy.x = i * candySize + candySize / 2 + marginX;
newCandy.y = -candySize * (emptySpaces - j) + candySize / 2 + marginY;
board[i][j] = newCandy;
game.addChild(newCandy);
newCandy.moveTo(i, j);
}
}
}
game.down = function (x, y) {
if (isProcessing) {
return;
}
var i = Math.floor((x - marginX) / candySize);
var j = Math.floor((y - marginY) / candySize);
if (i >= 0 && i < boardSize && j >= 0 && j < boardSize) {
if (selectedCandy) {
var dx = Math.abs(selectedCandy.i - i);
var dy = Math.abs(selectedCandy.j - j);
if (dx === 1 && dy === 0 || dx === 0 && dy === 1) {
swapCandies(selectedCandy, board[i][j]);
}
selectedCandy = null;
} else {
selectedCandy = board[i][j];
}
}
};
initializeBoard();
var resetButton = LK.getAsset('resetButton', {
anchorX: 1,
anchorY: 1,
x: 2048 - 50,
// Positioning the button at the bottom-right corner
y: 2732 - 50
});
LK.gui.bottomRight.addChild(resetButton);
resetButton.down = function () {
LK.showGameOver(); // This will reset the game state
};
game.update = function () {};
;