Kennst du dieses Gefühl, wenn du eine neue Programmiersprache entdeckst und die ersten 20 Minuten denkst: „Na, das ist doch einfach“? Und dann geht es los. Die Klammern sind nicht die richtigen, du hast die Semikolons vergessen, der Compiler schreit dich an wie ein Nachbar von oben um 3 Uhr morgens.
Mit Lua ist alles anders. Im Ernst. Diese Sprache ist so lakonisch, dass du ihre Grundlagen bei einer Tasse Kaffee lernen kannst. Und am Abend kannst du ein voll funktionsfähiges Mini-Projekt zusammenstellen. Du glaubst es nicht? Lass uns das mal überprüfen.

Was ist Lua überhaupt und warum brauche ich es?
Lua (ausgesprochen „Lu-a“, nicht „Lua“ - aber ehrlich gesagt sagt jeder, wie er will) ist eine einfache Skriptsprache, die 1993 in Brasilien geboren wurde. Ja, sie ist älter als die meisten JavaScript-Frameworks. Und im Gegensatz zu ihnen ist sie immer noch nicht veraltet.
Wo Lua verwendet wird:
Spiele - Roblox, World of Warcraft, Garry's Mod, Love2D. Wenn du jemals ein Add-on für WoW geschrieben hast, bist du bereits ein Lua-Entwickler, herzlichen Glückwunsch.
Nginx und OpenResty — Hoch ausgelastete Webserver führen Lua-Skripte aus, um Anfragen zu verarbeiten.
Neovim — Wenn du zu denjenigen gehörst, die ihren Editor länger einrichten als Code schreiben, ist Lua dein neuer bester Freund.
Eingebettete Systeme und IoT — Lua ist so leicht, dass es auch dort funktioniert, wo Python versagt.
Kurz gesagt, Lua ist wie ein Schweizer Messer, nur ohne Korkenzieher. Kompakt, nützlich und erstaunlich leistungsstark.
Schritt 0: Installation (schneller als npm install)
Linux/macOS:
# Ubuntu / Debian
sudo apt install lua5.4
# macOS
brew install luaWindows:
LuaBinaries herunterladen von der offiziellen Website oder durch Scoop setzen:
scoop install luaWir prüfen:
lua -v
# Lua 5.4.x Copyright (C) ...Fertig. Weder Docker noch eine virtuelle Umgebung noch package.json mit 300 Zeilen. Es funktioniert einfach.
Schritt 1: Hello World und die ersten Grundlagen
Erstelle die Datei hello.lua:
print("Hello, World!")
print("Lua is easier than you thought")Starten:
lua hello.luaDas ist alles. Ohne public static void main, ohne import sys, ohne use strict. Einfach schreiben und loslegen.
Variablen — keine Typen, keine Probleme
local name = "Alexey"
local age = 25
local is_developer = true
print(name .. " — developer: " .. tostring(is_developer))Bitte beachten Sie: .. ist eine Verkettung von Zeilen. Nicht +, keine Vorlagenzeilen. Zwei bescheidene Punkte. Lua ist ein Minimalist.
Bedingungen — der gute alte Klassiker
local level = 42
if level >= 100 then
print("You're a legend!")
elseif level >= 50 then
print("Almost there!")
else
print("Keep swinging")
endBeachte: then und end anstelle von geschweiften Klammern. Zuerst ungewohnt, aber nach einer Stunde merkt man es nicht mehr.
Zyklen - drei Arten für alle Fälle
-- Цикл for (классический)
for i = 1, 5 do
print("Iteration: " .. i)
end
-- Цикл while
local count = 0
while count < 3 do
count = count + 1
print("Counter: " .. count)
end
-- Перебор таблицы (о таблицах — ниже)
local fruits = {"apple", "banana", "mango"}
for index, fruit in ipairs(fruits) do
print(index .. ". " .. fruit)
endSchritt 2: Tabellen sind die einzige Datenstruktur (und das reicht)
In Lua gibt es keine Arrays, Wörterbücher, Objekte, Sets, Tuples, Decks ... Es gibt Tabellen. Und sie ersetzen alles. Es ist, als ob ein JavaScript-Objekt und ein Array zu einer Entität verschmolzen wären:
-- Как массив
local colors = {"Red", "Green", "Blue"}
print(colors[1]) -- "Red" (индексация с 1, да-да)
-- Как словарь
local player = {
name = "Hero",
hp = 100,
level = 1
}
print(player.name) -- "Hero"
print(player["hp"]) -- 100 (тоже работает)
-- Комбинированный вариант
local config = {
title = "My Game",
resolution = {1920, 1080},
fullscreen = true
}Indexierung ab 1 - Ja, es ist ein Schock nach all den Sprachen mit Nullindexierung. Aber du wirst dich daran gewöhnen. Wahrscheinlich. Irgendwann.
Schritt 3: Funktionen — erstklassige Bürger
-- Обычная функция
local function greet(name)
return "Hi, " .. name .. "!"
end
print(greet("world"))
-- Функция как переменная (анонимная)
local square = function(x)
return x * x
end
print(square(7)) -- 49
-- Множественный возврат (это Lua-суперсила!)
local function get_player_stats()
return "Hero", 100, 15
end
local name, hp, attack = get_player_stats()
print(name .. " | HP: " .. hp .. " | ATK: " .. attack)Mehrere Rückgabewerte sind eines dieser Dinge in Lua, die einen dazu bringen, zu seufzen: „Warum ist das nicht überall so?“
Schritt 4: Wir stellen ein Mini-Projekt zusammen - eine Text-Quest!
Theorie ist gut, aber wir halten hier keinen Vortrag. Lass uns ein echtes Miniprojekt schreiben - ein Text-RPG-Quest. Du musst das Verlies erkunden, gegen Monster kämpfen und (möglicherweise) überleben.
Erstelle die Datei dungeon.lua:
-- === ТЕКСТОВЫЙ КВЕСТ: ПОДЗЕМЕЛЬЕ ===
math.randomseed(os.time())
-- Состояние игрока
local player = {
name = "",
hp = 100,
attack = 15,
potions = 3
}
-- Список монстров
local monsters = {
{name = "Goblin", hp = 30, attack = 8, xp = 10},
{name = "Skeleton", hp = 50, attack = 12, xp = 20},
{name = "Dark Mage", hp = 40, attack = 18, xp = 25},
{name = "Ogr", hp = 80, attack = 10, xp = 30},
}
-- Вспомогательные функции
local function separator()
print(string.rep("-", 40))
end
local function show_status()
separator()
print("HP: " .. player.hp .. " | Potions: " .. player.potions)
separator()
end
local function ask(question, options)
print("\n" .. question)
for i, opt in ipairs(options) do
print(" " .. i .. ") " .. opt)
end
io.write("Your choice: ")
local choice = tonumber(io.read())
if not choice or choice < 1 or choice > #options then
print("Incomprehensible choice, try again.")
return ask(question, options)
end
return choice
end
-- Система боя
local function battle(monster)
print("\n⚔️ Appears in front of you " .. monster.name .. "! (HP: " .. monster.hp .. ")")
local enemy_hp = monster.hp
while enemy_hp > 0 and player.hp > 0 do
show_status()
local action = ask("What are you doing?", {"Attack", "Drink the potion", "Try to escape"})
if action == 1 then
local damage = math.random(player.attack - 5, player.attack + 5)
enemy_hp = enemy_hp - damage
print("You inflict " .. damage .. " damage!")
if enemy_hp > 0 then
local enemy_damage = math.random(monster.attack - 3, monster.attack + 3)
player.hp = player.hp - enemy_damage
print(monster.name .. " beats you on " .. enemy_damage .. " damage!")
end
elseif action == 2 then
if player.potions > 0 then
local heal = math.random(20, 35)
player.hp = player.hp + heal
player.potions = player.potions - 1
print("You are restoring " .. heal .. " HP!")
else
print("You don't have any potions! You lose a turn...")
end
local enemy_damage = math.random(monster.attack - 3, monster.attack + 3)
player.hp = player.hp - enemy_damage
print(monster.name .. " beats you on " .. enemy_damage .. " damage!")
elseif action == 3 then
if math.random(1, 100) <= 40 then
print("You managed to escape!")
return false
else
print("Couldn't escape!")
local enemy_damage = math.random(monster.attack - 3, monster.attack + 5)
player.hp = player.hp - enemy_damage
print(monster.name .. " beats you on " .. enemy_damage .. " damage!")
end
end
end
if enemy_hp <= 0 then
print("\n🎉 " .. monster.name .. " defeated!")
if math.random(1, 100) <= 30 then
player.potions = player.potions + 1
print("You find a potion!")
end
return true
end
return false
end
-- Комнаты подземелья
local function explore_room(room_number)
separator()
print("\n🚪 Room " .. room_number)
local events = {"monster", "monster", "treasure", "trap", "empty"}
local event = events[math.random(1, #events)]
if event == "monster" then
local monster = monsters[math.random(1, #monsters)]
return battle(monster)
elseif event == "treasure" then
print("You find a treasure chest!")
local bonus = ask("What are you taking?", {"Health Potion (+1)", "Grinding stone (+3 to attack)"})
if bonus == 1 then
player.potions = player.potions + 1
print("Potions: " .. player.potions)
else
player.attack = player.attack + 3
print("Attack now: " .. player.attack)
end
return true
elseif event == "trap" then
print("Trap! Thorns shoot out of the wall!")
local trap_damage = math.random(5, 15)
player.hp = player.hp - trap_damage
print("You get " .. trap_damage .. " damage.")
return true
else
print("An empty room. Silence and dust.")
if math.random(1, 100) <= 20 then
print("You find a potion in the corner!")
player.potions = player.potions + 1
end
return true
end
end
-- === НАЧАЛО ИГРЫ ===
print("╔══════════════════════════════════════╗")
print("║ DUNGEON: TEXT QUEST ║")
print("║ Written in Lua ║")
print("╚══════════════════════════════════════╝")
io.write("What's your name, adventurer? ")
player.name = io.read()
print("\nWelcome, " .. player.name .. "!")
print("You are facing the entrance to a dungeon with 5 rooms.")
print("Go through them all and become a legend.\n")
local rooms_cleared = 0
for room = 1, 5 do
if player.hp <= 0 then
break
end
explore_room(room)
if player.hp <= 0 then
break
end
rooms_cleared = rooms_cleared + 1
if room < 5 then
show_status()
local choice = ask("Going further?", {"Go ahead!", "Enough for today"})
if choice == 2 then
print("\nYou decide to return. Sometimes retreating is also wise.")
break
end
end
end
separator()
separator()
if player.hp <= 0 then
print("\n💀 " .. player.name .. " fell into the dungeon...")
print("Rooms passed: " .. rooms_cleared .. " of 5")
print("Try again — the dungeon is waiting!")
else
if rooms_cleared == 5 then
print("\n🏆 " .. player.name .. " completed the entire dungeon!")
print("HP: " .. player.hp .. " | Remaining potions: " .. player.potions)
print("You are a true legend!")
else
print("\n🏠 " .. player.name .. " returned from the dungeon.")
print("Rooms passed: " .. rooms_cleared .. " of 5")
end
end
print("\nThank you for playing! 🎮")Starten:
lua dungeon.luaUnd jetzt hast du bereits ein vollwertiges Projekt in Lua geschrieben. Mit einem Kampfsystem, Zufallsgenerator, Inventar und einer verzweigten Handlung. Kein Taschenrechner, sondern ein echtes Spiel.
Was kommt als Nächstes? Wo wachsen
Lua ist ein großartiger Einstiegspunkt, und hier können Sie sich bewegen:
Love2D - Framework für 2D-Spiele auf Lua. Wenn ein Textquest funktioniert, stell dir vor, was mit der Grafik passieren wird.
Neovim-Plugins - ein eigenes Plugin für den Editor, geschrieben in Lua, ist eine ganz besondere Art von Vergnügen.
OpenResty — Integrieren Sie Lua-Skripte direkt in nginx und verarbeiten Sie Millionen von Anfragen.
Roblox - Ernsthaft, bei Roblox verdienen sie echtes Geld, und die gesamte Logik ist in Lua geschrieben.
Möchtest du weiter lernen?
Komm zu Kodik!
Wenn dir dieses Format gefällt — von der Theorie zur Praxis in einem Rutsch — wirst du es lieben Kodik. Diese App ist für das Erlernen der Programmierung gedacht, wobei jede Lektion nicht nur aus einer Menge Text besteht, sondern aus Aufgaben, die Sie selbst lösen. Python, JavaScript, HTML, CSS und andere Technologien - alles mit echter Praxis, ohne Wasser und Langeweile.
Und wir haben auch Telegram-Kanal, wo regelmäßig nützliche Beiträge veröffentlicht werden: Konzeptanalysen, Spickzettel, Mini-Aufgaben und Meme für Entwickler. Dies ist eine großartige Möglichkeit, das Programmieren in einem praktischen Format zu wiederholen — auf dem Weg zur Arbeit, in der Mittagspause oder wenn Sie „noch fünf Minuten“ vor dem Schlafengehen haben. Abonnieren Sie und lassen Sie die Programmierung Teil Ihres Alltags werden.
Lua ist eine Sprache, die beweist: Um mächtig zu sein, muss man nicht unbedingt kompliziert sein. An einem Abend bist du von print("Hello") zu einem textbasierten RPG-Quest mit einem Kampfsystem gekommen. Und dabei hast du keine einzige Abhängigkeit installiert, keine einzige Konfiguration geschrieben und keine einzige package-lock.json beschädigt.
Jetzt haben Sie ein Arbeitsprojekt, ein Verständnis der Grundlagen und eine Richtung für das Wachstum. Und das ist bereits mehr als 90% der Menschen, die „nächste Woche mit dem Programmieren beginnen wollten“.
Wage es. 🚀
