User prompt
First level has 4 tiles.
User prompt
Each level has 2 minute timer, 15 move limit, and +6 tiles.
User prompt
Matching titles earns five coins. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Memory Match
Initial prompt
# Initialize Pygame pygame.init() # Set up display WIDTH, HEIGHT = 600, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Memory Matching Game") font = pygame.font.Font(None, 74) # Colors WHITE = (255, 255, 255) BLACK = (0, 0, 0) GREEN = (0, 255, 0) RED = (255, 0, 0)
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Card = Container.expand(function (symbolType) {
var self = Container.call(this);
self.symbolType = symbolType;
self.isFlipped = false;
self.isMatched = false;
self.canFlip = true;
// Card back (always visible when not flipped)
var cardBack = self.attachAsset('cardBack', {
anchorX: 0.5,
anchorY: 0.5
});
// Card front (white background)
var cardFront = self.attachAsset('cardFront', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Symbol on the card
var symbol = self.attachAsset('symbol' + symbolType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.flip = function () {
if (!self.canFlip || self.isMatched) return;
LK.getSound('cardFlip').play();
self.isFlipped = !self.isFlipped;
if (self.isFlipped) {
// Show front and symbol
tween(cardFront, {
alpha: 1
}, {
duration: 200
});
tween(symbol, {
alpha: 1
}, {
duration: 200
});
} else {
// Hide front and symbol
tween(cardFront, {
alpha: 0
}, {
duration: 200
});
tween(symbol, {
alpha: 0
}, {
duration: 200
});
}
};
self.setMatched = function () {
self.isMatched = true;
self.canFlip = false;
// Add a subtle scale effect for matched cards
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
easing: tween.easeOut
});
};
self.down = function (x, y, obj) {
if (self.canFlip && !self.isFlipped && !self.isMatched) {
handleCardTap(self);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Game variables
var cards = [];
var flippedCards = [];
var moves = 0;
var startTime = Date.now();
var gameCompleted = false;
var canFlipCards = true;
// Grid configuration
var GRID_COLS = 4;
var GRID_ROWS = 4;
var CARD_SIZE = 200;
var CARD_SPACING = 20;
// UI elements
var movesTxt = new Text2('Moves: 0', {
size: 60,
fill: 0xFFFFFF
});
movesTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(movesTxt);
movesTxt.y = 100;
var timerTxt = new Text2('Time: 0:00', {
size: 60,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
timerTxt.y = 180;
// Create card types array (8 pairs)
var cardTypes = [];
for (var i = 1; i <= 8; i++) {
cardTypes.push(i);
cardTypes.push(i); // Add pair
}
// Shuffle function
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;
}
return array;
}
// Initialize cards
function initializeCards() {
var shuffledTypes = shuffleArray(cardTypes);
// Calculate grid positioning
var gridWidth = GRID_COLS * CARD_SIZE + (GRID_COLS - 1) * CARD_SPACING;
var gridHeight = GRID_ROWS * CARD_SIZE + (GRID_ROWS - 1) * CARD_SPACING;
var startX = (2048 - gridWidth) / 2 + CARD_SIZE / 2;
var startY = (2732 - gridHeight) / 2 + CARD_SIZE / 2;
for (var row = 0; row < GRID_ROWS; row++) {
for (var col = 0; col < GRID_COLS; col++) {
var index = row * GRID_COLS + col;
var card = new Card(shuffledTypes[index]);
card.x = startX + col * (CARD_SIZE + CARD_SPACING);
card.y = startY + row * (CARD_SIZE + CARD_SPACING);
cards.push(card);
game.addChild(card);
}
}
}
// Handle card tap
function handleCardTap(card) {
if (!canFlipCards || flippedCards.length >= 2) return;
card.flip();
flippedCards.push(card);
if (flippedCards.length === 2) {
moves++;
movesTxt.setText('Moves: ' + moves);
canFlipCards = false;
// Check for match after a short delay
LK.setTimeout(function () {
checkForMatch();
}, 1000);
}
}
// Check if two flipped cards match
function checkForMatch() {
var card1 = flippedCards[0];
var card2 = flippedCards[1];
if (card1.symbolType === card2.symbolType) {
// Match found
LK.getSound('match').play();
card1.setMatched();
card2.setMatched();
// Check if game is complete
var matchedCount = 0;
for (var i = 0; i < cards.length; i++) {
if (cards[i].isMatched) {
matchedCount++;
}
}
if (matchedCount === cards.length) {
gameCompleted = true;
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
}
} else {
// No match
LK.getSound('noMatch').play();
card1.flip();
card2.flip();
}
flippedCards = [];
canFlipCards = true;
}
// Format time display
function formatTime(seconds) {
var minutes = Math.floor(seconds / 60);
var remainingSeconds = seconds % 60;
return minutes + ':' + (remainingSeconds < 10 ? '0' : '') + remainingSeconds;
}
// Initialize the game
initializeCards();
// Main game update loop
game.update = function () {
// Update timer
if (!gameCompleted) {
var elapsedTime = Math.floor((Date.now() - startTime) / 1000);
timerTxt.setText('Time: ' + formatTime(elapsedTime));
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,215 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Card = Container.expand(function (symbolType) {
+ var self = Container.call(this);
+ self.symbolType = symbolType;
+ self.isFlipped = false;
+ self.isMatched = false;
+ self.canFlip = true;
+ // Card back (always visible when not flipped)
+ var cardBack = self.attachAsset('cardBack', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Card front (white background)
+ var cardFront = self.attachAsset('cardFront', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ // Symbol on the card
+ var symbol = self.attachAsset('symbol' + symbolType, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ self.flip = function () {
+ if (!self.canFlip || self.isMatched) return;
+ LK.getSound('cardFlip').play();
+ self.isFlipped = !self.isFlipped;
+ if (self.isFlipped) {
+ // Show front and symbol
+ tween(cardFront, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ tween(symbol, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ } else {
+ // Hide front and symbol
+ tween(cardFront, {
+ alpha: 0
+ }, {
+ duration: 200
+ });
+ tween(symbol, {
+ alpha: 0
+ }, {
+ duration: 200
+ });
+ }
+ };
+ self.setMatched = function () {
+ self.isMatched = true;
+ self.canFlip = false;
+ // Add a subtle scale effect for matched cards
+ tween(self, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ };
+ self.down = function (x, y, obj) {
+ if (self.canFlip && !self.isFlipped && !self.isMatched) {
+ handleCardTap(self);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2c3e50
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var cards = [];
+var flippedCards = [];
+var moves = 0;
+var startTime = Date.now();
+var gameCompleted = false;
+var canFlipCards = true;
+// Grid configuration
+var GRID_COLS = 4;
+var GRID_ROWS = 4;
+var CARD_SIZE = 200;
+var CARD_SPACING = 20;
+// UI elements
+var movesTxt = new Text2('Moves: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+movesTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(movesTxt);
+movesTxt.y = 100;
+var timerTxt = new Text2('Time: 0:00', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+timerTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(timerTxt);
+timerTxt.y = 180;
+// Create card types array (8 pairs)
+var cardTypes = [];
+for (var i = 1; i <= 8; i++) {
+ cardTypes.push(i);
+ cardTypes.push(i); // Add pair
+}
+// Shuffle function
+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;
+ }
+ return array;
+}
+// Initialize cards
+function initializeCards() {
+ var shuffledTypes = shuffleArray(cardTypes);
+ // Calculate grid positioning
+ var gridWidth = GRID_COLS * CARD_SIZE + (GRID_COLS - 1) * CARD_SPACING;
+ var gridHeight = GRID_ROWS * CARD_SIZE + (GRID_ROWS - 1) * CARD_SPACING;
+ var startX = (2048 - gridWidth) / 2 + CARD_SIZE / 2;
+ var startY = (2732 - gridHeight) / 2 + CARD_SIZE / 2;
+ for (var row = 0; row < GRID_ROWS; row++) {
+ for (var col = 0; col < GRID_COLS; col++) {
+ var index = row * GRID_COLS + col;
+ var card = new Card(shuffledTypes[index]);
+ card.x = startX + col * (CARD_SIZE + CARD_SPACING);
+ card.y = startY + row * (CARD_SIZE + CARD_SPACING);
+ cards.push(card);
+ game.addChild(card);
+ }
+ }
+}
+// Handle card tap
+function handleCardTap(card) {
+ if (!canFlipCards || flippedCards.length >= 2) return;
+ card.flip();
+ flippedCards.push(card);
+ if (flippedCards.length === 2) {
+ moves++;
+ movesTxt.setText('Moves: ' + moves);
+ canFlipCards = false;
+ // Check for match after a short delay
+ LK.setTimeout(function () {
+ checkForMatch();
+ }, 1000);
+ }
+}
+// Check if two flipped cards match
+function checkForMatch() {
+ var card1 = flippedCards[0];
+ var card2 = flippedCards[1];
+ if (card1.symbolType === card2.symbolType) {
+ // Match found
+ LK.getSound('match').play();
+ card1.setMatched();
+ card2.setMatched();
+ // Check if game is complete
+ var matchedCount = 0;
+ for (var i = 0; i < cards.length; i++) {
+ if (cards[i].isMatched) {
+ matchedCount++;
+ }
+ }
+ if (matchedCount === cards.length) {
+ gameCompleted = true;
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 500);
+ }
+ } else {
+ // No match
+ LK.getSound('noMatch').play();
+ card1.flip();
+ card2.flip();
+ }
+ flippedCards = [];
+ canFlipCards = true;
+}
+// Format time display
+function formatTime(seconds) {
+ var minutes = Math.floor(seconds / 60);
+ var remainingSeconds = seconds % 60;
+ return minutes + ':' + (remainingSeconds < 10 ? '0' : '') + remainingSeconds;
+}
+// Initialize the game
+initializeCards();
+// Main game update loop
+game.update = function () {
+ // Update timer
+ if (!gameCompleted) {
+ var elapsedTime = Math.floor((Date.now() - startTime) / 1000);
+ timerTxt.setText('Time: ' + formatTime(elapsedTime));
+ }
+};
\ No newline at end of file