{}const=>[]async()letfn</>var
LuaEntwicklung

Lua in einem Abend: Von Null auf eine Text-RPG-Quest in wenigen Schritten

Wir lernen die Sprache Lua von Grund auf kennen - ohne Langeweile und mit Memes. Wir installieren Lua, analysieren Variablen, Tabellen, Funktionen und Schleifen und schreiben am Ende eine vollständige Text-RPG-Quest mit einem Kampfsystem, Fallen und Inventar. Alles in einem Rutsch.

К

Kodik

Autor

10 Min. Lesezeit

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.

🔥 100.000+ Schüler sind bereits bei uns

Genug Theorie gelesen?
Zeit zu coden!

Kodik — eine App, in der du durch Praxis programmieren lernst. KI-Mentor, interaktive Lektionen, echte Projekte.

🤖 KI 24/7
🎓 Zertifikate
💰 Kostenlos
🚀 Jetzt starten
Heute beigetreten

Schritt 0: Installation (schneller als npm install)

Linux/macOS:

# Ubuntu / Debian
sudo apt install lua5.4

# macOS
brew install lua

Windows:

LuaBinaries herunterladen von der offiziellen Website oder durch Scoop setzen:

scoop install lua

Wir 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.lua

Das 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")
end

Beachte: 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)
end

Schritt 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.lua

Und 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. 🚀

🎯Hör auf zu zögern

Artikel gefallen?
Zeit zum Üben!

Bei Kodik liest du nicht nur — du schreibst sofort Code. Theorie + Praxis = echte Skills.

Sofortige Praxis
🧠KI erklärt Code
🏆Zertifikat

Keine Registrierung • Keine Karte