User prompt
her coin 10 puan kazandırsın ve her karakter her coin aldığında puanı toplanarak artsın. sağ üst köşede puanı yazsın.
Code edit (1 edits merged)
Please save this source code
User prompt
Math Runner Academy
Initial prompt
Create a 3-lane endless runner game similar to Subway Surfers. The main character is a 10-year-old boy viewed from behind, running forward in a colorful school-themed environment. The player controls the character using left and right arrow keys on the keyboard to switch between the three lanes. On the path, there are obstacles like backpacks, desks, and fences that must be avoided by switching lanes. There are also collectible gamepad-shaped icons scattered along the way that work like coins and give points when collected. If the player hits an obstacle, the game immediately pauses and displays a multiplication question (e.g., “7 x 8 = ?”) with three answer options. The player must choose the correct answer within 9 seconds. If the answer is correct, the character continues running and the score multiplier increases (1.1x, 1.2x, 1.3x, etc.). If the answer is incorrect or time runs out, the multiplier resets to 1.0 and the character receives a short penalty like slowing down or stumbling. The game should feature child-friendly cartoon-style graphics, smooth animations, and fun background music. Over time, the running speed should gradually increase to make the game more challenging. The main objective is to collect as many points as possible by dodging obstacles, collecting gamepad coins, and solving multiplication questions correctly.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = gameSpeed; self.update = function () { self.y += self.speed; // Simple rotation animation coinGraphics.rotation += 0.1; }; return self; }); var Obstacle = Container.expand(function (type) { var self = Container.call(this); var assetName = 'obstacle' + (type || 1); var obstacleGraphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 1.0 }); self.speed = gameSpeed; self.update = function () { self.y += self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); self.lane = 1; // 0=left, 1=center, 2=right self.targetX = 0; self.update = function () { // Smooth movement to target lane var diff = self.targetX - self.x; if (Math.abs(diff) > 5) { self.x += diff * 0.15; } else { self.x = self.targetX; } }; return self; }); var QuestionPanel = Container.expand(function () { var self = Container.call(this); var background = self.attachAsset('questionBg', { anchorX: 0.5, anchorY: 0.5 }); self.questionText = new Text2('', { size: 80, fill: 0x000000 }); self.questionText.anchor.set(0.5, 0.5); self.questionText.y = -150; self.addChild(self.questionText); self.timerText = new Text2('9', { size: 60, fill: 0xFF0000 }); self.timerText.anchor.set(0.5, 0.5); self.timerText.y = -250; self.addChild(self.timerText); self.answerButtons = []; for (var i = 0; i < 3; i++) { var button = self.addChild(LK.getAsset('answerButton', { anchorX: 0.5, anchorY: 0.5 })); button.x = (i - 1) * 450; button.y = 50; var buttonText = new Text2('', { size: 50, fill: 0x000000 }); buttonText.anchor.set(0.5, 0.5); button.addChild(buttonText); button.text = buttonText; button.answerValue = 0; self.answerButtons.push(button); } self.setupQuestion = function () { var num1 = Math.floor(Math.random() * 9) + 2; var num2 = Math.floor(Math.random() * 9) + 2; var correctAnswer = num1 * num2; self.questionText.setText(num1 + ' × ' + num2 + ' = ?'); self.correctAnswer = correctAnswer; // Generate wrong answers var wrongAnswers = []; while (wrongAnswers.length < 2) { var wrong = correctAnswer + Math.floor(Math.random() * 20) - 10; if (wrong !== correctAnswer && wrong > 0 && wrongAnswers.indexOf(wrong) === -1) { wrongAnswers.push(wrong); } } // Randomize button positions var answers = [correctAnswer, wrongAnswers[0], wrongAnswers[1]]; for (var i = 0; i < 3; i++) { var randomIndex = Math.floor(Math.random() * answers.length); var answer = answers.splice(randomIndex, 1)[0]; self.answerButtons[i].answerValue = answer; self.answerButtons[i].text.setText(answer.toString()); } questionTimer = 9; self.timerText.setText(questionTimer.toString()); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables // backpack // desk // fence var gameSpeed = 8; var speedIncrement = 0.005; var maxSpeed = 20; var lanePositions = [2048 / 2 - 300, 2048 / 2, 2048 / 2 + 300]; var groundY = 2732 - 100; var obstacles = []; var coins = []; var obstacleSpawnTimer = 0; var coinSpawnTimer = 0; var scoreMultiplier = 1.0; var questionActive = false; var questionTimer = 0; var questionPanel = null; var player = game.addChild(new Player()); player.x = lanePositions[1]; player.y = groundY; player.targetX = lanePositions[1]; // Ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0 })); ground.x = 0; ground.y = groundY; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); scoreText.x = -20; scoreText.y = 20; LK.gui.topRight.addChild(scoreText); var multiplierText = new Text2('Multiplier: 1.0x', { size: 50, fill: 0xFFFF00 }); multiplierText.anchor.set(0, 0); multiplierText.y = 80; LK.gui.topRight.addChild(multiplierText); function updateUI() { scoreText.setText('Score: ' + LK.getScore()); multiplierText.setText('Multiplier: ' + scoreMultiplier.toFixed(1) + 'x'); } function switchLane(direction) { if (questionActive) return; player.lane += direction; if (player.lane < 0) player.lane = 0; if (player.lane > 2) player.lane = 2; player.targetX = lanePositions[player.lane]; } function spawnObstacle() { var lane = Math.floor(Math.random() * 3); var type = Math.floor(Math.random() * 3) + 1; var obstacle = game.addChild(new Obstacle(type)); obstacle.x = lanePositions[lane]; obstacle.y = -100; obstacle.lane = lane; obstacles.push(obstacle); } function spawnCoin() { var lane = Math.floor(Math.random() * 3); var coin = game.addChild(new Coin()); coin.x = lanePositions[lane]; coin.y = -50; coin.lane = lane; coins.push(coin); } function showQuestion() { questionActive = true; questionPanel = game.addChild(new QuestionPanel()); questionPanel.x = 2048 / 2; questionPanel.y = 2732 / 2; questionPanel.setupQuestion(); } function hideQuestion() { if (questionPanel) { questionPanel.destroy(); questionPanel = null; } questionActive = false; } function answerQuestion(selectedAnswer) { if (!questionActive) return; var correct = selectedAnswer === questionPanel.correctAnswer; if (correct) { scoreMultiplier += 0.1; LK.getSound('correct').play(); } else { scoreMultiplier = 1.0; LK.getSound('wrong').play(); } hideQuestion(); updateUI(); } // Touch controls game.down = function (x, y, obj) { if (questionActive && questionPanel) { // Check if clicking on answer buttons for (var i = 0; i < questionPanel.answerButtons.length; i++) { var button = questionPanel.answerButtons[i]; var buttonPos = game.toLocal(button.parent.toGlobal(button.position)); if (Math.abs(x - buttonPos.x) < 200 && Math.abs(y - buttonPos.y) < 50) { answerQuestion(button.answerValue); return; } } } else { // Lane switching if (x < 2048 / 2) { switchLane(-1); // Move left } else { switchLane(1); // Move right } } }; game.update = function () { if (questionActive) { // Handle question timer if (LK.ticks % 60 === 0) { // Every second questionTimer--; if (questionPanel) { questionPanel.timerText.setText(questionTimer.toString()); } if (questionTimer <= 0) { // Time's up - wrong answer scoreMultiplier = 1.0; hideQuestion(); updateUI(); } } return; // Don't update game objects during question } // Increase speed gradually if (gameSpeed < maxSpeed) { gameSpeed += speedIncrement; } // Spawn obstacles obstacleSpawnTimer++; if (obstacleSpawnTimer > 120 - gameSpeed * 2) { // Spawn more frequently as speed increases spawnObstacle(); obstacleSpawnTimer = 0; } // Spawn coins coinSpawnTimer++; if (coinSpawnTimer > 180) { spawnCoin(); coinSpawnTimer = 0; } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.speed = gameSpeed; // Check collision with player if (obstacle.lane === player.lane && Math.abs(obstacle.y - player.y) < 80 && Math.abs(obstacle.x - player.x) < 60) { LK.getSound('hit').play(); showQuestion(); obstacle.destroy(); obstacles.splice(i, 1); continue; } // Remove off-screen obstacles if (obstacle.y > 2732 + 100) { obstacle.destroy(); obstacles.splice(i, 1); } } // Update coins for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; coin.speed = gameSpeed; // Check collection if (coin.lane === player.lane && Math.abs(coin.y - player.y) < 60 && Math.abs(coin.x - player.x) < 50) { LK.setScore(LK.getScore() + 10); LK.getSound('collect').play(); updateUI(); coin.destroy(); coins.splice(i, 1); continue; } // Remove off-screen coins if (coin.y > 2732 + 50) { coin.destroy(); coins.splice(i, 1); } } }; updateUI();
===================================================================
--- original.js
+++ change.js
@@ -127,12 +127,12 @@
/****
* Game Code
****/
-// fence
-// desk
-// backpack
// Game variables
+// backpack
+// desk
+// fence
var gameSpeed = 8;
var speedIncrement = 0.005;
var maxSpeed = 20;
var lanePositions = [2048 / 2 - 300, 2048 / 2, 2048 / 2 + 300];
@@ -160,9 +160,11 @@
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
-scoreText.anchor.set(0, 0);
+scoreText.anchor.set(1, 0);
+scoreText.x = -20;
+scoreText.y = 20;
LK.gui.topRight.addChild(scoreText);
var multiplierText = new Text2('Multiplier: 1.0x', {
size: 50,
fill: 0xFFFF00
@@ -304,10 +306,9 @@
var coin = coins[i];
coin.speed = gameSpeed;
// Check collection
if (coin.lane === player.lane && Math.abs(coin.y - player.y) < 60 && Math.abs(coin.x - player.x) < 50) {
- var points = Math.floor(10 * scoreMultiplier);
- LK.setScore(LK.getScore() + points);
+ LK.setScore(LK.getScore() + 10);
LK.getSound('collect').play();
updateUI();
coin.destroy();
coins.splice(i, 1);