/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
currentLevel: 1
});
/****
* Classes
****/
var Card = Container.expand(function (symbol, soundId) {
var self = Container.call(this);
self.symbol = symbol;
self.soundId = soundId;
self.isFlipped = false;
self.isMatched = false;
// Create card back (visible initially)
var back = self.attachAsset('cardBack', {
anchorX: 0.5,
anchorY: 0.5
});
// Create card front (hidden initially)
var front = self.attachAsset('cardFront', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Add image to front
var image = self.attachAsset(symbol, {
anchorX: 0.5,
anchorY: 0.5
});
front.addChild(image);
// Make card interactive
self.interactive = true;
// Flip animation
self.flip = function () {
if (self.isMatched || self.isFlipped || !gameActive || flippedCards.length >= 2) {
return;
}
self.isFlipped = true;
LK.getSound('flip').play();
// Play the card's sound
if (self.soundId) {
LK.getSound(self.soundId).play();
}
// Animate card flip
tween(back, {
scaleX: 0
}, {
duration: 150,
onFinish: function onFinish() {
tween(front, {
alpha: 1
}, {
duration: 0
});
tween(front, {
scaleX: 1
}, {
duration: 150
});
}
});
// Add to flipped cards array
flippedCards.push(self);
// Check for match if two cards are flipped
if (flippedCards.length === 2) {
checkForMatch();
}
};
// Reset card to face down
self.reset = function () {
self.isFlipped = false;
tween(front, {
scaleX: 0
}, {
duration: 150,
onFinish: function onFinish() {
tween(front, {
alpha: 0
}, {
duration: 0
});
tween(back, {
scaleX: 1
}, {
duration: 150
});
}
});
};
// Show match animation
self.showMatch = function () {
self.isMatched = true;
// Pulse animation for matched cards
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
};
// Handle card press
self.down = function (x, y, obj) {
self.flip();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFFFFF
});
/****
* Game Code
****/
// Create back button
var backButton = new Text2("Back", {
size: 60,
fill: 0x000000 // Black color
});
backButton.anchor.set(0, 1);
backButton.x = 10;
backButton.y = 2732 - 10;
backButton.interactive = true;
backButton.down = function () {
// Logic for going back a level or screen
if (level > 1) {
level--;
startGame();
}
};
LK.gui.bottomLeft.addChild(backButton);
// Create next button
var nextButton = new Text2("Next", {
size: 60,
fill: 0x000000 // Black color
});
nextButton.anchor.set(1, 1);
nextButton.x = 2048 - 10;
nextButton.y = 2732 - 10;
nextButton.interactive = true;
nextButton.down = function () {
// Logic for going to the next level or screen
if (level < 5) {
level++;
startGame();
}
};
LK.gui.bottomRight.addChild(nextButton);
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
// Game variables
// Initialize animal images
var level = storage.currentLevel || 1;
var rows = 3;
var cols = 4;
var cardSpacing = 30;
var cardWidth = 300;
var cardHeight = 400;
var flippedCards = [];
var matchedPairs = 0;
var requiredPairs = 0;
var gameActive = false;
var timeLeft = 60;
var timeWarningGiven = false;
var gameTimer = null;
var cards = [];
var symbols = [];
var soundMap = {
'A': 'dog',
'B': 'cat',
'C': 'elephant',
'D': 'monkey',
'E': 'lion',
'F': 'bird',
'G': 'frog',
'H': 'dolphin'
};
// Difficulty settings based on level
function setDifficulty() {
if (level === 1) {
rows = 3;
cols = 4;
timeLeft = 60;
} else if (level === 2) {
rows = 4;
cols = 4;
timeLeft = 75;
} else {
rows = 4;
cols = 5;
timeLeft = 90;
}
requiredPairs = rows * cols / 2;
}
// Create symbols array
function createSymbols() {
var availableSymbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'];
symbols = [];
// Create pairs of symbols
for (var i = 0; i < requiredPairs; i++) {
var symbol = availableSymbols[i];
symbols.push(symbol);
symbols.push(symbol);
}
// Shuffle
shuffleArray(symbols);
}
// Fisher-Yates shuffle algorithm
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// Create game board
function createBoard() {
var boardWidth = cols * cardWidth + (cols - 1) * cardSpacing;
var boardHeight = rows * cardHeight + (rows - 1) * cardSpacing;
var startX = (2048 - boardWidth) / 2 + cardWidth / 2;
var startY = (2732 - boardHeight) / 2 + cardHeight / 2;
var index = 0;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
var x = startX + c * (cardWidth + cardSpacing);
var y = startY + r * (cardHeight + cardSpacing);
var symbol = symbols[index];
var soundId = soundMap[symbol] || null;
var imageId = 'animal_' + symbol; // Assuming images are named like 'animal_A', 'animal_B', etc.
var card = new Card(imageId, soundId);
card.x = x;
card.y = y;
game.addChild(card);
cards.push(card);
index++;
}
}
}
// Check for match when two cards are flipped
function checkForMatch() {
var card1 = flippedCards[0];
var card2 = flippedCards[1];
LK.setTimeout(function () {
if (card1.symbol === card2.symbol) {
// Match found
LK.getSound('match').play();
card1.showMatch();
card2.showMatch();
matchedPairs++;
// Update score
LK.setScore(LK.getScore() + 100);
scoreText.setText(LK.getScore());
// Check if all pairs are matched
if (matchedPairs === requiredPairs) {
gameWon();
}
} else {
// No match, flip cards back
LK.getSound('nomatch').play();
card1.reset();
card2.reset();
}
flippedCards = [];
}, 1000);
}
// Timer update
function updateTimer() {
timeLeft--;
timerText.setText("Time: " + timeLeft);
// Time running out warning
if (timeLeft <= 10 && !timeWarningGiven) {
timeWarningGiven = true;
timerText.setStyle({
fill: 0xE74C3C
});
LK.getSound('timewarning').play();
}
// Game over if time runs out
if (timeLeft <= 0) {
gameOver();
}
}
// Game won
function gameWon() {
LK.clearInterval(gameTimer);
gameActive = false;
// Add time bonus
var timeBonus = timeLeft * 10;
LK.setScore(LK.getScore() + timeBonus);
scoreText.setText(LK.getScore());
// Update high score
if (LK.getScore() > storage.highScore) {
storage.highScore = LK.getScore();
}
// Update level
level++;
if (level > 5) {
level = 1; // Reset to level 1 after level 5
}
storage.currentLevel = level;
// Play win sound
LK.getSound('win').play();
// Show success message
LK.showYouWin();
}
// Game over
function gameOver() {
LK.clearInterval(gameTimer);
gameActive = false;
// Show game over screen
LK.showGameOver();
}
// Start a new game
function startGame() {
// Reset game state
matchedPairs = 0;
flippedCards = [];
timeWarningGiven = false;
LK.setScore(0);
scoreText.setText("0");
// Clear previous game
for (var i = 0; i < cards.length; i++) {
cards[i].destroy();
}
cards = [];
// Set up new game
setDifficulty();
createSymbols();
createBoard();
// Reset timer
timerText.setText("Time: " + timeLeft);
timerText.setStyle({
fill: 0xFFFFFF
});
// Start timer
if (gameTimer) {
LK.clearInterval(gameTimer);
}
gameTimer = LK.setInterval(updateTimer, 1000);
// Start game
gameActive = true;
// Play background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
}
// Create UI elements
var titleText = new Text2("Crazy Card Match", {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
var scoreText = new Text2("0", {
size: 60,
fill: 0x000000
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
scoreText.x = -10;
scoreText.y = 50;
var timerText = new Text2("Time: 60", {
size: 60,
fill: 0x000000
});
timerText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(timerText);
timerText.y = -10;
var levelText = new Text2("Level: " + level, {
size: 60,
fill: 0x000000
});
levelText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(levelText);
levelText.y = -100;
// Start the game
LK.setTimeout(function () {
startGame();
}, 500);
// Main game update loop
game.update = function () {
// Update level text (in case level changes)
levelText.setText("Level: " + level);
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
currentLevel: 1
});
/****
* Classes
****/
var Card = Container.expand(function (symbol, soundId) {
var self = Container.call(this);
self.symbol = symbol;
self.soundId = soundId;
self.isFlipped = false;
self.isMatched = false;
// Create card back (visible initially)
var back = self.attachAsset('cardBack', {
anchorX: 0.5,
anchorY: 0.5
});
// Create card front (hidden initially)
var front = self.attachAsset('cardFront', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Add image to front
var image = self.attachAsset(symbol, {
anchorX: 0.5,
anchorY: 0.5
});
front.addChild(image);
// Make card interactive
self.interactive = true;
// Flip animation
self.flip = function () {
if (self.isMatched || self.isFlipped || !gameActive || flippedCards.length >= 2) {
return;
}
self.isFlipped = true;
LK.getSound('flip').play();
// Play the card's sound
if (self.soundId) {
LK.getSound(self.soundId).play();
}
// Animate card flip
tween(back, {
scaleX: 0
}, {
duration: 150,
onFinish: function onFinish() {
tween(front, {
alpha: 1
}, {
duration: 0
});
tween(front, {
scaleX: 1
}, {
duration: 150
});
}
});
// Add to flipped cards array
flippedCards.push(self);
// Check for match if two cards are flipped
if (flippedCards.length === 2) {
checkForMatch();
}
};
// Reset card to face down
self.reset = function () {
self.isFlipped = false;
tween(front, {
scaleX: 0
}, {
duration: 150,
onFinish: function onFinish() {
tween(front, {
alpha: 0
}, {
duration: 0
});
tween(back, {
scaleX: 1
}, {
duration: 150
});
}
});
};
// Show match animation
self.showMatch = function () {
self.isMatched = true;
// Pulse animation for matched cards
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
};
// Handle card press
self.down = function (x, y, obj) {
self.flip();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFFFFF
});
/****
* Game Code
****/
// Create back button
var backButton = new Text2("Back", {
size: 60,
fill: 0x000000 // Black color
});
backButton.anchor.set(0, 1);
backButton.x = 10;
backButton.y = 2732 - 10;
backButton.interactive = true;
backButton.down = function () {
// Logic for going back a level or screen
if (level > 1) {
level--;
startGame();
}
};
LK.gui.bottomLeft.addChild(backButton);
// Create next button
var nextButton = new Text2("Next", {
size: 60,
fill: 0x000000 // Black color
});
nextButton.anchor.set(1, 1);
nextButton.x = 2048 - 10;
nextButton.y = 2732 - 10;
nextButton.interactive = true;
nextButton.down = function () {
// Logic for going to the next level or screen
if (level < 5) {
level++;
startGame();
}
};
LK.gui.bottomRight.addChild(nextButton);
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
// Game variables
// Initialize animal images
var level = storage.currentLevel || 1;
var rows = 3;
var cols = 4;
var cardSpacing = 30;
var cardWidth = 300;
var cardHeight = 400;
var flippedCards = [];
var matchedPairs = 0;
var requiredPairs = 0;
var gameActive = false;
var timeLeft = 60;
var timeWarningGiven = false;
var gameTimer = null;
var cards = [];
var symbols = [];
var soundMap = {
'A': 'dog',
'B': 'cat',
'C': 'elephant',
'D': 'monkey',
'E': 'lion',
'F': 'bird',
'G': 'frog',
'H': 'dolphin'
};
// Difficulty settings based on level
function setDifficulty() {
if (level === 1) {
rows = 3;
cols = 4;
timeLeft = 60;
} else if (level === 2) {
rows = 4;
cols = 4;
timeLeft = 75;
} else {
rows = 4;
cols = 5;
timeLeft = 90;
}
requiredPairs = rows * cols / 2;
}
// Create symbols array
function createSymbols() {
var availableSymbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'];
symbols = [];
// Create pairs of symbols
for (var i = 0; i < requiredPairs; i++) {
var symbol = availableSymbols[i];
symbols.push(symbol);
symbols.push(symbol);
}
// Shuffle
shuffleArray(symbols);
}
// Fisher-Yates shuffle algorithm
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// Create game board
function createBoard() {
var boardWidth = cols * cardWidth + (cols - 1) * cardSpacing;
var boardHeight = rows * cardHeight + (rows - 1) * cardSpacing;
var startX = (2048 - boardWidth) / 2 + cardWidth / 2;
var startY = (2732 - boardHeight) / 2 + cardHeight / 2;
var index = 0;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
var x = startX + c * (cardWidth + cardSpacing);
var y = startY + r * (cardHeight + cardSpacing);
var symbol = symbols[index];
var soundId = soundMap[symbol] || null;
var imageId = 'animal_' + symbol; // Assuming images are named like 'animal_A', 'animal_B', etc.
var card = new Card(imageId, soundId);
card.x = x;
card.y = y;
game.addChild(card);
cards.push(card);
index++;
}
}
}
// Check for match when two cards are flipped
function checkForMatch() {
var card1 = flippedCards[0];
var card2 = flippedCards[1];
LK.setTimeout(function () {
if (card1.symbol === card2.symbol) {
// Match found
LK.getSound('match').play();
card1.showMatch();
card2.showMatch();
matchedPairs++;
// Update score
LK.setScore(LK.getScore() + 100);
scoreText.setText(LK.getScore());
// Check if all pairs are matched
if (matchedPairs === requiredPairs) {
gameWon();
}
} else {
// No match, flip cards back
LK.getSound('nomatch').play();
card1.reset();
card2.reset();
}
flippedCards = [];
}, 1000);
}
// Timer update
function updateTimer() {
timeLeft--;
timerText.setText("Time: " + timeLeft);
// Time running out warning
if (timeLeft <= 10 && !timeWarningGiven) {
timeWarningGiven = true;
timerText.setStyle({
fill: 0xE74C3C
});
LK.getSound('timewarning').play();
}
// Game over if time runs out
if (timeLeft <= 0) {
gameOver();
}
}
// Game won
function gameWon() {
LK.clearInterval(gameTimer);
gameActive = false;
// Add time bonus
var timeBonus = timeLeft * 10;
LK.setScore(LK.getScore() + timeBonus);
scoreText.setText(LK.getScore());
// Update high score
if (LK.getScore() > storage.highScore) {
storage.highScore = LK.getScore();
}
// Update level
level++;
if (level > 5) {
level = 1; // Reset to level 1 after level 5
}
storage.currentLevel = level;
// Play win sound
LK.getSound('win').play();
// Show success message
LK.showYouWin();
}
// Game over
function gameOver() {
LK.clearInterval(gameTimer);
gameActive = false;
// Show game over screen
LK.showGameOver();
}
// Start a new game
function startGame() {
// Reset game state
matchedPairs = 0;
flippedCards = [];
timeWarningGiven = false;
LK.setScore(0);
scoreText.setText("0");
// Clear previous game
for (var i = 0; i < cards.length; i++) {
cards[i].destroy();
}
cards = [];
// Set up new game
setDifficulty();
createSymbols();
createBoard();
// Reset timer
timerText.setText("Time: " + timeLeft);
timerText.setStyle({
fill: 0xFFFFFF
});
// Start timer
if (gameTimer) {
LK.clearInterval(gameTimer);
}
gameTimer = LK.setInterval(updateTimer, 1000);
// Start game
gameActive = true;
// Play background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
}
// Create UI elements
var titleText = new Text2("Crazy Card Match", {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
var scoreText = new Text2("0", {
size: 60,
fill: 0x000000
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
scoreText.x = -10;
scoreText.y = 50;
var timerText = new Text2("Time: 60", {
size: 60,
fill: 0x000000
});
timerText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(timerText);
timerText.y = -10;
var levelText = new Text2("Level: " + level, {
size: 60,
fill: 0x000000
});
levelText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(levelText);
levelText.y = -100;
// Start the game
LK.setTimeout(function () {
startGame();
}, 500);
// Main game update loop
game.update = function () {
// Update level text (in case level changes)
levelText.setText("Level: " + level);
};
sheep. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
generate a cute cat image. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
generate a elephant. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
generate a monkey. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
lion. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
a colorful parrot. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
generate a butterfly. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
dolphin. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows