User prompt
Rekor sayıcını 6'a al.
User prompt
Skor sayıcı görünümlü bir yerde olsun. Biraz daha altı altı.
User prompt
Oyun level level olsun. Her leveli geçtiğimizde level artsın. Level sayıcı olsun yani.
User prompt
Generate the first version of the source code of my game: Yılan: Sonsuz Sürünüş.
User prompt
Yılanın karşısına belirli meyveler çıksın.
Code edit (1 edits merged)
Please save this source code
User prompt
Yılan: Sonsuz Sürünüş
Initial prompt
Bana bir yılan oyunu oluştur.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Food class var Food = Container.expand(function (fruitType) { var self = Container.call(this); // Default to apple if not specified var type = fruitType || 'apple'; var assetId = 'food_' + type; var food = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.fruitType = type; return self; }); // Snake Head class var SnakeHead = Container.expand(function () { var self = Container.call(this); var head = self.attachAsset('snakeHead', { anchorX: 0.5, anchorY: 0.5 }); return self; }); // Snake Segment class var SnakeSegment = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('snakeBody', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game constants // Snake head: green ellipse // Snake body: lighter green ellipse // Food: red ellipse // Fruit assets // Snake assets var GRID_SIZE = 80; // Each cell is 80x80 px var GRID_COLS = Math.floor(2048 / GRID_SIZE); var GRID_ROWS = Math.floor(2732 / GRID_SIZE); // Directions var DIR_UP = 0, DIR_RIGHT = 1, DIR_DOWN = 2, DIR_LEFT = 3; // Snake state var snake = []; var snakeDir = DIR_RIGHT; var nextDir = DIR_RIGHT; var pendingGrowth = 0; // Food state var food = null; // Score var score = 0; var level = 1; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); scoreTxt.y = 600; // Move score lower for better grouping at y=600 LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('Level 1', { size: 80, fill: 0xFFD700 }); levelTxt.anchor.set(0.5, 0); levelTxt.y = scoreTxt.y + scoreTxt.height + 10; // Place level just below score LK.gui.top.addChild(levelTxt); // Helper: get grid-aligned position function gridPos(col, row) { return { x: col * GRID_SIZE + GRID_SIZE / 2, y: row * GRID_SIZE + GRID_SIZE / 2 }; } // Helper: get random empty cell function getRandomEmptyCell() { var occupied = {}; for (var i = 0; i < snake.length; i++) { occupied[snake[i].col + ',' + snake[i].row] = true; } var empty = []; for (var c = 0; c < GRID_COLS; c++) { for (var r = 0; r < GRID_ROWS; r++) { if (!occupied[c + ',' + r]) empty.push({ col: c, row: r }); } } if (empty.length === 0) return null; var idx = Math.floor(Math.random() * empty.length); return empty[idx]; } // Initialize snake in center function resetSnake() { // Remove old snake for (var i = 0; i < snake.length; i++) { snake[i].destroy(); } snake = []; var startCol = Math.floor(GRID_COLS / 2); var startRow = Math.floor(GRID_ROWS / 2); // Head var head = new SnakeHead(); head.col = startCol; head.row = startRow; var pos = gridPos(startCol, startRow); head.x = pos.x; head.y = pos.y; game.addChild(head); snake.push(head); // 2 body segments for (var i = 1; i <= 2; i++) { var seg = new SnakeSegment(); seg.col = startCol - i; seg.row = startRow; var pos2 = gridPos(seg.col, seg.row); seg.x = pos2.x; seg.y = pos2.y; game.addChild(seg); snake.push(seg); } snakeDir = DIR_RIGHT; nextDir = DIR_RIGHT; pendingGrowth = 0; } // Place food at random empty cell function placeFood() { if (food) food.destroy(); var cell = getRandomEmptyCell(); if (!cell) return; // Pick a random fruit type var fruitTypes = ['apple', 'banana', 'grape', 'orange']; var idx = Math.floor(Math.random() * fruitTypes.length); var fruitType = fruitTypes[idx]; food = new Food(fruitType); food.col = cell.col; food.row = cell.row; var pos = gridPos(cell.col, cell.row); food.x = pos.x; food.y = pos.y; game.addChild(food); } // Check collision with self or wall function checkCollision(col, row) { // Wall if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return true; // Self for (var i = 0; i < snake.length; i++) { if (snake[i].col === col && snake[i].row === row) return true; } return false; } // Move snake one step function moveSnake() { // Compute new head position var head = snake[0]; var dcol = 0, drow = 0; if (snakeDir === DIR_UP) drow = -1;else if (snakeDir === DIR_DOWN) drow = 1;else if (snakeDir === DIR_LEFT) dcol = -1;else if (snakeDir === DIR_RIGHT) dcol = 1; var newCol = head.col + dcol; var newRow = head.row + drow; // Check collision for (var i = 0; i < snake.length; i++) { if (snake[i].col === newCol && snake[i].row === newRow) { // Collided with self LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } if (newCol < 0 || newCol >= GRID_COLS || newRow < 0 || newRow >= GRID_ROWS) { // Collided with wall LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } // Move body segments for (var i = snake.length - 1; i > 0; i--) { snake[i].col = snake[i - 1].col; snake[i].row = snake[i - 1].row; } head.col = newCol; head.row = newRow; // Animate movement for (var i = 0; i < snake.length; i++) { var pos = gridPos(snake[i].col, snake[i].row); tween(snake[i], { x: pos.x, y: pos.y }, { duration: 80, easing: tween.linear }); } // Check food collision if (food && head.col === food.col && head.row === food.row) { // Eat food pendingGrowth += 1; score += 1; LK.setScore(score); scoreTxt.setText(score); // Level up every 5 points var prevLevel = level; level = Math.floor(score / 5) + 1; if (level !== prevLevel) { levelTxt.setText('Level ' + level); // Optional: flash level text or add effect LK.effects.flashObject(levelTxt, 0xFFD700, 600); } placeFood(); } // Grow if needed if (pendingGrowth > 0) { var tail = snake[snake.length - 1]; var newSeg = new SnakeSegment(); newSeg.col = tail.col; newSeg.row = tail.row; var pos2 = gridPos(newSeg.col, newSeg.row); newSeg.x = pos2.x; newSeg.y = pos2.y; game.addChild(newSeg); snake.push(newSeg); pendingGrowth -= 1; } } // Touch controls: swipe to change direction var touchStartX = null, touchStartY = null; game.down = function (x, y, obj) { touchStartX = x; touchStartY = y; }; game.up = function (x, y, obj) { if (touchStartX === null || touchStartY === null) return; var dx = x - touchStartX; var dy = y - touchStartY; if (Math.abs(dx) > Math.abs(dy)) { // Horizontal swipe if (dx > 40 && snakeDir !== DIR_LEFT) nextDir = DIR_RIGHT;else if (dx < -40 && snakeDir !== DIR_RIGHT) nextDir = DIR_LEFT; } else { // Vertical swipe if (dy > 40 && snakeDir !== DIR_UP) nextDir = DIR_DOWN;else if (dy < -40 && snakeDir !== DIR_DOWN) nextDir = DIR_UP; } touchStartX = null; touchStartY = null; }; // Also allow tap on left/right/top/bottom of screen to change direction game.move = function (x, y, obj) { // No drag for snake }; // Game update: move snake every N ticks var MOVE_INTERVAL = 10; // Lower = faster var moveTick = 0; game.update = function () { if (snake.length === 0) { resetSnake(); score = 0; LK.setScore(0); scoreTxt.setText('0'); level = 1; levelTxt.setText('Level 1'); placeFood(); moveTick = 0; return; } moveTick++; if (moveTick >= MOVE_INTERVAL) { // Only allow 90-degree turns (no reverse) if (snakeDir === DIR_UP && nextDir !== DIR_DOWN || snakeDir === DIR_DOWN && nextDir !== DIR_UP || snakeDir === DIR_LEFT && nextDir !== DIR_RIGHT || snakeDir === DIR_RIGHT && nextDir !== DIR_LEFT) { snakeDir = nextDir; } moveSnake(); moveTick = 0; } }; // Center score text horizontally scoreTxt.setText('0'); scoreTxt.anchor.set(0.5, 0); // Initial setup resetSnake(); placeFood();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Food class
var Food = Container.expand(function (fruitType) {
var self = Container.call(this);
// Default to apple if not specified
var type = fruitType || 'apple';
var assetId = 'food_' + type;
var food = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.fruitType = type;
return self;
});
// Snake Head class
var SnakeHead = Container.expand(function () {
var self = Container.call(this);
var head = self.attachAsset('snakeHead', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Snake Segment class
var SnakeSegment = Container.expand(function () {
var self = Container.call(this);
var body = self.attachAsset('snakeBody', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Game constants
// Snake head: green ellipse
// Snake body: lighter green ellipse
// Food: red ellipse
// Fruit assets
// Snake assets
var GRID_SIZE = 80; // Each cell is 80x80 px
var GRID_COLS = Math.floor(2048 / GRID_SIZE);
var GRID_ROWS = Math.floor(2732 / GRID_SIZE);
// Directions
var DIR_UP = 0,
DIR_RIGHT = 1,
DIR_DOWN = 2,
DIR_LEFT = 3;
// Snake state
var snake = [];
var snakeDir = DIR_RIGHT;
var nextDir = DIR_RIGHT;
var pendingGrowth = 0;
// Food state
var food = null;
// Score
var score = 0;
var level = 1;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.y = 600; // Move score lower for better grouping at y=600
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level 1', {
size: 80,
fill: 0xFFD700
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = scoreTxt.y + scoreTxt.height + 10; // Place level just below score
LK.gui.top.addChild(levelTxt);
// Helper: get grid-aligned position
function gridPos(col, row) {
return {
x: col * GRID_SIZE + GRID_SIZE / 2,
y: row * GRID_SIZE + GRID_SIZE / 2
};
}
// Helper: get random empty cell
function getRandomEmptyCell() {
var occupied = {};
for (var i = 0; i < snake.length; i++) {
occupied[snake[i].col + ',' + snake[i].row] = true;
}
var empty = [];
for (var c = 0; c < GRID_COLS; c++) {
for (var r = 0; r < GRID_ROWS; r++) {
if (!occupied[c + ',' + r]) empty.push({
col: c,
row: r
});
}
}
if (empty.length === 0) return null;
var idx = Math.floor(Math.random() * empty.length);
return empty[idx];
}
// Initialize snake in center
function resetSnake() {
// Remove old snake
for (var i = 0; i < snake.length; i++) {
snake[i].destroy();
}
snake = [];
var startCol = Math.floor(GRID_COLS / 2);
var startRow = Math.floor(GRID_ROWS / 2);
// Head
var head = new SnakeHead();
head.col = startCol;
head.row = startRow;
var pos = gridPos(startCol, startRow);
head.x = pos.x;
head.y = pos.y;
game.addChild(head);
snake.push(head);
// 2 body segments
for (var i = 1; i <= 2; i++) {
var seg = new SnakeSegment();
seg.col = startCol - i;
seg.row = startRow;
var pos2 = gridPos(seg.col, seg.row);
seg.x = pos2.x;
seg.y = pos2.y;
game.addChild(seg);
snake.push(seg);
}
snakeDir = DIR_RIGHT;
nextDir = DIR_RIGHT;
pendingGrowth = 0;
}
// Place food at random empty cell
function placeFood() {
if (food) food.destroy();
var cell = getRandomEmptyCell();
if (!cell) return;
// Pick a random fruit type
var fruitTypes = ['apple', 'banana', 'grape', 'orange'];
var idx = Math.floor(Math.random() * fruitTypes.length);
var fruitType = fruitTypes[idx];
food = new Food(fruitType);
food.col = cell.col;
food.row = cell.row;
var pos = gridPos(cell.col, cell.row);
food.x = pos.x;
food.y = pos.y;
game.addChild(food);
}
// Check collision with self or wall
function checkCollision(col, row) {
// Wall
if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) return true;
// Self
for (var i = 0; i < snake.length; i++) {
if (snake[i].col === col && snake[i].row === row) return true;
}
return false;
}
// Move snake one step
function moveSnake() {
// Compute new head position
var head = snake[0];
var dcol = 0,
drow = 0;
if (snakeDir === DIR_UP) drow = -1;else if (snakeDir === DIR_DOWN) drow = 1;else if (snakeDir === DIR_LEFT) dcol = -1;else if (snakeDir === DIR_RIGHT) dcol = 1;
var newCol = head.col + dcol;
var newRow = head.row + drow;
// Check collision
for (var i = 0; i < snake.length; i++) {
if (snake[i].col === newCol && snake[i].row === newRow) {
// Collided with self
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
if (newCol < 0 || newCol >= GRID_COLS || newRow < 0 || newRow >= GRID_ROWS) {
// Collided with wall
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
// Move body segments
for (var i = snake.length - 1; i > 0; i--) {
snake[i].col = snake[i - 1].col;
snake[i].row = snake[i - 1].row;
}
head.col = newCol;
head.row = newRow;
// Animate movement
for (var i = 0; i < snake.length; i++) {
var pos = gridPos(snake[i].col, snake[i].row);
tween(snake[i], {
x: pos.x,
y: pos.y
}, {
duration: 80,
easing: tween.linear
});
}
// Check food collision
if (food && head.col === food.col && head.row === food.row) {
// Eat food
pendingGrowth += 1;
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Level up every 5 points
var prevLevel = level;
level = Math.floor(score / 5) + 1;
if (level !== prevLevel) {
levelTxt.setText('Level ' + level);
// Optional: flash level text or add effect
LK.effects.flashObject(levelTxt, 0xFFD700, 600);
}
placeFood();
}
// Grow if needed
if (pendingGrowth > 0) {
var tail = snake[snake.length - 1];
var newSeg = new SnakeSegment();
newSeg.col = tail.col;
newSeg.row = tail.row;
var pos2 = gridPos(newSeg.col, newSeg.row);
newSeg.x = pos2.x;
newSeg.y = pos2.y;
game.addChild(newSeg);
snake.push(newSeg);
pendingGrowth -= 1;
}
}
// Touch controls: swipe to change direction
var touchStartX = null,
touchStartY = null;
game.down = function (x, y, obj) {
touchStartX = x;
touchStartY = y;
};
game.up = function (x, y, obj) {
if (touchStartX === null || touchStartY === null) return;
var dx = x - touchStartX;
var dy = y - touchStartY;
if (Math.abs(dx) > Math.abs(dy)) {
// Horizontal swipe
if (dx > 40 && snakeDir !== DIR_LEFT) nextDir = DIR_RIGHT;else if (dx < -40 && snakeDir !== DIR_RIGHT) nextDir = DIR_LEFT;
} else {
// Vertical swipe
if (dy > 40 && snakeDir !== DIR_UP) nextDir = DIR_DOWN;else if (dy < -40 && snakeDir !== DIR_DOWN) nextDir = DIR_UP;
}
touchStartX = null;
touchStartY = null;
};
// Also allow tap on left/right/top/bottom of screen to change direction
game.move = function (x, y, obj) {
// No drag for snake
};
// Game update: move snake every N ticks
var MOVE_INTERVAL = 10; // Lower = faster
var moveTick = 0;
game.update = function () {
if (snake.length === 0) {
resetSnake();
score = 0;
LK.setScore(0);
scoreTxt.setText('0');
level = 1;
levelTxt.setText('Level 1');
placeFood();
moveTick = 0;
return;
}
moveTick++;
if (moveTick >= MOVE_INTERVAL) {
// Only allow 90-degree turns (no reverse)
if (snakeDir === DIR_UP && nextDir !== DIR_DOWN || snakeDir === DIR_DOWN && nextDir !== DIR_UP || snakeDir === DIR_LEFT && nextDir !== DIR_RIGHT || snakeDir === DIR_RIGHT && nextDir !== DIR_LEFT) {
snakeDir = nextDir;
}
moveSnake();
moveTick = 0;
}
};
// Center score text horizontally
scoreTxt.setText('0');
scoreTxt.anchor.set(0.5, 0);
// Initial setup
resetSnake();
placeFood();
yılan resmi. In-Game asset. 2d. High contrast. No shadows
yılan gövdesi. In-Game asset. 2d. High contrast. No shadows
portakal. In-Game asset. 2d. High contrast. No shadows
elma. In-Game asset. 2d. High contrast. No shadows
muz resmi. In-Game asset. 2d. High contrast. No shadows
üzüm resmi. In-Game asset. 2d. High contrast. No shadows