🐍 Пишем «Змейку» на Lua с нуля
Хотите написать свою первую игру без движков? Разберём, как сделать легендарную «Змейку» на Lua прямо в консоли — просто и понятно.
Создать собственную игру — мечта многих, кто начинает изучать программирование. И если взять язык Lua, то отличным стартовым проектом станет легендарная игра «Змейка». Причём мы обойдёмся без движков и библиотек — только чистый Lua и консоль.
Lua прост в освоении, имеет лаконичный синтаксис и отлично подходит для создания игр и прототипов. Его часто используют в игровых движках (Roblox, Love2D, Defold), но даже без них на Lua можно написать рабочую игру.

Что нужно для нашей «Змейки»?
Игровое поле — двумерная сетка, в которой двигается змейка.
Змейка — список координат её сегментов.
Еда — случайная точка на поле.
Управление — стрелки (или WASD).
Механика — змейка двигается, растёт при поедании еды, проигрывает при столкновении со стеной или собой.
Первый шаг — игровое поле
width, height = 20, 20
Змейка и её движение
snake = {
{x = 10, y = 10},
{x = 9, y = 10},
{x = 8, y = 10}
}
direction = "right"
Еда
math.randomseed(os.time())
food = {x = math.random(1, width), y = math.random(1, height)}
Управление
io.input():setvbuf("no")
function getInput()
local key = io.read(1)
if key == "w" then direction = "up" end
if key == "s" then direction = "down" end
if key == "a" then direction = "left" end
if key == "d" then direction = "right" end
end
Игровой цикл
while true do
getInput()
-- перемещаем змейку
head = {x = snake[1].x, y = snake[1].y}
if direction == "up" then head.y = head.y - 1 end
if direction == "down" then head.y = head.y + 1 end
if direction == "left" then head.x = head.x - 1 end
if direction == "right" then head.x = head.x + 1 end
table.insert(snake, 1, head)
-- проверка на еду
if head.x == food.x and head.y == food.y then
food = {x = math.random(1, width), y = math.random(1, height)}
else
table.remove(snake)
end
-- проверка столкновений
if head.x < 1 or head.y < 1 or head.x > width or head.y > height then
print("Game Over!")
break
end
-- вывод поля
os.execute("clear") -- для Linux/macOS (или "cls" для Windows)
for y = 1, height do
for x = 1, width do
local symbol = " . "
if x == food.x and y == food.y then
symbol = " @ "
end
for i, segment in ipairs(snake) do
if segment.x == x and segment.y == y then
symbol = " # "
end
end
io.write(symbol)
end
io.write("\n")
end
os.execute("sleep 0.1")
end
Что можно улучшить
Добавить счётчик очков.
Сделать разные уровни скорости.
Добавить возможность выхода (например, при вводе q).
Красиво отрисовать змейку (например, голова «O», тело «o»).
Написать «Змейку» на Lua без движков — это отличный проект для новичка. Он помогает понять:
как работать с таблицами,
как реализовать игровой цикл,
как обрабатывать пользовательский ввод.
А уже потом можно переносить этот опыт в Love2D, Roblox или даже писать собственный мини-движок!
В Кодике мы делаем обучение программированию увлекательным и понятным: у нас есть интересные курсы с заданиями, которые помогают прокачивать навыки шаг за шагом.
А ещё у нас есть активный telegram-канал, где мы обсуждаем крутые идеи, делимся опытом и вместе разбираем задачи — учиться становится не только полезно, но и весело.