User prompt
change the numberkey text into black
User prompt
change the numberkey text color in black
User prompt
seperate the timer from panel asset
User prompt
align the position of tickkey with the buttons (3,6,9)
User prompt
align the position of 0key with the buttons (2,5,8)
User prompt
align the position of deletekey with the buttons (1,4,7)
User prompt
align the position of these buttons on the screen(deletekey,0,tick) with all other buttons in order\
User prompt
fix the position of these buttons on the screen(deletekey,0,tick)
User prompt
fix the position of these buttons on the screen(deletekey,0,tick)
User prompt
Please fix the bug: 'clearInterval is not a function' in or related to this line: 'clearInterval(timerInterval);' Line Number: 352
Code edit (1 edits merged)
Please save this source code
User prompt
Multiplication Master: Times Table Challenge
User prompt
add a winning screen popup for each correct guess at the end of each table
Initial prompt
create a mathematical game based on guessing the multiplications upto 20th table , give a player maximum of 3 lives or hearts as a health for each wrong guess it should reduce into one heart, set a timer for difficulty purpose , the user has to guess the answer and enter the number accordingly
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
completedTables: {}
});
/****
* Classes
****/
var Confetti = Container.expand(function (color) {
var self = Container.call(this);
var confettiGraphic = self.attachAsset('confetti', {
anchorX: 0.5,
anchorY: 0.5
});
confettiGraphic.tint = color || 0xf54242;
self.vx = Math.random() * 10 - 5;
self.vy = Math.random() * -15 - 5;
self.vr = (Math.random() - 0.5) * 0.2;
self.gravity = 0.3;
self.update = function () {
self.x += self.vx;
self.y += self.vy;
self.vy += self.gravity;
confettiGraphic.rotation += self.vr;
if (self.y > 2732) {
self.destroy();
var index = confetti.indexOf(self);
if (index > -1) {
confetti.splice(index, 1);
}
}
};
return self;
});
var Heart = Container.expand(function () {
var self = Container.call(this);
var heartGraphic = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
});
self.setActive = function (active) {
heartGraphic.alpha = active ? 1 : 0.3;
};
return self;
});
var NumberKey = Container.expand(function (number) {
var self = Container.call(this);
var keyGraphic = self.attachAsset('numberKey', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2(number.toString(), {
size: 90,
fill: 0xFFFFFF
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.number = number;
self.down = function (x, y, obj) {
keyGraphic.alpha = 0.7;
tween(keyGraphic, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
if (currentInput.length < 3) {
currentInput += self.number.toString();
updateInputDisplay();
}
};
self.up = function (x, y, obj) {
keyGraphic.alpha = 1;
tween(keyGraphic, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
};
return self;
});
var SpecialKey = Container.expand(function (type) {
var self = Container.call(this);
var keyGraphic = self.attachAsset(type === 'delete' ? 'deleteKey' : 'enterKey', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2(type === 'delete' ? "←" : "✓", {
size: 90,
fill: 0xFFFFFF
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.keyType = type;
self.down = function (x, y, obj) {
keyGraphic.alpha = 0.7;
tween(keyGraphic, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
if (type === 'delete') {
if (currentInput.length > 0) {
currentInput = currentInput.slice(0, -1);
updateInputDisplay();
}
} else if (type === 'enter') {
checkAnswer();
}
};
self.up = function (x, y, obj) {
keyGraphic.alpha = 1;
tween(keyGraphic, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xededed
});
/****
* Game Code
****/
// Global game variables
var currentTable = 1;
var currentQuestion = 0;
var score = 0;
var lives = 3;
var timer = 0;
var timerMax = 15;
var timerInterval;
var currentInput = "";
var hearts = [];
var confetti = [];
var questions = [];
var keypad = [];
var isGameOver = false;
var isLevelComplete = false;
// Game UI Elements
var panel = LK.getAsset('panel', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(panel);
// Score text
var scoreTxt = new Text2('Score: 0', {
size: 70,
fill: 0x333333
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 50;
scoreTxt.y = 50;
game.addChild(scoreTxt);
// Lives
for (var i = 0; i < 3; i++) {
var heart = new Heart();
heart.x = 2048 - 70 - i * 140;
heart.y = 70;
hearts.push(heart);
game.addChild(heart);
}
// Table display
var tableTxt = new Text2('Table: 1', {
size: 70,
fill: 0x333333
});
tableTxt.anchor.set(0.5, 0);
tableTxt.x = 2048 / 2;
tableTxt.y = 50;
game.addChild(tableTxt);
// Timer bar background
var timerBg = LK.getAsset('panel', {
anchorX: 0,
anchorY: 0,
x: 50,
y: 150,
width: 1948,
height: 50,
tint: 0xcccccc
});
game.addChild(timerBg);
// Timer bar fill
var timerFill = LK.getAsset('panel', {
anchorX: 0,
anchorY: 0,
x: 50,
y: 150,
width: 1948,
height: 50,
tint: 0x42f54e
});
game.addChild(timerFill);
// Question display
var questionTxt = new Text2('', {
size: 120,
fill: 0x333333
});
questionTxt.anchor.set(0.5, 0.5);
questionTxt.x = 2048 / 2;
questionTxt.y = 400;
game.addChild(questionTxt);
// Answer input display
var inputBox = LK.getAsset('inputBox', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 600
});
game.addChild(inputBox);
var inputTxt = new Text2('', {
size: 100,
fill: 0x333333
});
inputTxt.anchor.set(0.5, 0.5);
inputTxt.x = 2048 / 2;
inputTxt.y = 600;
game.addChild(inputTxt);
// Keypad
var keypadStartY = 900;
var keypadWidth = 700;
var keySize = 200;
// Create number keys 1-9
for (var row = 0; row < 3; row++) {
for (var col = 0; col < 3; col++) {
var num = row * 3 + col + 1;
var key = new NumberKey(num);
key.x = 2048 / 2 - keypadWidth / 2 + col * keySize + keySize / 2;
key.y = keypadStartY + row * keySize + keySize / 2;
keypad.push(key);
game.addChild(key);
}
}
// Create 0 key
var zeroKey = new NumberKey(0);
zeroKey.x = 2048 / 2; // Center the 0 key horizontally
zeroKey.y = keypadStartY + 3 * keySize + keySize / 2;
keypad.push(zeroKey);
game.addChild(zeroKey);
// Create delete key
var deleteKey = new SpecialKey('delete');
deleteKey.x = 2048 / 2 - keypadWidth / 2 + keySize / 2; // Align to the left of the keypad
deleteKey.y = keypadStartY + 3 * keySize + keySize / 2;
keypad.push(deleteKey);
game.addChild(deleteKey);
// Create enter key
var enterKey = new SpecialKey('enter');
enterKey.x = 2048 / 2 + keypadWidth / 2 - keySize / 2; // Align to the right of the keypad
enterKey.y = keypadStartY + 3 * keySize + keySize / 2;
keypad.push(enterKey);
game.addChild(enterKey);
// Level complete UI
var levelCompletePanel = LK.getAsset('panel', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
width: 1600,
height: 900,
visible: false
});
game.addChild(levelCompletePanel);
var levelCompleteTxt = new Text2('', {
size: 90,
fill: 0x333333
});
levelCompleteTxt.anchor.set(0.5, 0.5);
levelCompleteTxt.x = 2048 / 2;
levelCompleteTxt.y = 2732 / 2 - 200;
levelCompleteTxt.visible = false;
game.addChild(levelCompleteTxt);
var continueBtn = LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2 + 100,
visible: false
});
game.addChild(continueBtn);
var continueTxt = new Text2('Continue', {
size: 70,
fill: 0xFFFFFF
});
continueTxt.anchor.set(0.5, 0.5);
continueTxt.x = 2048 / 2;
continueTxt.y = 2732 / 2 + 100;
continueTxt.visible = false;
game.addChild(continueTxt);
// Game logic functions
function generateQuestions() {
questions = [];
for (var i = 1; i <= 10; i++) {
questions.push({
num1: currentTable,
num2: i,
answer: currentTable * i
});
}
// Shuffle questions
for (var i = questions.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = questions[i];
questions[i] = questions[j];
questions[j] = temp;
}
currentQuestion = 0;
showQuestion();
}
function showQuestion() {
if (currentQuestion >= questions.length) {
showLevelComplete();
return;
}
var q = questions[currentQuestion];
questionTxt.setText(q.num1 + " × " + q.num2 + " = ?");
currentInput = "";
updateInputDisplay();
// Reset and start timer
timer = timerMax;
updateTimerDisplay();
LK.clearInterval(timerInterval);
timerInterval = LK.setInterval(updateTimer, 100);
}
function updateTimer() {
timer -= 0.1;
updateTimerDisplay();
if (timer <= 0) {
LK.clearInterval(timerInterval);
handleWrongAnswer();
}
}
function updateTimerDisplay() {
var percentage = Math.max(0, timer / timerMax);
timerFill.width = 1948 * percentage;
// Change color based on time left
if (percentage > 0.6) {
timerFill.tint = 0x42f54e; // Green
} else if (percentage > 0.3) {
timerFill.tint = 0xf5d442; // Yellow
} else {
timerFill.tint = 0xf54242; // Red
}
}
function updateInputDisplay() {
inputTxt.setText(currentInput);
}
function checkAnswer() {
if (currentInput === "") {
return;
}
var userAnswer = parseInt(currentInput, 10);
var correctAnswer = questions[currentQuestion].answer;
if (userAnswer === correctAnswer) {
handleCorrectAnswer();
} else {
handleWrongAnswer();
}
}
function handleCorrectAnswer() {
LK.clearInterval(timerInterval);
LK.getSound('correct').play();
score += Math.ceil(timer); // More points for faster answers
scoreTxt.setText('Score: ' + score);
// Flash input box green
tween(inputBox, {
tint: 0x42f54e
}, {
duration: 300,
onFinish: function onFinish() {
tween(inputBox, {
tint: 0xffffff
}, {
duration: 300
});
}
});
currentQuestion++;
// Move to next question after a short delay
LK.setTimeout(function () {
showQuestion();
}, 700);
}
function handleWrongAnswer() {
LK.clearInterval(timerInterval);
LK.getSound('incorrect').play();
// Show correct answer
inputTxt.setText(questions[currentQuestion].answer);
// Flash input box red
tween(inputBox, {
tint: 0xf54242
}, {
duration: 300,
onFinish: function onFinish() {
tween(inputBox, {
tint: 0xffffff
}, {
duration: 300
});
}
});
// Decrease lives
lives--;
hearts[lives].setActive(false);
if (lives <= 0) {
// Game over
LK.setTimeout(function () {
isGameOver = true;
// Save high score if applicable
if (score > storage.highScore) {
storage.highScore = score;
}
LK.showGameOver();
}, 1500);
} else {
// Continue to next question after showing the correct answer
currentQuestion++;
LK.setTimeout(function () {
showQuestion();
}, 1500);
}
}
function showLevelComplete() {
isLevelComplete = true;
LK.clearInterval(timerInterval);
LK.getSound('levelComplete').play();
// Mark this table as completed in storage
storage.completedTables[currentTable] = true;
levelCompletePanel.visible = true;
levelCompleteTxt.setText("Great job!\nYou've mastered the " + currentTable + " times table!");
levelCompleteTxt.visible = true;
continueBtn.visible = true;
continueTxt.visible = true;
// Create celebration confetti
for (var i = 0; i < 50; i++) {
createConfetti();
}
// Create more confetti every 300ms
var confettiInterval = LK.setInterval(function () {
for (var i = 0; i < 10; i++) {
createConfetti();
}
}, 300);
// Stop creating confetti after 2 seconds
LK.setTimeout(function () {
LK.clearInterval(confettiInterval);
}, 2000);
}
function createConfetti() {
var colors = [0xf54242, 0x42f54e, 0x4287f5, 0xf5d442, 0xf542f5];
var conf = new Confetti(colors[Math.floor(Math.random() * colors.length)]);
conf.x = Math.random() * 2048;
conf.y = Math.random() * 1000;
confetti.push(conf);
game.addChild(conf);
}
function startNextLevel() {
// Increase difficulty
currentTable++;
if (currentTable > 20) {
// Player completed all tables
LK.showYouWin();
return;
}
// Reduce timer max for higher tables to increase difficulty
timerMax = Math.max(5, 15 - Math.floor(currentTable / 4));
// Reset UI
tableTxt.setText('Table: ' + currentTable);
levelCompletePanel.visible = false;
levelCompleteTxt.visible = false;
continueBtn.visible = false;
continueTxt.visible = false;
isLevelComplete = false;
// Generate new questions
generateQuestions();
}
// Event handlers
continueBtn.down = function (x, y, obj) {
tween(continueBtn, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
};
continueBtn.up = function (x, y, obj) {
tween(continueBtn, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
startNextLevel();
};
// Update function
game.update = function () {
// Update confetti if level complete is showing
if (isLevelComplete) {
for (var i = 0; i < confetti.length; i++) {
confetti[i].update();
}
}
};
// Start game
function initGame() {
// Reset game variables
currentTable = 1;
score = 0;
lives = 3;
isGameOver = false;
isLevelComplete = false;
// Update UI
scoreTxt.setText('Score: 0');
tableTxt.setText('Table: ' + currentTable);
// Reset hearts
for (var i = 0; i < hearts.length; i++) {
hearts[i].setActive(true);
}
// Hide level complete UI
levelCompletePanel.visible = false;
levelCompleteTxt.visible = false;
continueBtn.visible = false;
continueTxt.visible = false;
// Remove any confetti
for (var i = confetti.length - 1; i >= 0; i--) {
confetti[i].destroy();
confetti.splice(i, 1);
}
// Start with the current table
generateQuestions();
// Play background music
LK.playMusic('bgMusic');
}
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -250,9 +250,9 @@
}
}
// Create 0 key
var zeroKey = new NumberKey(0);
-zeroKey.x = 2048 / 2; // Center the 0 key
+zeroKey.x = 2048 / 2; // Center the 0 key horizontally
zeroKey.y = keypadStartY + 3 * keySize + keySize / 2;
keypad.push(zeroKey);
game.addChild(zeroKey);
// Create delete key