🐍 Пишем «Змейку» на Lua с нуля

Хотите написать свою первую игру без движков? Разберём, как сделать легендарную «Змейку» на Lua прямо в консоли — просто и понятно.

РазработкаLua

6 мин

Создать собственную игру — мечта многих, кто начинает изучать программирование. И если взять язык 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-канал, где мы обсуждаем крутые идеи, делимся опытом и вместе разбираем задачи — учиться становится не только полезно, но и весело.

Комментарии