/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Apple = Container.expand(function (type) { var self = Container.call(this); var assetName = type + 'Apple'; var graphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.gridX = 0; self.gridY = 0; return self; }); var ArrowButton = Container.expand(function (direction) { var self = Container.call(this); var graphics = self.attachAsset('arrowButton', { anchorX: 0.5, anchorY: 0.5 }); self.direction = direction; self.down = function (x, y, obj) { currentDirection = self.direction; graphics.alpha = 0.7; tween(graphics, { alpha: 1 }, { duration: 200 }); }; return self; }); var Egg = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('egg', { anchorX: 0.5, anchorY: 0.5 }); self.gridX = 0; self.gridY = 0; return self; }); var SnakeSegment = Container.expand(function (isHead) { var self = Container.call(this); if (isHead) { var graphics = self.attachAsset('snakeHead', { anchorX: 0.5, anchorY: 0.5 }); } else { var graphics = self.attachAsset('snakeBody', { anchorX: 0.5, anchorY: 0.5 }); } self.gridX = 0; self.gridY = 0; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var GRID_SIZE = 40; var GRID_WIDTH = 25; var GRID_HEIGHT = 35; var GAME_AREA_X = (2048 - GRID_WIDTH * GRID_SIZE) / 2; var GAME_AREA_Y = 200; var snake = []; var currentDirection = 'right'; var nextDirection = 'right'; var moveTimer = 0; var moveInterval = 15; var health = 5; var score = 0; var gameActive = true; var apples = []; var eggs = []; var hearts = []; // Initialize snake with 4 segments for (var i = 0; i < 4; i++) { var segment = new SnakeSegment(i === 0); segment.gridX = 12 - i; segment.gridY = 17; segment.x = GAME_AREA_X + segment.gridX * GRID_SIZE + GRID_SIZE / 2; segment.y = GAME_AREA_Y + segment.gridY * GRID_SIZE + GRID_SIZE / 2; snake.push(segment); game.addChild(segment); } // Create health hearts for (var i = 0; i < 5; i++) { var heart = LK.getAsset('heart', { anchorX: 0.5, anchorY: 0.5, x: 150 + i * 60, y: 100 }); hearts.push(heart); LK.gui.topLeft.addChild(heart); } // Create score display var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Create arrow buttons var upButton = new ArrowButton('up'); upButton.x = 1700; upButton.y = 2200; game.addChild(upButton); var downButton = new ArrowButton('down'); downButton.x = 1700; downButton.y = 2400; game.addChild(downButton); var leftButton = new ArrowButton('left'); leftButton.x = 1580; leftButton.y = 2300; game.addChild(leftButton); var rightButton = new ArrowButton('right'); rightButton.x = 1820; rightButton.y = 2300; game.addChild(rightButton); function gridToWorldX(gridX) { return GAME_AREA_X + gridX * GRID_SIZE + GRID_SIZE / 2; } function gridToWorldY(gridY) { return GAME_AREA_Y + gridY * GRID_SIZE + GRID_SIZE / 2; } function isValidGridPosition(x, y) { return x >= 0 && x < GRID_WIDTH && y >= 0 && y < GRID_HEIGHT; } function isSnakePosition(x, y) { for (var i = 0; i < snake.length; i++) { if (snake[i].gridX === x && snake[i].gridY === y) { return true; } } return false; } function isOccupiedPosition(x, y) { if (isSnakePosition(x, y)) return true; for (var i = 0; i < apples.length; i++) { if (apples[i].gridX === x && apples[i].gridY === y) { return true; } } for (var i = 0; i < eggs.length; i++) { if (eggs[i].gridX === x && eggs[i].gridY === y) { return true; } } return false; } function getRandomFreePosition() { var attempts = 0; var maxAttempts = 100; while (attempts < maxAttempts) { var x = Math.floor(Math.random() * GRID_WIDTH); var y = Math.floor(Math.random() * GRID_HEIGHT); if (!isOccupiedPosition(x, y)) { return { x: x, y: y }; } attempts++; } return null; } function spawnApple(type) { var pos = getRandomFreePosition(); if (!pos) return; var apple = new Apple(type); apple.gridX = pos.x; apple.gridY = pos.y; apple.x = gridToWorldX(pos.x); apple.y = gridToWorldY(pos.y); apples.push(apple); game.addChild(apple); } function spawnEgg() { var pos = getRandomFreePosition(); if (!pos) return; var egg = new Egg(); egg.gridX = pos.x; egg.gridY = pos.y; egg.x = gridToWorldX(pos.x); egg.y = gridToWorldY(pos.y); eggs.push(egg); game.addChild(egg); } function updateHealth(newHealth) { health = Math.max(0, Math.min(5, newHealth)); for (var i = 0; i < hearts.length; i++) { hearts[i].alpha = i < health ? 1 : 0.3; } if (health <= 0) { gameActive = false; LK.showGameOver(); } } function updateScore(points) { score += points; LK.setScore(score); scoreText.setText('Score: ' + score); } function moveSnake() { if (!gameActive) return; currentDirection = nextDirection; var head = snake[0]; var newX = head.gridX; var newY = head.gridY; switch (currentDirection) { case 'up': newY--; break; case 'down': newY++; break; case 'left': newX--; break; case 'right': newX++; break; } // Check wall collision if (!isValidGridPosition(newX, newY)) { gameActive = false; LK.showGameOver(); return; } // Check self collision if (isSnakePosition(newX, newY)) { gameActive = false; LK.showGameOver(); return; } var shouldGrow = false; var growthAmount = 1; // Check apple collision for (var i = apples.length - 1; i >= 0; i--) { var apple = apples[i]; if (apple.gridX === newX && apple.gridY === newY) { if (apple.type === 'red') { shouldGrow = true; updateScore(10); LK.getSound('eat').play(); } else if (apple.type === 'green') { updateHealth(health - 1); updateScore(5); LK.getSound('hurt').play(); } else if (apple.type === 'gold') { updateScore(25); LK.getSound('bonus').play(); // Spawn 3 red apples for (var j = 0; j < 3; j++) { spawnApple('red'); } } apple.destroy(); apples.splice(i, 1); break; } } // Check egg collision for (var i = eggs.length - 1; i >= 0; i--) { var egg = eggs[i]; if (egg.gridX === newX && egg.gridY === newY) { shouldGrow = true; growthAmount = 5; updateScore(50); LK.getSound('bonus').play(); egg.destroy(); eggs.splice(i, 1); break; } } // Move snake var newHead = new SnakeSegment(true); newHead.gridX = newX; newHead.gridY = newY; newHead.x = gridToWorldX(newX); newHead.y = gridToWorldY(newY); // Convert old head to body snake[0].destroy(); var oldHeadBody = new SnakeSegment(false); oldHeadBody.gridX = head.gridX; oldHeadBody.gridY = head.gridY; oldHeadBody.x = head.x; oldHeadBody.y = head.y; snake[0] = oldHeadBody; game.addChild(oldHeadBody); snake.unshift(newHead); game.addChild(newHead); if (!shouldGrow) { var tail = snake.pop(); tail.destroy(); } else { for (var i = 1; i < growthAmount; i++) { var extraSegment = new SnakeSegment(false); var lastSegment = snake[snake.length - 1]; extraSegment.gridX = lastSegment.gridX; extraSegment.gridY = lastSegment.gridY; extraSegment.x = lastSegment.x; extraSegment.y = lastSegment.y; snake.push(extraSegment); game.addChild(extraSegment); } } } // Create dark green border around game area var borderThickness = 10; var borderColor = 0x006400; // Dark green // Top border var topBorder = LK.getAsset('snakeBody', { anchorX: 0, anchorY: 0, scaleX: (GRID_WIDTH * GRID_SIZE + borderThickness * 2) / 40, scaleY: borderThickness / 40, x: GAME_AREA_X - borderThickness, y: GAME_AREA_Y - borderThickness }); topBorder.tint = borderColor; game.addChild(topBorder); // Bottom border var bottomBorder = LK.getAsset('snakeBody', { anchorX: 0, anchorY: 0, scaleX: (GRID_WIDTH * GRID_SIZE + borderThickness * 2) / 40, scaleY: borderThickness / 40, x: GAME_AREA_X - borderThickness, y: GAME_AREA_Y + GRID_HEIGHT * GRID_SIZE }); bottomBorder.tint = borderColor; game.addChild(bottomBorder); // Left border var leftBorder = LK.getAsset('snakeBody', { anchorX: 0, anchorY: 0, scaleX: borderThickness / 40, scaleY: GRID_HEIGHT * GRID_SIZE / 40, x: GAME_AREA_X - borderThickness, y: GAME_AREA_Y }); leftBorder.tint = borderColor; game.addChild(leftBorder); // Right border var rightBorder = LK.getAsset('snakeBody', { anchorX: 0, anchorY: 0, scaleX: borderThickness / 40, scaleY: GRID_HEIGHT * GRID_SIZE / 40, x: GAME_AREA_X + GRID_WIDTH * GRID_SIZE, y: GAME_AREA_Y }); rightBorder.tint = borderColor; game.addChild(rightBorder); // Initial spawns spawnApple('red'); spawnApple('red'); spawnApple('green'); game.update = function () { if (!gameActive) return; moveTimer++; if (moveTimer >= moveInterval) { moveTimer = 0; moveSnake(); } // Spawn new items occasionally if (LK.ticks % 300 === 0) { // Every 5 seconds if (Math.random() < 0.7) { spawnApple('red'); } else if (Math.random() < 0.8) { spawnApple('green'); } else if (Math.random() < 0.95) { spawnApple('gold'); } else { spawnEgg(); } } }; game.down = function (x, y, obj) { // Handle arrow button presses - use the x, y coordinates directly as they are already in game space // Check which direction was pressed based on position if (x > 1640 && x < 1760 && y > 2140 && y < 2260) { // Up button if (currentDirection !== 'down') { nextDirection = 'up'; } } else if (x > 1640 && x < 1760 && y > 2340 && y < 2460) { // Down button if (currentDirection !== 'up') { nextDirection = 'down'; } } else if (x > 1520 && x < 1640 && y > 2240 && y < 2360) { // Left button if (currentDirection !== 'right') { nextDirection = 'left'; } } else if (x > 1760 && x < 1880 && y > 2240 && y < 2360) { // Right button if (currentDirection !== 'left') { nextDirection = 'right'; } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Apple = Container.expand(function (type) {
var self = Container.call(this);
var assetName = type + 'Apple';
var graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.gridX = 0;
self.gridY = 0;
return self;
});
var ArrowButton = Container.expand(function (direction) {
var self = Container.call(this);
var graphics = self.attachAsset('arrowButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = direction;
self.down = function (x, y, obj) {
currentDirection = self.direction;
graphics.alpha = 0.7;
tween(graphics, {
alpha: 1
}, {
duration: 200
});
};
return self;
});
var Egg = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('egg', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
return self;
});
var SnakeSegment = Container.expand(function (isHead) {
var self = Container.call(this);
if (isHead) {
var graphics = self.attachAsset('snakeHead', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
var graphics = self.attachAsset('snakeBody', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.gridX = 0;
self.gridY = 0;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var GRID_SIZE = 40;
var GRID_WIDTH = 25;
var GRID_HEIGHT = 35;
var GAME_AREA_X = (2048 - GRID_WIDTH * GRID_SIZE) / 2;
var GAME_AREA_Y = 200;
var snake = [];
var currentDirection = 'right';
var nextDirection = 'right';
var moveTimer = 0;
var moveInterval = 15;
var health = 5;
var score = 0;
var gameActive = true;
var apples = [];
var eggs = [];
var hearts = [];
// Initialize snake with 4 segments
for (var i = 0; i < 4; i++) {
var segment = new SnakeSegment(i === 0);
segment.gridX = 12 - i;
segment.gridY = 17;
segment.x = GAME_AREA_X + segment.gridX * GRID_SIZE + GRID_SIZE / 2;
segment.y = GAME_AREA_Y + segment.gridY * GRID_SIZE + GRID_SIZE / 2;
snake.push(segment);
game.addChild(segment);
}
// Create health hearts
for (var i = 0; i < 5; i++) {
var heart = LK.getAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: 150 + i * 60,
y: 100
});
hearts.push(heart);
LK.gui.topLeft.addChild(heart);
}
// Create score display
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create arrow buttons
var upButton = new ArrowButton('up');
upButton.x = 1700;
upButton.y = 2200;
game.addChild(upButton);
var downButton = new ArrowButton('down');
downButton.x = 1700;
downButton.y = 2400;
game.addChild(downButton);
var leftButton = new ArrowButton('left');
leftButton.x = 1580;
leftButton.y = 2300;
game.addChild(leftButton);
var rightButton = new ArrowButton('right');
rightButton.x = 1820;
rightButton.y = 2300;
game.addChild(rightButton);
function gridToWorldX(gridX) {
return GAME_AREA_X + gridX * GRID_SIZE + GRID_SIZE / 2;
}
function gridToWorldY(gridY) {
return GAME_AREA_Y + gridY * GRID_SIZE + GRID_SIZE / 2;
}
function isValidGridPosition(x, y) {
return x >= 0 && x < GRID_WIDTH && y >= 0 && y < GRID_HEIGHT;
}
function isSnakePosition(x, y) {
for (var i = 0; i < snake.length; i++) {
if (snake[i].gridX === x && snake[i].gridY === y) {
return true;
}
}
return false;
}
function isOccupiedPosition(x, y) {
if (isSnakePosition(x, y)) return true;
for (var i = 0; i < apples.length; i++) {
if (apples[i].gridX === x && apples[i].gridY === y) {
return true;
}
}
for (var i = 0; i < eggs.length; i++) {
if (eggs[i].gridX === x && eggs[i].gridY === y) {
return true;
}
}
return false;
}
function getRandomFreePosition() {
var attempts = 0;
var maxAttempts = 100;
while (attempts < maxAttempts) {
var x = Math.floor(Math.random() * GRID_WIDTH);
var y = Math.floor(Math.random() * GRID_HEIGHT);
if (!isOccupiedPosition(x, y)) {
return {
x: x,
y: y
};
}
attempts++;
}
return null;
}
function spawnApple(type) {
var pos = getRandomFreePosition();
if (!pos) return;
var apple = new Apple(type);
apple.gridX = pos.x;
apple.gridY = pos.y;
apple.x = gridToWorldX(pos.x);
apple.y = gridToWorldY(pos.y);
apples.push(apple);
game.addChild(apple);
}
function spawnEgg() {
var pos = getRandomFreePosition();
if (!pos) return;
var egg = new Egg();
egg.gridX = pos.x;
egg.gridY = pos.y;
egg.x = gridToWorldX(pos.x);
egg.y = gridToWorldY(pos.y);
eggs.push(egg);
game.addChild(egg);
}
function updateHealth(newHealth) {
health = Math.max(0, Math.min(5, newHealth));
for (var i = 0; i < hearts.length; i++) {
hearts[i].alpha = i < health ? 1 : 0.3;
}
if (health <= 0) {
gameActive = false;
LK.showGameOver();
}
}
function updateScore(points) {
score += points;
LK.setScore(score);
scoreText.setText('Score: ' + score);
}
function moveSnake() {
if (!gameActive) return;
currentDirection = nextDirection;
var head = snake[0];
var newX = head.gridX;
var newY = head.gridY;
switch (currentDirection) {
case 'up':
newY--;
break;
case 'down':
newY++;
break;
case 'left':
newX--;
break;
case 'right':
newX++;
break;
}
// Check wall collision
if (!isValidGridPosition(newX, newY)) {
gameActive = false;
LK.showGameOver();
return;
}
// Check self collision
if (isSnakePosition(newX, newY)) {
gameActive = false;
LK.showGameOver();
return;
}
var shouldGrow = false;
var growthAmount = 1;
// Check apple collision
for (var i = apples.length - 1; i >= 0; i--) {
var apple = apples[i];
if (apple.gridX === newX && apple.gridY === newY) {
if (apple.type === 'red') {
shouldGrow = true;
updateScore(10);
LK.getSound('eat').play();
} else if (apple.type === 'green') {
updateHealth(health - 1);
updateScore(5);
LK.getSound('hurt').play();
} else if (apple.type === 'gold') {
updateScore(25);
LK.getSound('bonus').play();
// Spawn 3 red apples
for (var j = 0; j < 3; j++) {
spawnApple('red');
}
}
apple.destroy();
apples.splice(i, 1);
break;
}
}
// Check egg collision
for (var i = eggs.length - 1; i >= 0; i--) {
var egg = eggs[i];
if (egg.gridX === newX && egg.gridY === newY) {
shouldGrow = true;
growthAmount = 5;
updateScore(50);
LK.getSound('bonus').play();
egg.destroy();
eggs.splice(i, 1);
break;
}
}
// Move snake
var newHead = new SnakeSegment(true);
newHead.gridX = newX;
newHead.gridY = newY;
newHead.x = gridToWorldX(newX);
newHead.y = gridToWorldY(newY);
// Convert old head to body
snake[0].destroy();
var oldHeadBody = new SnakeSegment(false);
oldHeadBody.gridX = head.gridX;
oldHeadBody.gridY = head.gridY;
oldHeadBody.x = head.x;
oldHeadBody.y = head.y;
snake[0] = oldHeadBody;
game.addChild(oldHeadBody);
snake.unshift(newHead);
game.addChild(newHead);
if (!shouldGrow) {
var tail = snake.pop();
tail.destroy();
} else {
for (var i = 1; i < growthAmount; i++) {
var extraSegment = new SnakeSegment(false);
var lastSegment = snake[snake.length - 1];
extraSegment.gridX = lastSegment.gridX;
extraSegment.gridY = lastSegment.gridY;
extraSegment.x = lastSegment.x;
extraSegment.y = lastSegment.y;
snake.push(extraSegment);
game.addChild(extraSegment);
}
}
}
// Create dark green border around game area
var borderThickness = 10;
var borderColor = 0x006400; // Dark green
// Top border
var topBorder = LK.getAsset('snakeBody', {
anchorX: 0,
anchorY: 0,
scaleX: (GRID_WIDTH * GRID_SIZE + borderThickness * 2) / 40,
scaleY: borderThickness / 40,
x: GAME_AREA_X - borderThickness,
y: GAME_AREA_Y - borderThickness
});
topBorder.tint = borderColor;
game.addChild(topBorder);
// Bottom border
var bottomBorder = LK.getAsset('snakeBody', {
anchorX: 0,
anchorY: 0,
scaleX: (GRID_WIDTH * GRID_SIZE + borderThickness * 2) / 40,
scaleY: borderThickness / 40,
x: GAME_AREA_X - borderThickness,
y: GAME_AREA_Y + GRID_HEIGHT * GRID_SIZE
});
bottomBorder.tint = borderColor;
game.addChild(bottomBorder);
// Left border
var leftBorder = LK.getAsset('snakeBody', {
anchorX: 0,
anchorY: 0,
scaleX: borderThickness / 40,
scaleY: GRID_HEIGHT * GRID_SIZE / 40,
x: GAME_AREA_X - borderThickness,
y: GAME_AREA_Y
});
leftBorder.tint = borderColor;
game.addChild(leftBorder);
// Right border
var rightBorder = LK.getAsset('snakeBody', {
anchorX: 0,
anchorY: 0,
scaleX: borderThickness / 40,
scaleY: GRID_HEIGHT * GRID_SIZE / 40,
x: GAME_AREA_X + GRID_WIDTH * GRID_SIZE,
y: GAME_AREA_Y
});
rightBorder.tint = borderColor;
game.addChild(rightBorder);
// Initial spawns
spawnApple('red');
spawnApple('red');
spawnApple('green');
game.update = function () {
if (!gameActive) return;
moveTimer++;
if (moveTimer >= moveInterval) {
moveTimer = 0;
moveSnake();
}
// Spawn new items occasionally
if (LK.ticks % 300 === 0) {
// Every 5 seconds
if (Math.random() < 0.7) {
spawnApple('red');
} else if (Math.random() < 0.8) {
spawnApple('green');
} else if (Math.random() < 0.95) {
spawnApple('gold');
} else {
spawnEgg();
}
}
};
game.down = function (x, y, obj) {
// Handle arrow button presses - use the x, y coordinates directly as they are already in game space
// Check which direction was pressed based on position
if (x > 1640 && x < 1760 && y > 2140 && y < 2260) {
// Up button
if (currentDirection !== 'down') {
nextDirection = 'up';
}
} else if (x > 1640 && x < 1760 && y > 2340 && y < 2460) {
// Down button
if (currentDirection !== 'up') {
nextDirection = 'down';
}
} else if (x > 1520 && x < 1640 && y > 2240 && y < 2360) {
// Left button
if (currentDirection !== 'right') {
nextDirection = 'left';
}
} else if (x > 1760 && x < 1880 && y > 2240 && y < 2360) {
// Right button
if (currentDirection !== 'left') {
nextDirection = 'right';
}
}
};
Polygon. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
egg. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Golden apple. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Green apple. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Heart . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Green circle. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
green snake head. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat