User prompt
the buttons in the main menu are not correctly clicable
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toLowerCase')' in or related to this line: 'if (guess.toLowerCase() === self.words[self.currentWordIndex]) {' Line Number: 22
Initial prompt
Word Guesser
/**** * Classes ****/ var Confetti = Container.expand(function () { var self = Container.call(this); var confettiGraphics = self.attachAsset('confetti', { anchorX: 0.5, anchorY: 0.5 }); // Random color confettiGraphics.tint = Math.random() * 0xffffff; self.vx = (Math.random() - 0.5) * 20; self.vy = -Math.random() * 15 - 5; self.gravity = 0.5; self.rotation = Math.random() * Math.PI * 2; self.rotSpeed = (Math.random() - 0.5) * 0.2; self.lifetime = 60 + Math.random() * 60; self.update = function () { self.x += self.vx; self.y += self.vy; self.vy += self.gravity; self.rotation += self.rotSpeed; self.lifetime--; self.alpha = Math.min(1, self.lifetime / 30); if (self.lifetime <= 0) { self.destroy(); return true; } return false; }; }); var Letter = Container.expand(function (_char, index) { var self = Container.call(this); var letterGraphics = self.attachAsset('letter', { anchorX: 0.5, anchorY: 0.5 }); var letterText = new Text2(_char.toUpperCase(), { size: 70, fill: 0x000000 }); letterText.anchor.set(0.5); self.addChild(letterText); self["char"] = _char; self.slotIndex = null; self.originalIndex = index; self.isDragging = false; self.startX = 0; self.startY = 0; self.targetX = 0; self.targetY = 0; self.isMoving = false; self.setHighlight = function (isCorrect) { if (isCorrect) { letterGraphics.tint = 0x33ff33; } else if (isCorrect === false) { // explicitly check for false to differentiate from undefined letterGraphics.tint = 0xff3333; } else { letterGraphics.tint = 0xffffff; } }; self.update = function () { if (self.isMoving) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 5) { self.x = self.targetX; self.y = self.targetY; self.isMoving = false; } else { self.x += dx * 0.2; self.y += dy * 0.2; } } }; self.moveTo = function (x, y) { self.targetX = x; self.targetY = y; self.isMoving = true; }; self.returnToField = function () { self.slotIndex = null; self.moveTo(self.startX, self.startY); }; }); var Slot = Container.expand(function (index) { var self = Container.call(this); var slotGraphics = self.attachAsset('slot', { anchorX: 0.5, anchorY: 0.5 }); self.index = index; self.letter = null; self.setLetter = function (letter) { self.letter = letter; if (letter) { letter.slotIndex = self.index; } }; self.clearLetter = function () { if (self.letter) { self.letter.slotIndex = null; self.letter = null; } }; }); var TimeBar = Container.expand(function () { var self = Container.call(this); var barBg = self.attachAsset('timeBarBg', { anchorX: 0, anchorY: 0.5 }); var barFill = new Container(); var barFillGraphics = barFill.attachAsset('timeBar', { anchorX: 0, anchorY: 0.5 }); self.addChild(barFill); self.maxTime = 15 * 60; // 15 seconds at 60fps self.timeLeft = self.maxTime; self.reset = function () { self.timeLeft = self.maxTime; barFill.scale.x = 1; }; self.update = function () { if (self.timeLeft > 0) { self.timeLeft--; barFill.scale.x = self.timeLeft / self.maxTime; } return self.timeLeft <= 0; }; }); /**** * Initialize Game ****/ /**** * Game Setup ****/ var game = new LK.Game({ backgroundColor: 0x000055 }); /**** * Game Code ****/ // Play background music in a loop var WordList = function WordList() { // A selection of 500 English words (5-9 letters) var words = ["about", "above", "actor", "adult", "after", "again", "agree", "ahead", "album", "allow", "alone", "along", "already", "always", "amount", "angry", "animal", "answer", "anyone", "anything", "appear", "apple", "argue", "around", "arrive", "artist", "assume", "attack", "attend", "author", "autumn", "awake", "award", "badge", "baggage", "bake", "balance", "balloon", "banana", "banner", "barely", "barrel", "basket", "battle", "beach", "beauty", "because", "become", "before", "begin", "behind", "belief", "belong", "beneath", "beside", "better", "between", "beyond", "bicycle", "black", "blame", "blank", "blanket", "blind", "block", "blood", "board", "boast", "bonus", "border", "borrow", "bottle", "bottom", "bounce", "brain", "branch", "brave", "bread", "break", "breath", "brick", "bridge", "brief", "bright", "broad", "broken", "brother", "brown", "brush", "budget", "build", "bumpy", "bunch", "burden", "butter", "button", "cable", "camel", "camera", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable", "capital", "captain", "carbon", "career", "careful", "carpet", "carrot", "carry", "carton", "castle", "cattle", "caught", "cause", "caution", "cease", "ceiling", "celery", "cellar", "century", "certain", "chain", "chair", "chalk", "channel", "chapter", "charge", "charm", "chart", "chase", "cheap", "check", "cheer", "cheese", "cherry", "chicken", "chief", "child", "chill", "choice", "choose", "church", "circle", "claim", "class", "clean", "clear", "clerk", "clever", "cliff", "climb", "clock", "close", "cloth", "cloud", "clown", "coach", "coast", "coffee", "collar", "colony", "color", "column", "combat", "combine", "comedy", "coming", "common", "compass", "complex", "compute", "conceal", "concept", "concern", "concert", "conduct", "confirm", "connect", "consent", "contain", "content", "contest", "control", "convert", "cookie", "copper", "corner", "correct", "cotton", "couch", "cough", "council", "count", "country", "county", "couple", "course", "cousin", "cover", "crack", "craft", "crash", "crawl", "crazy", "cream", "create", "credit", "creek", "crime", "crisp", "critic", "cross", "crowd", "crown", "cruel", "crush", "crystal", "culture", "cunning", "curious", "current", "curtain", "curve", "cushion", "custom", "cutting", "cycle", "daily", "damage", "dance", "danger", "daring", "darken", "dazzle", "dealer", "debate", "debris", "decade", "decay", "decent", "decide", "declare", "decorate", "decrease", "dedicate", "defeat", "defend", "define", "degree", "delay", "delete", "delight", "deliver", "demand", "demise", "denial", "dense", "dental", "depart", "depend", "depict", "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desire", "despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagnose", "diamond", "diary", "dictate", "differ", "digest", "digital", "dignity", "dilemma", "diminish", "dinner", "direct", "disable", "disagree", "disclose", "discover", "discuss", "disease", "disgust", "dismiss", "display", "dispose", "distance", "distort", "disturb", "divide", "divine", "dizzy", "doctor", "document", "domain", "domestic", "dominate", "donate", "donor", "double", "doubt", "dozen", "draft", "dragon", "drama", "dream", "dress", "drift", "drink", "drive", "drone", "drown", "drunk", "dryer", "duckling", "dumb", "dusk", "dust", "duty", "dwarf", "dwell", "eager", "eagle", "early", "earth", "easily", "easter", "eastern", "eating", "eclipse", "ecology", "economy", "edition", "editor", "educate", "effect", "effort", "eight", "either", "elbow", "elder", "elect", "eleven", "elite", "email", "embark", "embody", "embrace", "emerge", "emotion", "employ", "empower", "empty", "enable", "enact", "endless", "endorse", "endure", "enemy", "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough", "enrich", "ensign", "ensure", "enter", "entitle", "entity", "entrance", "envelope", "envision", "envy", "equal", "equip", "equity", "eraser", "erode", "erosion", "error", "erupt", "escape", "escort", "essay", "essence", "estate", "esteem", "eternal", "ethics", "evidence", "evoke", "evolve", "exact", "examine", "example", "exceed", "excel", "except", "excess", "exchange", "excite", "exclude", "excuse", "execute", "exempt", "exhaust", "exhibit", "exist", "expand", "expect", "expert", "explain", "explode", "explore", "export", "expose", "express", "extend", "extra", "eyebrow", "fabric", "facade", "factor", "factory", "faculty", "fading", "falcon", "falling", "fallout", "famous", "fantasy", "farmer", "fashion", "father", "fatigue", "fault", "favor", "feature", "federal", "feeling", "fellow", "female", "fence", "ferry", "fever", "fiber", "fiction", "field", "fierce", "fight", "figure", "filter", "final", "find", "finger", "finish", "fire", "firm", "first"]; return { getRandomWord: function getRandomWord() { return words[Math.floor(Math.random() * words.length)]; } }; }; LK.playMusic('background', { loop: true }); // Game constants var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; var LETTER_SIZE = 100; var LETTER_MARGIN = 20; var PLAYING_FIELD_TOP = 400; var PLAYING_FIELD_HEIGHT = 1300; var SLOT_AREA_TOP = PLAYING_FIELD_TOP + PLAYING_FIELD_HEIGHT + 100; /**** * Game Variables ****/ var wordList = new WordList(); var currentWord = ""; var letters = []; var slots = []; var confetti = []; var score = 0; var wordsCompleted = 0; var timeBar = null; var isGameActive = false; var isProMode = false; var menuContainer = null; var gameContainer = null; /**** * UI Elements ****/ var background = game.attachAsset('background', {}); game.addChildAt(background, 0); var scoreText = new Text2('SCORE: 0', { size: 70, fill: 0xffffff }); scoreText.anchor.set(0, 0); scoreText.x = 50; scoreText.y = 50; var wordText = new Text2('WORD: 0', { size: 70, fill: 0xffffff }); wordText.anchor.set(0, 0); wordText.x = 50; wordText.y = 130; var statusText = new Text2('', { size: 70, fill: 0xffffff }); statusText.anchor.set(0.5); statusText.x = GAME_WIDTH / 2; statusText.y = 200; /**** * Main Menu ****/ function createMainMenu() { menuContainer = new Container(); game.addChild(menuContainer); var menuBg = menuContainer.attachAsset('menuBackground', {}); var titleText = new Text2('WORD PUZZLE', { size: 120, fill: 0xffffff }); titleText.anchor.set(0.5); titleText.x = GAME_WIDTH / 2; titleText.y = GAME_HEIGHT * 0.25; menuContainer.addChild(titleText); var casualButton = new Container(); var casualBtnGraphics = casualButton.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); var casualBtnText = new Text2('CASUAL MODE', { size: 70, fill: 0xffffff }); casualBtnText.anchor.set(0.5); casualButton.addChild(casualBtnText); casualButton.x = GAME_WIDTH / 2; casualButton.y = GAME_HEIGHT * 0.45; menuContainer.addChild(casualButton); casualButton.interactive = true; casualButton.on('pointerdown', function () { startGame(false); }); var proButton = new Container(); var proBtnGraphics = proButton.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); proBtnGraphics.tint = 0xff3366; var proBtnText = new Text2('PRO MODE', { size: 70, fill: 0xffffff }); proBtnText.anchor.set(0.5); proButton.addChild(proBtnText); proButton.x = GAME_WIDTH / 2; proButton.y = GAME_HEIGHT * 0.6; menuContainer.addChild(proButton); proButton.interactive = true; proButton.on('pointerdown', function () { startGame(true); }); var instructionsText = new Text2('Arrange the letters to form the correct word', { size: 50, fill: 0xaaaaff }); instructionsText.anchor.set(0.5); instructionsText.x = GAME_WIDTH / 2; instructionsText.y = GAME_HEIGHT * 0.75; menuContainer.addChild(instructionsText); } /**** * Game Functions ****/ function startGame(proMode) { // Remove menu if it exists if (menuContainer) { menuContainer.destroy(); menuContainer = null; } // Create game container gameContainer = new Container(); game.addChild(gameContainer); // Add UI elements gameContainer.addChild(scoreText); gameContainer.addChild(wordText); gameContainer.addChild(statusText); // Set game mode isProMode = proMode; // Create time bar for pro mode if (isProMode) { timeBar = new TimeBar(); timeBar.x = GAME_WIDTH / 2 - 900; timeBar.y = 300; gameContainer.addChild(timeBar); } // Reset game state score = 0; wordsCompleted = 0; updateScoreDisplay(); // Start the game isGameActive = true; loadNextWord(); } function loadNextWord() { // Clear current word clearCurrentWord(); // Get a new random word currentWord = wordList.getRandomWord(); // Create slots for the word createSlots(currentWord.length); // Create jumbled letters createLetters(currentWord); // Reset time bar for pro mode if (isProMode && timeBar) { timeBar.reset(); } // Update status statusText.setText('Arrange the letters!'); statusText.style.fill = 0xffffff; } function createSlots(count) { slots = []; var totalWidth = count * (LETTER_SIZE + LETTER_MARGIN); var startX = (GAME_WIDTH - totalWidth) / 2 + LETTER_SIZE / 2; for (var i = 0; i < count; i++) { var slot = new Slot(i); slot.x = startX + i * (LETTER_SIZE + LETTER_MARGIN); slot.y = SLOT_AREA_TOP; slots.push(slot); gameContainer.addChild(slot); } } function createLetters(word) { letters = []; // Create array of characters var chars = word.split(''); // Shuffle the characters for (var i = chars.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; } // Calculate grid dimensions var cols = Math.ceil(Math.sqrt(chars.length)); var rows = Math.ceil(chars.length / cols); // Calculate starting position for grid var gridWidth = cols * (LETTER_SIZE + LETTER_MARGIN); var gridHeight = rows * (LETTER_SIZE + LETTER_MARGIN); var startX = (GAME_WIDTH - gridWidth) / 2 + LETTER_SIZE / 2; var startY = PLAYING_FIELD_TOP + (PLAYING_FIELD_HEIGHT - gridHeight) / 2 + LETTER_SIZE / 2; // Create letter objects for (var k = 0; k < chars.length; k++) { var row = Math.floor(k / cols); var col = k % cols; var letter = new Letter(chars[k], k); letter.x = startX + col * (LETTER_SIZE + LETTER_MARGIN); letter.y = startY + row * (LETTER_SIZE + LETTER_MARGIN); letter.startX = letter.x; letter.startY = letter.y; letters.push(letter); gameContainer.addChild(letter); // Make letter interactive letter.interactive = true; letter.buttonMode = true; // Set up drag events letter.on('pointerdown', onLetterDragStart); letter.on('pointermove', onLetterDragMove); letter.on('pointerup', onLetterDragEnd); letter.on('pointerupoutside', onLetterDragEnd); } } function clearCurrentWord() { // Remove all letters and slots for (var i = 0; i < letters.length; i++) { letters[i].destroy(); } letters = []; for (var j = 0; j < slots.length; j++) { slots[j].destroy(); } slots = []; } function checkWord() { // Check if all slots have letters var allSlotsFilled = true; for (var i = 0; i < slots.length; i++) { if (!slots[i].letter) { allSlotsFilled = false; break; } } if (!allSlotsFilled) { return; } // Get the word formed by the letters in slots var formedWord = ""; for (var j = 0; j < slots.length; j++) { formedWord += slots[j].letter["char"]; } // Check if the word is correct if (formedWord === currentWord) { wordCorrect(); } else { wordIncorrect(); } } function wordCorrect() { // Play sound LK.getSound('correct').play(); // Update status statusText.setText('CORRECT!'); statusText.style.fill = 0x33ff33; // Highlight letters for (var i = 0; i < letters.length; i++) { letters[i].setHighlight(true); } // Create confetti effect for (var j = 0; j < 100; j++) { var conf = new Confetti(); conf.x = GAME_WIDTH / 2; conf.y = SLOT_AREA_TOP; confetti.push(conf); gameContainer.addChild(conf); } // Calculate score based on word length and time (for pro mode) var wordScore = currentWord.length * 10; if (isProMode && timeBar) { var timeBonus = Math.floor(timeBar.timeLeft / 10); wordScore += timeBonus; } score += wordScore; wordsCompleted++; updateScoreDisplay(); // Load next word after delay setTimeout(function () { if (isGameActive) { loadNextWord(); } }, 1500); } function wordIncorrect() { // Play sound LK.getSound('wrong').play(); // Update status statusText.setText('TRY AGAIN!'); statusText.style.fill = 0xff3333; // Highlight letters for (var i = 0; i < letters.length; i++) { letters[i].setHighlight(false); } // Return letters to their original positions after delay setTimeout(function () { if (isGameActive) { for (var i = 0; i < letters.length; i++) { if (letters[i].slotIndex !== null) { var slot = slots[letters[i].slotIndex]; slot.clearLetter(); } letters[i].returnToField(); letters[i].setHighlight(undefined); } statusText.setText('Arrange the letters!'); statusText.style.fill = 0xffffff; } }, 1000); } function updateScoreDisplay() { scoreText.setText('SCORE: ' + score); wordText.setText('WORDS: ' + wordsCompleted); } function gameOver() { // Play sound LK.getSound('gameOver').play(); // Update status statusText.setText('GAME OVER!'); statusText.style.fill = 0xff3333; // Disable game isGameActive = false; // Submit score LK.setScore(score); // Show game over screen after delay setTimeout(function () { LK.showGameOver(); }, 2000); } function returnToMenu() { if (gameContainer) { gameContainer.destroy(); gameContainer = null; } createMainMenu(); } /**** * Event Handlers ****/ function onLetterDragStart(event) { if (!isGameActive) { return; } var letter = this; letter.isDragging = true; letter.dragData = event.data; letter.alpha = 0.8; // If letter is in a slot, remove it if (letter.slotIndex !== null) { var oldSlot = slots[letter.slotIndex]; oldSlot.clearLetter(); } } function onLetterDragMove(event) { if (!isGameActive) { return; } var letter = this; if (letter.isDragging) { var newPosition = letter.dragData.getLocalPosition(letter.parent); letter.x = newPosition.x; letter.y = newPosition.y; } } function onLetterDragEnd() { if (!isGameActive) { return; } var letter = this; letter.isDragging = false; letter.alpha = 1; // Check if letter is dropped on a slot var nearestSlot = null; var minDistance = LETTER_SIZE * 1.5; for (var i = 0; i < slots.length; i++) { var slot = slots[i]; var dx = letter.x - slot.x; var dy = letter.y - slot.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < minDistance && !slot.letter) { nearestSlot = slot; minDistance = distance; } } // Place letter in slot or return to field if (nearestSlot) { nearestSlot.setLetter(letter); letter.moveTo(nearestSlot.x, nearestSlot.y); LK.getSound('letterPlace').play(); // Check if word is complete setTimeout(checkWord, 200); } else { letter.returnToField(); } } /**** * Game Loop ****/ LK.on('tick', function () { // Update letters for (var i = 0; i < letters.length; i++) { letters[i].update(); } // Update confetti for (var j = confetti.length - 1; j >= 0; j--) { if (confetti[j].update()) { confetti.splice(j, 1); } } // Update timer in pro mode if (isGameActive && isProMode && timeBar) { if (timeBar.update()) { gameOver(); } } }); // Start with the main menu createMainMenu();
===================================================================
--- original.js
+++ change.js
@@ -1,90 +1,576 @@
/****
* Classes
****/
-//<Assets used in the game will automatically appear here>
-//<Write imports for supported plugins here>
-// Class for managing the word puzzle
-var WordPuzzle = Container.expand(function () {
+var Confetti = Container.expand(function () {
var self = Container.call(this);
- self.words = ["apple", "banana", "cherry", "date", "elderberry"];
- self.currentWordIndex = 0;
- self.timeLimit = 10; // 10 seconds to guess each word
- self.timer = null;
- self.score = 0;
- // Display the current word with missing letters
- self.displayWord = function () {
- var word = self.words[self.currentWordIndex];
- var maskedWord = word.replace(/[a-z]/g, "_ ");
- self.wordText.setText(maskedWord);
- };
- // Check if the guessed word is correct
- self.checkGuess = function (guess) {
- if (guess && guess.toLowerCase() === self.words[self.currentWordIndex]) {
- self.score++;
- self.nextWord();
- } else {
- self.endGame();
+ var confettiGraphics = self.attachAsset('confetti', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Random color
+ confettiGraphics.tint = Math.random() * 0xffffff;
+ self.vx = (Math.random() - 0.5) * 20;
+ self.vy = -Math.random() * 15 - 5;
+ self.gravity = 0.5;
+ self.rotation = Math.random() * Math.PI * 2;
+ self.rotSpeed = (Math.random() - 0.5) * 0.2;
+ self.lifetime = 60 + Math.random() * 60;
+ self.update = function () {
+ self.x += self.vx;
+ self.y += self.vy;
+ self.vy += self.gravity;
+ self.rotation += self.rotSpeed;
+ self.lifetime--;
+ self.alpha = Math.min(1, self.lifetime / 30);
+ if (self.lifetime <= 0) {
+ self.destroy();
+ return true;
}
+ return false;
};
- // Move to the next word
- self.nextWord = function () {
- self.currentWordIndex++;
- if (self.currentWordIndex < self.words.length) {
- self.displayWord();
- self.resetTimer();
+});
+var Letter = Container.expand(function (_char, index) {
+ var self = Container.call(this);
+ var letterGraphics = self.attachAsset('letter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var letterText = new Text2(_char.toUpperCase(), {
+ size: 70,
+ fill: 0x000000
+ });
+ letterText.anchor.set(0.5);
+ self.addChild(letterText);
+ self["char"] = _char;
+ self.slotIndex = null;
+ self.originalIndex = index;
+ self.isDragging = false;
+ self.startX = 0;
+ self.startY = 0;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.isMoving = false;
+ self.setHighlight = function (isCorrect) {
+ if (isCorrect) {
+ letterGraphics.tint = 0x33ff33;
+ } else if (isCorrect === false) {
+ // explicitly check for false to differentiate from undefined
+ letterGraphics.tint = 0xff3333;
} else {
- self.winGame();
+ letterGraphics.tint = 0xffffff;
}
};
- // Reset the timer for the next word
- self.resetTimer = function () {
- if (self.timer) {
- LK.clearTimeout(self.timer);
+ self.update = function () {
+ if (self.isMoving) {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 5) {
+ self.x = self.targetX;
+ self.y = self.targetY;
+ self.isMoving = false;
+ } else {
+ self.x += dx * 0.2;
+ self.y += dy * 0.2;
+ }
}
- self.timer = LK.setTimeout(self.endGame, self.timeLimit * 1000);
};
- // End the game
- self.endGame = function () {
- LK.showGameOver();
+ self.moveTo = function (x, y) {
+ self.targetX = x;
+ self.targetY = y;
+ self.isMoving = true;
};
- // Win the game
- self.winGame = function () {
- LK.showYouWin();
+ self.returnToField = function () {
+ self.slotIndex = null;
+ self.moveTo(self.startX, self.startY);
};
- // Initialize the word text display
- self.wordText = new Text2('', {
- size: 100,
- fill: 0xFFFFFF
+});
+var Slot = Container.expand(function (index) {
+ var self = Container.call(this);
+ var slotGraphics = self.attachAsset('slot', {
+ anchorX: 0.5,
+ anchorY: 0.5
});
- self.wordText.anchor.set(0.5, 0.5);
- LK.gui.center.addChild(self.wordText);
- // Start the game
- self.startGame = function () {
- self.currentWordIndex = 0;
- self.score = 0;
- self.displayWord();
- self.resetTimer();
+ self.index = index;
+ self.letter = null;
+ self.setLetter = function (letter) {
+ self.letter = letter;
+ if (letter) {
+ letter.slotIndex = self.index;
+ }
};
- return self;
+ self.clearLetter = function () {
+ if (self.letter) {
+ self.letter.slotIndex = null;
+ self.letter = null;
+ }
+ };
});
+var TimeBar = Container.expand(function () {
+ var self = Container.call(this);
+ var barBg = self.attachAsset('timeBarBg', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ var barFill = new Container();
+ var barFillGraphics = barFill.attachAsset('timeBar', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ self.addChild(barFill);
+ self.maxTime = 15 * 60; // 15 seconds at 60fps
+ self.timeLeft = self.maxTime;
+ self.reset = function () {
+ self.timeLeft = self.maxTime;
+ barFill.scale.x = 1;
+ };
+ self.update = function () {
+ if (self.timeLeft > 0) {
+ self.timeLeft--;
+ barFill.scale.x = self.timeLeft / self.maxTime;
+ }
+ return self.timeLeft <= 0;
+ };
+});
/****
* Initialize Game
****/
+/****
+* Game Setup
+****/
var game = new LK.Game({
- backgroundColor: 0x000000 //Init game with black background
+ backgroundColor: 0x000055
});
/****
* Game Code
****/
-// Initialize the word puzzle
-var wordPuzzle = game.addChild(new WordPuzzle());
-// Start the game
-wordPuzzle.startGame();
-// Handle user input for guessing words
-game.down = function (x, y, obj) {
- // For simplicity, let's assume the user inputs a guess through a prompt
- var userGuess = prompt("Enter your guess:");
- wordPuzzle.checkGuess(userGuess);
-};
\ No newline at end of file
+// Play background music in a loop
+var WordList = function WordList() {
+ // A selection of 500 English words (5-9 letters)
+ var words = ["about", "above", "actor", "adult", "after", "again", "agree", "ahead", "album", "allow", "alone", "along", "already", "always", "amount", "angry", "animal", "answer", "anyone", "anything", "appear", "apple", "argue", "around", "arrive", "artist", "assume", "attack", "attend", "author", "autumn", "awake", "award", "badge", "baggage", "bake", "balance", "balloon", "banana", "banner", "barely", "barrel", "basket", "battle", "beach", "beauty", "because", "become", "before", "begin", "behind", "belief", "belong", "beneath", "beside", "better", "between", "beyond", "bicycle", "black", "blame", "blank", "blanket", "blind", "block", "blood", "board", "boast", "bonus", "border", "borrow", "bottle", "bottom", "bounce", "brain", "branch", "brave", "bread", "break", "breath", "brick", "bridge", "brief", "bright", "broad", "broken", "brother", "brown", "brush", "budget", "build", "bumpy", "bunch", "burden", "butter", "button", "cable", "camel", "camera", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable", "capital", "captain", "carbon", "career", "careful", "carpet", "carrot", "carry", "carton", "castle", "cattle", "caught", "cause", "caution", "cease", "ceiling", "celery", "cellar", "century", "certain", "chain", "chair", "chalk", "channel", "chapter", "charge", "charm", "chart", "chase", "cheap", "check", "cheer", "cheese", "cherry", "chicken", "chief", "child", "chill", "choice", "choose", "church", "circle", "claim", "class", "clean", "clear", "clerk", "clever", "cliff", "climb", "clock", "close", "cloth", "cloud", "clown", "coach", "coast", "coffee", "collar", "colony", "color", "column", "combat", "combine", "comedy", "coming", "common", "compass", "complex", "compute", "conceal", "concept", "concern", "concert", "conduct", "confirm", "connect", "consent", "contain", "content", "contest", "control", "convert", "cookie", "copper", "corner", "correct", "cotton", "couch", "cough", "council", "count", "country", "county", "couple", "course", "cousin", "cover", "crack", "craft", "crash", "crawl", "crazy", "cream", "create", "credit", "creek", "crime", "crisp", "critic", "cross", "crowd", "crown", "cruel", "crush", "crystal", "culture", "cunning", "curious", "current", "curtain", "curve", "cushion", "custom", "cutting", "cycle", "daily", "damage", "dance", "danger", "daring", "darken", "dazzle", "dealer", "debate", "debris", "decade", "decay", "decent", "decide", "declare", "decorate", "decrease", "dedicate", "defeat", "defend", "define", "degree", "delay", "delete", "delight", "deliver", "demand", "demise", "denial", "dense", "dental", "depart", "depend", "depict", "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desire", "despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagnose", "diamond", "diary", "dictate", "differ", "digest", "digital", "dignity", "dilemma", "diminish", "dinner", "direct", "disable", "disagree", "disclose", "discover", "discuss", "disease", "disgust", "dismiss", "display", "dispose", "distance", "distort", "disturb", "divide", "divine", "dizzy", "doctor", "document", "domain", "domestic", "dominate", "donate", "donor", "double", "doubt", "dozen", "draft", "dragon", "drama", "dream", "dress", "drift", "drink", "drive", "drone", "drown", "drunk", "dryer", "duckling", "dumb", "dusk", "dust", "duty", "dwarf", "dwell", "eager", "eagle", "early", "earth", "easily", "easter", "eastern", "eating", "eclipse", "ecology", "economy", "edition", "editor", "educate", "effect", "effort", "eight", "either", "elbow", "elder", "elect", "eleven", "elite", "email", "embark", "embody", "embrace", "emerge", "emotion", "employ", "empower", "empty", "enable", "enact", "endless", "endorse", "endure", "enemy", "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough", "enrich", "ensign", "ensure", "enter", "entitle", "entity", "entrance", "envelope", "envision", "envy", "equal", "equip", "equity", "eraser", "erode", "erosion", "error", "erupt", "escape", "escort", "essay", "essence", "estate", "esteem", "eternal", "ethics", "evidence", "evoke", "evolve", "exact", "examine", "example", "exceed", "excel", "except", "excess", "exchange", "excite", "exclude", "excuse", "execute", "exempt", "exhaust", "exhibit", "exist", "expand", "expect", "expert", "explain", "explode", "explore", "export", "expose", "express", "extend", "extra", "eyebrow", "fabric", "facade", "factor", "factory", "faculty", "fading", "falcon", "falling", "fallout", "famous", "fantasy", "farmer", "fashion", "father", "fatigue", "fault", "favor", "feature", "federal", "feeling", "fellow", "female", "fence", "ferry", "fever", "fiber", "fiction", "field", "fierce", "fight", "figure", "filter", "final", "find", "finger", "finish", "fire", "firm", "first"];
+ return {
+ getRandomWord: function getRandomWord() {
+ return words[Math.floor(Math.random() * words.length)];
+ }
+ };
+};
+LK.playMusic('background', {
+ loop: true
+});
+// Game constants
+var GAME_WIDTH = 2048;
+var GAME_HEIGHT = 2732;
+var LETTER_SIZE = 100;
+var LETTER_MARGIN = 20;
+var PLAYING_FIELD_TOP = 400;
+var PLAYING_FIELD_HEIGHT = 1300;
+var SLOT_AREA_TOP = PLAYING_FIELD_TOP + PLAYING_FIELD_HEIGHT + 100;
+/****
+* Game Variables
+****/
+var wordList = new WordList();
+var currentWord = "";
+var letters = [];
+var slots = [];
+var confetti = [];
+var score = 0;
+var wordsCompleted = 0;
+var timeBar = null;
+var isGameActive = false;
+var isProMode = false;
+var menuContainer = null;
+var gameContainer = null;
+/****
+* UI Elements
+****/
+var background = game.attachAsset('background', {});
+game.addChildAt(background, 0);
+var scoreText = new Text2('SCORE: 0', {
+ size: 70,
+ fill: 0xffffff
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 50;
+scoreText.y = 50;
+var wordText = new Text2('WORD: 0', {
+ size: 70,
+ fill: 0xffffff
+});
+wordText.anchor.set(0, 0);
+wordText.x = 50;
+wordText.y = 130;
+var statusText = new Text2('', {
+ size: 70,
+ fill: 0xffffff
+});
+statusText.anchor.set(0.5);
+statusText.x = GAME_WIDTH / 2;
+statusText.y = 200;
+/****
+* Main Menu
+****/
+function createMainMenu() {
+ menuContainer = new Container();
+ game.addChild(menuContainer);
+ var menuBg = menuContainer.attachAsset('menuBackground', {});
+ var titleText = new Text2('WORD PUZZLE', {
+ size: 120,
+ fill: 0xffffff
+ });
+ titleText.anchor.set(0.5);
+ titleText.x = GAME_WIDTH / 2;
+ titleText.y = GAME_HEIGHT * 0.25;
+ menuContainer.addChild(titleText);
+ var casualButton = new Container();
+ var casualBtnGraphics = casualButton.attachAsset('menuButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var casualBtnText = new Text2('CASUAL MODE', {
+ size: 70,
+ fill: 0xffffff
+ });
+ casualBtnText.anchor.set(0.5);
+ casualButton.addChild(casualBtnText);
+ casualButton.x = GAME_WIDTH / 2;
+ casualButton.y = GAME_HEIGHT * 0.45;
+ menuContainer.addChild(casualButton);
+ casualButton.interactive = true;
+ casualButton.on('pointerdown', function () {
+ startGame(false);
+ });
+ var proButton = new Container();
+ var proBtnGraphics = proButton.attachAsset('menuButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ proBtnGraphics.tint = 0xff3366;
+ var proBtnText = new Text2('PRO MODE', {
+ size: 70,
+ fill: 0xffffff
+ });
+ proBtnText.anchor.set(0.5);
+ proButton.addChild(proBtnText);
+ proButton.x = GAME_WIDTH / 2;
+ proButton.y = GAME_HEIGHT * 0.6;
+ menuContainer.addChild(proButton);
+ proButton.interactive = true;
+ proButton.on('pointerdown', function () {
+ startGame(true);
+ });
+ var instructionsText = new Text2('Arrange the letters to form the correct word', {
+ size: 50,
+ fill: 0xaaaaff
+ });
+ instructionsText.anchor.set(0.5);
+ instructionsText.x = GAME_WIDTH / 2;
+ instructionsText.y = GAME_HEIGHT * 0.75;
+ menuContainer.addChild(instructionsText);
+}
+/****
+* Game Functions
+****/
+function startGame(proMode) {
+ // Remove menu if it exists
+ if (menuContainer) {
+ menuContainer.destroy();
+ menuContainer = null;
+ }
+ // Create game container
+ gameContainer = new Container();
+ game.addChild(gameContainer);
+ // Add UI elements
+ gameContainer.addChild(scoreText);
+ gameContainer.addChild(wordText);
+ gameContainer.addChild(statusText);
+ // Set game mode
+ isProMode = proMode;
+ // Create time bar for pro mode
+ if (isProMode) {
+ timeBar = new TimeBar();
+ timeBar.x = GAME_WIDTH / 2 - 900;
+ timeBar.y = 300;
+ gameContainer.addChild(timeBar);
+ }
+ // Reset game state
+ score = 0;
+ wordsCompleted = 0;
+ updateScoreDisplay();
+ // Start the game
+ isGameActive = true;
+ loadNextWord();
+}
+function loadNextWord() {
+ // Clear current word
+ clearCurrentWord();
+ // Get a new random word
+ currentWord = wordList.getRandomWord();
+ // Create slots for the word
+ createSlots(currentWord.length);
+ // Create jumbled letters
+ createLetters(currentWord);
+ // Reset time bar for pro mode
+ if (isProMode && timeBar) {
+ timeBar.reset();
+ }
+ // Update status
+ statusText.setText('Arrange the letters!');
+ statusText.style.fill = 0xffffff;
+}
+function createSlots(count) {
+ slots = [];
+ var totalWidth = count * (LETTER_SIZE + LETTER_MARGIN);
+ var startX = (GAME_WIDTH - totalWidth) / 2 + LETTER_SIZE / 2;
+ for (var i = 0; i < count; i++) {
+ var slot = new Slot(i);
+ slot.x = startX + i * (LETTER_SIZE + LETTER_MARGIN);
+ slot.y = SLOT_AREA_TOP;
+ slots.push(slot);
+ gameContainer.addChild(slot);
+ }
+}
+function createLetters(word) {
+ letters = [];
+ // Create array of characters
+ var chars = word.split('');
+ // Shuffle the characters
+ for (var i = chars.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var temp = chars[i];
+ chars[i] = chars[j];
+ chars[j] = temp;
+ }
+ // Calculate grid dimensions
+ var cols = Math.ceil(Math.sqrt(chars.length));
+ var rows = Math.ceil(chars.length / cols);
+ // Calculate starting position for grid
+ var gridWidth = cols * (LETTER_SIZE + LETTER_MARGIN);
+ var gridHeight = rows * (LETTER_SIZE + LETTER_MARGIN);
+ var startX = (GAME_WIDTH - gridWidth) / 2 + LETTER_SIZE / 2;
+ var startY = PLAYING_FIELD_TOP + (PLAYING_FIELD_HEIGHT - gridHeight) / 2 + LETTER_SIZE / 2;
+ // Create letter objects
+ for (var k = 0; k < chars.length; k++) {
+ var row = Math.floor(k / cols);
+ var col = k % cols;
+ var letter = new Letter(chars[k], k);
+ letter.x = startX + col * (LETTER_SIZE + LETTER_MARGIN);
+ letter.y = startY + row * (LETTER_SIZE + LETTER_MARGIN);
+ letter.startX = letter.x;
+ letter.startY = letter.y;
+ letters.push(letter);
+ gameContainer.addChild(letter);
+ // Make letter interactive
+ letter.interactive = true;
+ letter.buttonMode = true;
+ // Set up drag events
+ letter.on('pointerdown', onLetterDragStart);
+ letter.on('pointermove', onLetterDragMove);
+ letter.on('pointerup', onLetterDragEnd);
+ letter.on('pointerupoutside', onLetterDragEnd);
+ }
+}
+function clearCurrentWord() {
+ // Remove all letters and slots
+ for (var i = 0; i < letters.length; i++) {
+ letters[i].destroy();
+ }
+ letters = [];
+ for (var j = 0; j < slots.length; j++) {
+ slots[j].destroy();
+ }
+ slots = [];
+}
+function checkWord() {
+ // Check if all slots have letters
+ var allSlotsFilled = true;
+ for (var i = 0; i < slots.length; i++) {
+ if (!slots[i].letter) {
+ allSlotsFilled = false;
+ break;
+ }
+ }
+ if (!allSlotsFilled) {
+ return;
+ }
+ // Get the word formed by the letters in slots
+ var formedWord = "";
+ for (var j = 0; j < slots.length; j++) {
+ formedWord += slots[j].letter["char"];
+ }
+ // Check if the word is correct
+ if (formedWord === currentWord) {
+ wordCorrect();
+ } else {
+ wordIncorrect();
+ }
+}
+function wordCorrect() {
+ // Play sound
+ LK.getSound('correct').play();
+ // Update status
+ statusText.setText('CORRECT!');
+ statusText.style.fill = 0x33ff33;
+ // Highlight letters
+ for (var i = 0; i < letters.length; i++) {
+ letters[i].setHighlight(true);
+ }
+ // Create confetti effect
+ for (var j = 0; j < 100; j++) {
+ var conf = new Confetti();
+ conf.x = GAME_WIDTH / 2;
+ conf.y = SLOT_AREA_TOP;
+ confetti.push(conf);
+ gameContainer.addChild(conf);
+ }
+ // Calculate score based on word length and time (for pro mode)
+ var wordScore = currentWord.length * 10;
+ if (isProMode && timeBar) {
+ var timeBonus = Math.floor(timeBar.timeLeft / 10);
+ wordScore += timeBonus;
+ }
+ score += wordScore;
+ wordsCompleted++;
+ updateScoreDisplay();
+ // Load next word after delay
+ setTimeout(function () {
+ if (isGameActive) {
+ loadNextWord();
+ }
+ }, 1500);
+}
+function wordIncorrect() {
+ // Play sound
+ LK.getSound('wrong').play();
+ // Update status
+ statusText.setText('TRY AGAIN!');
+ statusText.style.fill = 0xff3333;
+ // Highlight letters
+ for (var i = 0; i < letters.length; i++) {
+ letters[i].setHighlight(false);
+ }
+ // Return letters to their original positions after delay
+ setTimeout(function () {
+ if (isGameActive) {
+ for (var i = 0; i < letters.length; i++) {
+ if (letters[i].slotIndex !== null) {
+ var slot = slots[letters[i].slotIndex];
+ slot.clearLetter();
+ }
+ letters[i].returnToField();
+ letters[i].setHighlight(undefined);
+ }
+ statusText.setText('Arrange the letters!');
+ statusText.style.fill = 0xffffff;
+ }
+ }, 1000);
+}
+function updateScoreDisplay() {
+ scoreText.setText('SCORE: ' + score);
+ wordText.setText('WORDS: ' + wordsCompleted);
+}
+function gameOver() {
+ // Play sound
+ LK.getSound('gameOver').play();
+ // Update status
+ statusText.setText('GAME OVER!');
+ statusText.style.fill = 0xff3333;
+ // Disable game
+ isGameActive = false;
+ // Submit score
+ LK.setScore(score);
+ // Show game over screen after delay
+ setTimeout(function () {
+ LK.showGameOver();
+ }, 2000);
+}
+function returnToMenu() {
+ if (gameContainer) {
+ gameContainer.destroy();
+ gameContainer = null;
+ }
+ createMainMenu();
+}
+/****
+* Event Handlers
+****/
+function onLetterDragStart(event) {
+ if (!isGameActive) {
+ return;
+ }
+ var letter = this;
+ letter.isDragging = true;
+ letter.dragData = event.data;
+ letter.alpha = 0.8;
+ // If letter is in a slot, remove it
+ if (letter.slotIndex !== null) {
+ var oldSlot = slots[letter.slotIndex];
+ oldSlot.clearLetter();
+ }
+}
+function onLetterDragMove(event) {
+ if (!isGameActive) {
+ return;
+ }
+ var letter = this;
+ if (letter.isDragging) {
+ var newPosition = letter.dragData.getLocalPosition(letter.parent);
+ letter.x = newPosition.x;
+ letter.y = newPosition.y;
+ }
+}
+function onLetterDragEnd() {
+ if (!isGameActive) {
+ return;
+ }
+ var letter = this;
+ letter.isDragging = false;
+ letter.alpha = 1;
+ // Check if letter is dropped on a slot
+ var nearestSlot = null;
+ var minDistance = LETTER_SIZE * 1.5;
+ for (var i = 0; i < slots.length; i++) {
+ var slot = slots[i];
+ var dx = letter.x - slot.x;
+ var dy = letter.y - slot.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < minDistance && !slot.letter) {
+ nearestSlot = slot;
+ minDistance = distance;
+ }
+ }
+ // Place letter in slot or return to field
+ if (nearestSlot) {
+ nearestSlot.setLetter(letter);
+ letter.moveTo(nearestSlot.x, nearestSlot.y);
+ LK.getSound('letterPlace').play();
+ // Check if word is complete
+ setTimeout(checkWord, 200);
+ } else {
+ letter.returnToField();
+ }
+}
+/****
+* Game Loop
+****/
+LK.on('tick', function () {
+ // Update letters
+ for (var i = 0; i < letters.length; i++) {
+ letters[i].update();
+ }
+ // Update confetti
+ for (var j = confetti.length - 1; j >= 0; j--) {
+ if (confetti[j].update()) {
+ confetti.splice(j, 1);
+ }
+ }
+ // Update timer in pro mode
+ if (isGameActive && isProMode && timeBar) {
+ if (timeBar.update()) {
+ gameOver();
+ }
+ }
+});
+// Start with the main menu
+createMainMenu();
\ No newline at end of file