/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var AnswerButton = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('answerButton', { anchorX: 0.5, anchorY: 0.5 }); self.answerText = new Text2('0', { size: 40, fill: 0xFFFFFF }); self.answerText.anchor.set(0.5, 0.5); self.addChild(self.answerText); self.answer = 0; self.isCorrect = false; self.setAnswer = function (value, correct) { self.answer = value; self.isCorrect = correct; self.answerText.setText(value.toString()); }; self.down = function (x, y, obj) { if (currentEnemyTarget && !currentEnemyTarget.hasBeenAnswered) { currentEnemyTarget.hasBeenAnswered = true; if (self.isCorrect) { handleCorrectAnswer(); } else { handleWrongAnswer(); } } }; return self; }); var EnemyNinja = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('enemyNinja', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.problem = null; self.correctAnswer = 0; self.hasBeenAnswered = false; self.update = function () { self.y += self.speed; }; return self; }); var PlayerNinja = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('playerNinja', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.collected = false; self.update = function () { self.y += self.speed; self.rotation += 0.05; if (self.intersects(player)) { if (!self.collected) { self.collected = true; player.health = Math.min(player.health + 20, player.maxHealth); updateHealthBar(); LK.getSound('powerUpCollect').play(); LK.effects.flashObject(player, 0xFFEB3B, 500); self.destroy(); powerUps.splice(powerUps.indexOf(self), 1); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1A1A2E }); /**** * Game Code ****/ var player = game.addChild(new PlayerNinja()); player.x = 2048 / 2; player.y = 2732 - 200; var enemies = []; var answerButtons = []; var powerUps = []; var currentEnemyTarget = null; var consecutiveCorrect = 0; var gameLevel = 1; var spawnTimer = 0; var problemTypes = ['+', '-', '×', '÷']; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; scoreText.y = 20; var healthBarBg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 }); healthBarBg.tint = 0x333333; LK.gui.top.addChild(healthBarBg); healthBarBg.x = -150; healthBarBg.y = 20; var healthBarFg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 }); LK.gui.top.addChild(healthBarFg); healthBarFg.x = -150; healthBarFg.y = 20; var levelText = new Text2('Level: 1', { size: 50, fill: 0xFFFFFF }); levelText.anchor.set(1, 0); LK.gui.topRight.addChild(levelText); levelText.x = -20; levelText.y = 20; // Initialize answer buttons for (var i = 0; i < 4; i++) { var button = game.addChild(new AnswerButton()); button.x = 400 + i * 200; button.y = 2732 - 120; answerButtons.push(button); } function generateMathProblem() { var operation = problemTypes[Math.floor(Math.random() * Math.min(problemTypes.length, Math.ceil(gameLevel / 2)))]; var num1, num2, answer; var range = Math.min(5 + gameLevel * 2, 20); switch (operation) { case '+': num1 = Math.floor(Math.random() * range) + 1; num2 = Math.floor(Math.random() * range) + 1; answer = num1 + num2; break; case '-': num1 = Math.floor(Math.random() * range) + range; num2 = Math.floor(Math.random() * range) + 1; answer = num1 - num2; break; case '×': num1 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; num2 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; answer = num1 * num2; break; case '÷': answer = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; num2 = Math.floor(Math.random() * Math.min(range / 2, 8)) + 1; num1 = answer * num2; break; } return { text: num1 + ' ' + operation + ' ' + num2, answer: answer }; } function createEnemyWithProblem() { var enemy = game.addChild(new EnemyNinja()); enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = -50; var problem = generateMathProblem(); enemy.problem = problem; enemy.correctAnswer = problem.answer; var problemText = new Text2(problem.text, { size: 36, fill: 0xFFFFFF }); problemText.anchor.set(0.5, 0.5); problemText.y = -60; enemy.addChild(problemText); enemies.push(enemy); currentEnemyTarget = enemy; // Generate answer options var correctAnswer = problem.answer; var answers = [correctAnswer]; // Generate wrong answers while (answers.length < 4) { var wrongAnswer; if (Math.random() < 0.5) { wrongAnswer = correctAnswer + Math.floor(Math.random() * 10) - 5; } else { wrongAnswer = Math.floor(Math.random() * (correctAnswer + 20)) + 1; } if (wrongAnswer !== correctAnswer && answers.indexOf(wrongAnswer) === -1 && wrongAnswer > 0) { answers.push(wrongAnswer); } } // Shuffle answers for (var i = answers.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = answers[i]; answers[i] = answers[j]; answers[j] = temp; } // Set button answers for (var i = 0; i < 4; i++) { answerButtons[i].setAnswer(answers[i], answers[i] === correctAnswer); } } function handleCorrectAnswer() { if (currentEnemyTarget) { LK.getSound('correctAnswer').play(); LK.setScore(LK.getScore() + 10 + gameLevel * 5); scoreText.setText('Score: ' + LK.getScore()); consecutiveCorrect++; LK.effects.flashObject(currentEnemyTarget, 0x00FF00, 300); tween(currentEnemyTarget, { alpha: 0, scaleX: 0, scaleY: 0 }, { duration: 300, onFinish: function onFinish() { if (currentEnemyTarget && enemies.indexOf(currentEnemyTarget) !== -1) { currentEnemyTarget.destroy(); enemies.splice(enemies.indexOf(currentEnemyTarget), 1); } } }); currentEnemyTarget = null; // Spawn power-up after 3 consecutive correct answers if (consecutiveCorrect >= 3 && Math.random() < 0.7) { spawnPowerUp(); consecutiveCorrect = 0; } // Level progression if (LK.getScore() > 0 && LK.getScore() % 100 === 0) { gameLevel++; levelText.setText('Level: ' + gameLevel); LK.effects.flashScreen(0x00FF00, 500); } } } function handleWrongAnswer() { LK.getSound('wrongAnswer').play(); player.health -= 25; consecutiveCorrect = 0; updateHealthBar(); LK.effects.flashObject(player, 0xFF0000, 500); if (player.health <= 0) { LK.showGameOver(); return; } currentEnemyTarget = null; } function spawnPowerUp() { var powerUp = game.addChild(new PowerUp()); powerUp.x = Math.random() * (2048 - 100) + 50; powerUp.y = -30; powerUps.push(powerUp); } function updateHealthBar() { var healthPercent = player.health / player.maxHealth; healthBarFg.scaleX = healthPercent; if (healthPercent > 0.6) { healthBarFg.tint = 0x4CAF50; } else if (healthPercent > 0.3) { healthBarFg.tint = 0xFF9800; } else { healthBarFg.tint = 0xF44336; } } game.update = function () { spawnTimer++; // Spawn new enemies if (enemies.length === 0 || spawnTimer > 180 && Math.random() < 0.02) { if (enemies.length === 0 || !currentEnemyTarget || currentEnemyTarget.hasBeenAnswered) { createEnemyWithProblem(); spawnTimer = 0; } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Check if enemy reached player if (enemy.y > player.y - 100) { if (!enemy.hasBeenAnswered) { player.health -= 20; updateHealthBar(); LK.effects.flashObject(player, 0xFF0000, 400); if (player.health <= 0) { LK.showGameOver(); return; } } enemy.destroy(); enemies.splice(i, 1); if (enemy === currentEnemyTarget) { currentEnemyTarget = null; } continue; } // Remove enemies that are off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(i, 1); if (enemy === currentEnemyTarget) { currentEnemyTarget = null; } } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; if (powerUp.y > 2732 + 100 || powerUp.collected) { if (!powerUp.collected) { powerUp.destroy(); } powerUps.splice(i, 1); } } // Increase enemy speed over time for (var i = 0; i < enemies.length; i++) { enemies[i].speed = 2 + gameLevel * 0.3; } }; // Initialize health bar updateHealthBar(); // Create first enemy LK.setTimeout(function () { createEnemyWithProblem(); }, 1000);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AnswerButton = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('answerButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.answerText = new Text2('0', {
size: 40,
fill: 0xFFFFFF
});
self.answerText.anchor.set(0.5, 0.5);
self.addChild(self.answerText);
self.answer = 0;
self.isCorrect = false;
self.setAnswer = function (value, correct) {
self.answer = value;
self.isCorrect = correct;
self.answerText.setText(value.toString());
};
self.down = function (x, y, obj) {
if (currentEnemyTarget && !currentEnemyTarget.hasBeenAnswered) {
currentEnemyTarget.hasBeenAnswered = true;
if (self.isCorrect) {
handleCorrectAnswer();
} else {
handleWrongAnswer();
}
}
};
return self;
});
var EnemyNinja = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemyNinja', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.problem = null;
self.correctAnswer = 0;
self.hasBeenAnswered = false;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerNinja = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('playerNinja', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.collected = false;
self.update = function () {
self.y += self.speed;
self.rotation += 0.05;
if (self.intersects(player)) {
if (!self.collected) {
self.collected = true;
player.health = Math.min(player.health + 20, player.maxHealth);
updateHealthBar();
LK.getSound('powerUpCollect').play();
LK.effects.flashObject(player, 0xFFEB3B, 500);
self.destroy();
powerUps.splice(powerUps.indexOf(self), 1);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1A1A2E
});
/****
* Game Code
****/
var player = game.addChild(new PlayerNinja());
player.x = 2048 / 2;
player.y = 2732 - 200;
var enemies = [];
var answerButtons = [];
var powerUps = [];
var currentEnemyTarget = null;
var consecutiveCorrect = 0;
var gameLevel = 1;
var spawnTimer = 0;
var problemTypes = ['+', '-', '×', '÷'];
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreText);
scoreText.x = 120;
scoreText.y = 20;
var healthBarBg = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
scaleX: 1,
scaleY: 1
});
healthBarBg.tint = 0x333333;
LK.gui.top.addChild(healthBarBg);
healthBarBg.x = -150;
healthBarBg.y = 20;
var healthBarFg = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
scaleX: 1,
scaleY: 1
});
LK.gui.top.addChild(healthBarFg);
healthBarFg.x = -150;
healthBarFg.y = 20;
var levelText = new Text2('Level: 1', {
size: 50,
fill: 0xFFFFFF
});
levelText.anchor.set(1, 0);
LK.gui.topRight.addChild(levelText);
levelText.x = -20;
levelText.y = 20;
// Initialize answer buttons
for (var i = 0; i < 4; i++) {
var button = game.addChild(new AnswerButton());
button.x = 400 + i * 200;
button.y = 2732 - 120;
answerButtons.push(button);
}
function generateMathProblem() {
var operation = problemTypes[Math.floor(Math.random() * Math.min(problemTypes.length, Math.ceil(gameLevel / 2)))];
var num1, num2, answer;
var range = Math.min(5 + gameLevel * 2, 20);
switch (operation) {
case '+':
num1 = Math.floor(Math.random() * range) + 1;
num2 = Math.floor(Math.random() * range) + 1;
answer = num1 + num2;
break;
case '-':
num1 = Math.floor(Math.random() * range) + range;
num2 = Math.floor(Math.random() * range) + 1;
answer = num1 - num2;
break;
case '×':
num1 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
num2 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
answer = num1 * num2;
break;
case '÷':
answer = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
num2 = Math.floor(Math.random() * Math.min(range / 2, 8)) + 1;
num1 = answer * num2;
break;
}
return {
text: num1 + ' ' + operation + ' ' + num2,
answer: answer
};
}
function createEnemyWithProblem() {
var enemy = game.addChild(new EnemyNinja());
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -50;
var problem = generateMathProblem();
enemy.problem = problem;
enemy.correctAnswer = problem.answer;
var problemText = new Text2(problem.text, {
size: 36,
fill: 0xFFFFFF
});
problemText.anchor.set(0.5, 0.5);
problemText.y = -60;
enemy.addChild(problemText);
enemies.push(enemy);
currentEnemyTarget = enemy;
// Generate answer options
var correctAnswer = problem.answer;
var answers = [correctAnswer];
// Generate wrong answers
while (answers.length < 4) {
var wrongAnswer;
if (Math.random() < 0.5) {
wrongAnswer = correctAnswer + Math.floor(Math.random() * 10) - 5;
} else {
wrongAnswer = Math.floor(Math.random() * (correctAnswer + 20)) + 1;
}
if (wrongAnswer !== correctAnswer && answers.indexOf(wrongAnswer) === -1 && wrongAnswer > 0) {
answers.push(wrongAnswer);
}
}
// Shuffle answers
for (var i = answers.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = answers[i];
answers[i] = answers[j];
answers[j] = temp;
}
// Set button answers
for (var i = 0; i < 4; i++) {
answerButtons[i].setAnswer(answers[i], answers[i] === correctAnswer);
}
}
function handleCorrectAnswer() {
if (currentEnemyTarget) {
LK.getSound('correctAnswer').play();
LK.setScore(LK.getScore() + 10 + gameLevel * 5);
scoreText.setText('Score: ' + LK.getScore());
consecutiveCorrect++;
LK.effects.flashObject(currentEnemyTarget, 0x00FF00, 300);
tween(currentEnemyTarget, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 300,
onFinish: function onFinish() {
if (currentEnemyTarget && enemies.indexOf(currentEnemyTarget) !== -1) {
currentEnemyTarget.destroy();
enemies.splice(enemies.indexOf(currentEnemyTarget), 1);
}
}
});
currentEnemyTarget = null;
// Spawn power-up after 3 consecutive correct answers
if (consecutiveCorrect >= 3 && Math.random() < 0.7) {
spawnPowerUp();
consecutiveCorrect = 0;
}
// Level progression
if (LK.getScore() > 0 && LK.getScore() % 100 === 0) {
gameLevel++;
levelText.setText('Level: ' + gameLevel);
LK.effects.flashScreen(0x00FF00, 500);
}
}
}
function handleWrongAnswer() {
LK.getSound('wrongAnswer').play();
player.health -= 25;
consecutiveCorrect = 0;
updateHealthBar();
LK.effects.flashObject(player, 0xFF0000, 500);
if (player.health <= 0) {
LK.showGameOver();
return;
}
currentEnemyTarget = null;
}
function spawnPowerUp() {
var powerUp = game.addChild(new PowerUp());
powerUp.x = Math.random() * (2048 - 100) + 50;
powerUp.y = -30;
powerUps.push(powerUp);
}
function updateHealthBar() {
var healthPercent = player.health / player.maxHealth;
healthBarFg.scaleX = healthPercent;
if (healthPercent > 0.6) {
healthBarFg.tint = 0x4CAF50;
} else if (healthPercent > 0.3) {
healthBarFg.tint = 0xFF9800;
} else {
healthBarFg.tint = 0xF44336;
}
}
game.update = function () {
spawnTimer++;
// Spawn new enemies
if (enemies.length === 0 || spawnTimer > 180 && Math.random() < 0.02) {
if (enemies.length === 0 || !currentEnemyTarget || currentEnemyTarget.hasBeenAnswered) {
createEnemyWithProblem();
spawnTimer = 0;
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Check if enemy reached player
if (enemy.y > player.y - 100) {
if (!enemy.hasBeenAnswered) {
player.health -= 20;
updateHealthBar();
LK.effects.flashObject(player, 0xFF0000, 400);
if (player.health <= 0) {
LK.showGameOver();
return;
}
}
enemy.destroy();
enemies.splice(i, 1);
if (enemy === currentEnemyTarget) {
currentEnemyTarget = null;
}
continue;
}
// Remove enemies that are off screen
if (enemy.y > 2732 + 100) {
enemy.destroy();
enemies.splice(i, 1);
if (enemy === currentEnemyTarget) {
currentEnemyTarget = null;
}
}
}
// Update power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.y > 2732 + 100 || powerUp.collected) {
if (!powerUp.collected) {
powerUp.destroy();
}
powerUps.splice(i, 1);
}
}
// Increase enemy speed over time
for (var i = 0; i < enemies.length; i++) {
enemies[i].speed = 2 + gameLevel * 0.3;
}
};
// Initialize health bar
updateHealthBar();
// Create first enemy
LK.setTimeout(function () {
createEnemyWithProblem();
}, 1000);