/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var FallingNumber = Container.expand(function (value, isBonus) { var self = Container.call(this); self.value = value; self.isBonus = isBonus || false; self.fallSpeed = 3 + Math.random() * 2; self.collected = false; var bgAsset = self.isBonus ? 'bonusBg' : 'numberBg'; var background = self.attachAsset(bgAsset, { anchorX: 0.5, anchorY: 0.5 }); var numberText = new Text2(value.toString(), { size: 60, fill: 0xFFFFFF }); numberText.anchor.set(0.5, 0.5); self.addChild(numberText); if (self.isBonus) { background.tint = 0xFFD700; tween(background, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(background, { scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.easeInOut }); } }); } self.update = function () { if (!self.collected) { self.y += self.fallSpeed; } }; self.down = function (x, y, obj) { if (!self.collected) { self.collected = true; collectItem(self); } }; return self; }); var FallingOperator = Container.expand(function (operator) { var self = Container.call(this); self.value = operator; self.fallSpeed = 3 + Math.random() * 2; self.collected = false; var background = self.attachAsset('operatorBg', { anchorX: 0.5, anchorY: 0.5 }); var operatorText = new Text2(operator, { size: 70, fill: 0xFFFFFF }); operatorText.anchor.set(0.5, 0.5); self.addChild(operatorText); self.update = function () { if (!self.collected) { self.y += self.fallSpeed; } }; self.down = function (x, y, obj) { if (!self.collected) { self.collected = true; collectItem(self); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var fallingItems = []; var currentEquation = []; var gameSpeed = 1; var spawnTimer = 0; var maxItemsOnScreen = 8; var consecutiveCorrect = 0; var gameLevel = 1; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topRight.addChild(scoreText); scoreText.x = -20; scoreText.y = 20; var levelText = new Text2('Level: 1', { size: 50, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); LK.gui.topRight.addChild(levelText); levelText.x = -20; levelText.y = 90; var equationDisplay = new Text2('', { size: 80, fill: 0x000000 }); equationDisplay.anchor.set(0.5, 0.5); var equationContainer = game.addChild(new Container()); equationContainer.x = 1024; equationContainer.y = 150; var equationBg = equationContainer.attachAsset('equationBar', { anchorX: 0.5, anchorY: 0.5 }); equationContainer.addChild(equationDisplay); function getRandomNumber() { var maxNum = Math.min(9, Math.floor(gameLevel / 2) + 3); return Math.floor(Math.random() * maxNum) + 1; } function getRandomOperator() { var operators = ['+', '-']; if (gameLevel > 3) operators.push('×'); if (gameLevel > 5) operators.push('÷'); return operators[Math.floor(Math.random() * operators.length)]; } function spawnItem() { if (fallingItems.length >= maxItemsOnScreen) return; var x = 200 + Math.random() * 1648; var y = -100; var item; if (Math.random() < 0.3) { // Spawn operator item = new FallingOperator(getRandomOperator()); } else { // Spawn number var isBonus = Math.random() < 0.1 && gameLevel > 2; item = new FallingNumber(getRandomNumber(), isBonus); } item.x = x; item.y = y; fallingItems.push(item); game.addChild(item); } function collectItem(item) { currentEquation.push(item.value); updateEquationDisplay(); LK.getSound('collect').play(); tween(item, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 200, onFinish: function onFinish() { removeItem(item); } }); checkEquation(); } function updateEquationDisplay() { equationDisplay.setText(currentEquation.join(' ')); } function checkEquation() { if (currentEquation.length >= 3) { var equation = currentEquation.join(''); if (isValidEquation()) { evaluateEquation(); } } } function isValidEquation() { if (currentEquation.length < 3) return false; // Check pattern: number operator number var hasNumber1 = typeof currentEquation[0] === 'number'; var hasOperator = typeof currentEquation[1] === 'string' && ['+', '-', '×', '÷'].includes(currentEquation[1]); var hasNumber2 = typeof currentEquation[2] === 'number'; return hasNumber1 && hasOperator && hasNumber2; } function evaluateEquation() { var num1 = currentEquation[0]; var operator = currentEquation[1]; var num2 = currentEquation[2]; var result; switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '×': result = num1 * num2; break; case '÷': result = Math.floor(num1 / num2); break; } var points = calculatePoints(num1, operator, num2); LK.setScore(LK.getScore() + points); scoreText.setText('Score: ' + LK.getScore()); consecutiveCorrect++; LK.getSound('correct').play(); LK.effects.flashObject(equationContainer, 0x00FF00, 500); currentEquation = []; updateEquationDisplay(); // Level progression if (LK.getScore() > gameLevel * 500) { gameLevel++; levelText.setText('Level: ' + gameLevel); gameSpeed += 0.2; maxItemsOnScreen = Math.min(12, maxItemsOnScreen + 1); } } function calculatePoints(num1, operator, num2) { var basePoints = 10; switch (operator) { case '+': case '-': basePoints = 10; break; case '×': basePoints = 20; break; case '÷': basePoints = 25; break; } // Bonus for consecutive correct answers basePoints += consecutiveCorrect * 5; return basePoints; } function removeItem(item) { var index = fallingItems.indexOf(item); if (index > -1) { fallingItems.splice(index, 1); } item.destroy(); } function checkGameOver() { var itemsAtBottom = 0; for (var i = 0; i < fallingItems.length; i++) { if (fallingItems[i].y > 2732) { itemsAtBottom++; } } if (itemsAtBottom >= 5) { LK.showGameOver(); } } game.update = function () { spawnTimer++; var spawnRate = Math.max(30, 120 - gameLevel * 10); if (spawnTimer >= spawnRate) { spawnItem(); spawnTimer = 0; } // Remove items that have fallen off screen for (var i = fallingItems.length - 1; i >= 0; i--) { var item = fallingItems[i]; if (item.y > 2800) { removeItem(item); } } checkGameOver(); }; game.down = function (x, y, obj) { // Clear equation if clicked on empty space if (currentEquation.length > 0) { currentEquation = []; updateEquationDisplay(); } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,290 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var FallingNumber = Container.expand(function (value, isBonus) {
+ var self = Container.call(this);
+ self.value = value;
+ self.isBonus = isBonus || false;
+ self.fallSpeed = 3 + Math.random() * 2;
+ self.collected = false;
+ var bgAsset = self.isBonus ? 'bonusBg' : 'numberBg';
+ var background = self.attachAsset(bgAsset, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var numberText = new Text2(value.toString(), {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ numberText.anchor.set(0.5, 0.5);
+ self.addChild(numberText);
+ if (self.isBonus) {
+ background.tint = 0xFFD700;
+ tween(background, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(background, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ }
+ self.update = function () {
+ if (!self.collected) {
+ self.y += self.fallSpeed;
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (!self.collected) {
+ self.collected = true;
+ collectItem(self);
+ }
+ };
+ return self;
+});
+var FallingOperator = Container.expand(function (operator) {
+ var self = Container.call(this);
+ self.value = operator;
+ self.fallSpeed = 3 + Math.random() * 2;
+ self.collected = false;
+ var background = self.attachAsset('operatorBg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var operatorText = new Text2(operator, {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ operatorText.anchor.set(0.5, 0.5);
+ self.addChild(operatorText);
+ self.update = function () {
+ if (!self.collected) {
+ self.y += self.fallSpeed;
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (!self.collected) {
+ self.collected = true;
+ collectItem(self);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2C3E50
+});
+
+/****
+* Game Code
+****/
+var fallingItems = [];
+var currentEquation = [];
+var gameSpeed = 1;
+var spawnTimer = 0;
+var maxItemsOnScreen = 8;
+var consecutiveCorrect = 0;
+var gameLevel = 1;
+// UI Elements
+var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreText);
+scoreText.x = -20;
+scoreText.y = 20;
+var levelText = new Text2('Level: 1', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+levelText.anchor.set(0, 0);
+LK.gui.topRight.addChild(levelText);
+levelText.x = -20;
+levelText.y = 90;
+var equationDisplay = new Text2('', {
+ size: 80,
+ fill: 0x000000
+});
+equationDisplay.anchor.set(0.5, 0.5);
+var equationContainer = game.addChild(new Container());
+equationContainer.x = 1024;
+equationContainer.y = 150;
+var equationBg = equationContainer.attachAsset('equationBar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+equationContainer.addChild(equationDisplay);
+function getRandomNumber() {
+ var maxNum = Math.min(9, Math.floor(gameLevel / 2) + 3);
+ return Math.floor(Math.random() * maxNum) + 1;
+}
+function getRandomOperator() {
+ var operators = ['+', '-'];
+ if (gameLevel > 3) operators.push('×');
+ if (gameLevel > 5) operators.push('÷');
+ return operators[Math.floor(Math.random() * operators.length)];
+}
+function spawnItem() {
+ if (fallingItems.length >= maxItemsOnScreen) return;
+ var x = 200 + Math.random() * 1648;
+ var y = -100;
+ var item;
+ if (Math.random() < 0.3) {
+ // Spawn operator
+ item = new FallingOperator(getRandomOperator());
+ } else {
+ // Spawn number
+ var isBonus = Math.random() < 0.1 && gameLevel > 2;
+ item = new FallingNumber(getRandomNumber(), isBonus);
+ }
+ item.x = x;
+ item.y = y;
+ fallingItems.push(item);
+ game.addChild(item);
+}
+function collectItem(item) {
+ currentEquation.push(item.value);
+ updateEquationDisplay();
+ LK.getSound('collect').play();
+ tween(item, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ removeItem(item);
+ }
+ });
+ checkEquation();
+}
+function updateEquationDisplay() {
+ equationDisplay.setText(currentEquation.join(' '));
+}
+function checkEquation() {
+ if (currentEquation.length >= 3) {
+ var equation = currentEquation.join('');
+ if (isValidEquation()) {
+ evaluateEquation();
+ }
+ }
+}
+function isValidEquation() {
+ if (currentEquation.length < 3) return false;
+ // Check pattern: number operator number
+ var hasNumber1 = typeof currentEquation[0] === 'number';
+ var hasOperator = typeof currentEquation[1] === 'string' && ['+', '-', '×', '÷'].includes(currentEquation[1]);
+ var hasNumber2 = typeof currentEquation[2] === 'number';
+ return hasNumber1 && hasOperator && hasNumber2;
+}
+function evaluateEquation() {
+ var num1 = currentEquation[0];
+ var operator = currentEquation[1];
+ var num2 = currentEquation[2];
+ var result;
+ switch (operator) {
+ case '+':
+ result = num1 + num2;
+ break;
+ case '-':
+ result = num1 - num2;
+ break;
+ case '×':
+ result = num1 * num2;
+ break;
+ case '÷':
+ result = Math.floor(num1 / num2);
+ break;
+ }
+ var points = calculatePoints(num1, operator, num2);
+ LK.setScore(LK.getScore() + points);
+ scoreText.setText('Score: ' + LK.getScore());
+ consecutiveCorrect++;
+ LK.getSound('correct').play();
+ LK.effects.flashObject(equationContainer, 0x00FF00, 500);
+ currentEquation = [];
+ updateEquationDisplay();
+ // Level progression
+ if (LK.getScore() > gameLevel * 500) {
+ gameLevel++;
+ levelText.setText('Level: ' + gameLevel);
+ gameSpeed += 0.2;
+ maxItemsOnScreen = Math.min(12, maxItemsOnScreen + 1);
+ }
+}
+function calculatePoints(num1, operator, num2) {
+ var basePoints = 10;
+ switch (operator) {
+ case '+':
+ case '-':
+ basePoints = 10;
+ break;
+ case '×':
+ basePoints = 20;
+ break;
+ case '÷':
+ basePoints = 25;
+ break;
+ }
+ // Bonus for consecutive correct answers
+ basePoints += consecutiveCorrect * 5;
+ return basePoints;
+}
+function removeItem(item) {
+ var index = fallingItems.indexOf(item);
+ if (index > -1) {
+ fallingItems.splice(index, 1);
+ }
+ item.destroy();
+}
+function checkGameOver() {
+ var itemsAtBottom = 0;
+ for (var i = 0; i < fallingItems.length; i++) {
+ if (fallingItems[i].y > 2732) {
+ itemsAtBottom++;
+ }
+ }
+ if (itemsAtBottom >= 5) {
+ LK.showGameOver();
+ }
+}
+game.update = function () {
+ spawnTimer++;
+ var spawnRate = Math.max(30, 120 - gameLevel * 10);
+ if (spawnTimer >= spawnRate) {
+ spawnItem();
+ spawnTimer = 0;
+ }
+ // Remove items that have fallen off screen
+ for (var i = fallingItems.length - 1; i >= 0; i--) {
+ var item = fallingItems[i];
+ if (item.y > 2800) {
+ removeItem(item);
+ }
+ }
+ checkGameOver();
+};
+game.down = function (x, y, obj) {
+ // Clear equation if clicked on empty space
+ if (currentEquation.length > 0) {
+ currentEquation = [];
+ updateEquationDisplay();
+ }
+};
\ No newline at end of file