{}const=>[]async()letfn</>var
LuaDéveloppement

Lua en une soirée : de zéro à une quête RPG textuelle en quelques étapes

Comprendre le langage Lua à partir de zéro - sans être ennuyeux et avec des mèmes. Nous allons installer Lua, analyser les variables, les tableaux, les fonctions et les boucles, et à la fin, nous allons écrire une quête RPG textuelle complète avec un système de combat, des pièges et un inventaire. Tout cela en une seule fois.

К

Kodik

Auteur

10 min de lecture

Vous connaissez ce sentiment quand vous découvrez un nouveau langage de programmation et que pendant les 20 premières minutes vous vous dites : « Eh bien, c'est facile » ? Et puis ça commence. Les parenthèses ne sont pas les bonnes, j'ai oublié les points-virgules, le compilateur vous crie dessus comme un voisin du dessus à 3 heures du matin.

Avec Lua, tout est différent. Sérieusement. Ce langage est si concis que vous pouvez apprendre ses bases en buvant une tasse de café. Et en une soirée, vous pouvez assembler un mini-projet qui fonctionne parfaitement. Vous ne me croyez pas ? Eh bien, vérifions.

Qu'est-ce que Lua et pourquoi en ai-je besoin ?

Lua (prononcé « Lou-a », et non « Loua » — mais, honnêtement, chacun prononce comme il veut) est un langage de script léger qui est né au Brésil en 1993. Oui, il est plus ancien que la plupart des frameworks JavaScript. Et, contrairement à eux, il n'est toujours pas obsolète.

Où est utilisé Lua :

  • Jeux — Roblox, World of Warcraft, Garry's Mod, Love2D. Si vous avez déjà écrit un addon pour WoW, vous êtes déjà un développeur Lua, félicitations.

  • Nginx et OpenResty — les serveurs Web à forte charge exécutent des scripts Lua pour traiter les requêtes.

  • Neovim — si vous êtes de ceux qui passent plus de temps à configurer leur éditeur qu'à écrire du code, Lua est votre nouveau meilleur ami.

  • Systèmes embarqués et IoT — Lua est si léger qu'il fonctionne même là où Python s'étouffe.

En bref, Lua est comme un couteau suisse, mais sans tire-bouchon. Compact, utile et étonnamment puissant.

🔥 100 000+ étudiants déjà avec nous

Marre de lire la théorie ?
Il est temps de coder !

Kodik — une appli où tu apprends à coder par la pratique. Mentor IA, leçons interactives, projets réels.

🤖 IA 24/7
🎓 Certificats
💰 Gratuit
🚀 Commencer
Ont rejoint aujourd'hui

Étape 0 : Installation (plus rapide que npm install)

Linux/macOS:

# Ubuntu / Debian
sudo apt install lua5.4

# macOS
brew install lua

Windows:

Télécharger LuaBinaries avec site officiel ou mettez-le via scoop :

scoop install lua

Vérification :

lua -v
# Lua 5.4.x  Copyright (C) ...

C'est prêt. Ni Docker, ni environnement virtuel, ni package.json sur 300 lignes. Ça fonctionne tout simplement.

Étape 1 : Hello World et les premières bases

Créez le fichier hello.lua :

print("Hello, World!")
print("Lua is easier than you thought")

Lancez :

lua hello.lua

C'est tout. Sans public static void main, sans import sys, sans use strict. Il suffit d'écrire et de lancer.

Variables — pas de types, pas de problèmes

local name = "Alexey"
local age = 25
local is_developer = true

print(name .. " — developer: " .. tostring(is_developer))

Attention : .. est une concaténation de lignes. Pas de +, pas de chaînes de caractères de modèle. Deux points modestes. Lua est minimaliste.

Les conditions sont un bon vieux classique

local level = 42

if level >= 100 then
    print("You're a legend!")
elseif level >= 50 then
    print("Almost there!")
else
    print("Keep swinging")
end

Notez : then et end au lieu des accolades. C'est inhabituel au début, mais après une heure, vous ne le remarquez plus.

Cycles : trois types pour toutes les occasions

-- Цикл 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

Étape 2 : Les tableaux sont la seule structure de données (et cela suffit)

Dans Lua, il n'y a pas de tableaux, de dictionnaires, d'objets, d'ensembles, de tuples, de decks... Il y a des tableaux. Et ils remplacent tout. C'est comme si un objet JavaScript et un tableau étaient fusionnés en une seule entité :

-- Как массив
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
}

Indexation à partir de 1 — oui, c'est un choc après toutes les langues avec indexation zéro. Mais tu vas t'y habituer. Probablement. Un jour.

Étape 3 : Fonctions — citoyens de première classe

-- Обычная функция
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)

Le retour de valeurs multiples est l'une de ces choses en Lua qui vous fait soupirer : « Pourquoi ce n'est pas comme ça partout ? »

Étape 4 : Nous assemblons un mini-projet — une quête textuelle !

La théorie, c'est bien, mais nous ne sommes pas en train de donner un cours. Écrivons un vrai mini-projet : une quête RPG textuelle. Vous devez explorer le donjon, combattre des monstres et (peut-être) survivre.

Créer un fichier 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! 🎮")

Lancer :

lua dungeon.lua

Et maintenant, vous avez déjà écrit un projet complet sur Lua. Avec un système de combat, un random, un inventaire et une histoire ramifiée. Pas n'importe quelle calculatrice, mais un vrai jeu.

Et ensuite ? Où aller

Lua est un excellent point d'entrée, et voici où vous pouvez aller :

  • Love2D — un framework pour les jeux 2D sur Lua. Si la quête textuelle est arrivée, imaginez ce qui se passera avec les graphiques.

  • Plugins Neovim — votre plugin pour l'éditeur, écrit en Lua, c'est un plaisir à part.

  • OpenResty — Intégrez des scripts Lua directement dans nginx et traitez des millions de requêtes.

  • Roblox - sérieusement, sur Roblox, ils gagnent de l'argent réel, et toute la logique est écrite en Lua.

Vous voulez continuer à apprendre ?
Venez à Kodik !

Si vous aimez ce format, de la théorie à la pratique en une seule fois, vous allez certainement l'aimer Code. Cette application est destinée à l'apprentissage de la programmation, chaque leçon n'est pas seulement un mur de texte, mais des tâches que vous résolvez avec vos mains. Python, JavaScript, HTML, CSS et d'autres technologies - le tout avec une pratique réelle, sans eau et sans ennui.

Et nous avons aussi Chaîne Telegram, où des publications utiles sont régulièrement publiées : analyses de concepts, aide-mémoire, mini-tâches et mèmes pour les développeurs. C'est un excellent moyen de réviser la programmation dans un format pratique : sur le chemin du travail, pendant la pause déjeuner ou pendant « cinq minutes de plus » avant d'aller se coucher. Abonnez-vous et laissez la programmation faire partie de votre quotidien.

Lua est un langage qui prouve que pour être puissant, il n'est pas nécessaire d'être compliqué. En une soirée, vous êtes passé de print("Hello") à une quête RPG textuelle avec un système de combat. Et en même temps, vous n'avez pas installé une seule dépendance, n'avez pas écrit une seule configuration et n'avez pas cassé un seul package-lock.json.

Maintenant, vous avez un projet de travail, une compréhension des bases et une direction pour la croissance. Et c'est déjà plus que 90 % des personnes qui « allaient commencer à apprendre la programmation la semaine prochaine ».

Osez. 🚀

🎯Arrête de reporter

Tu as aimé l'article ?
Place à la pratique !

Avec Kodik, tu ne lis pas seulement — tu codes immédiatement. Théorie + pratique = vraies compétences.

Pratique instantanée
🧠L'IA explique le code
🏆Certificat

Sans inscription • Sans carte