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.
Étape 0 : Installation (plus rapide que npm install)
Linux/macOS:
# Ubuntu / Debian
sudo apt install lua5.4
# macOS
brew install luaWindows:
Télécharger LuaBinaries avec site officiel ou mettez-le via scoop :
scoop install luaVé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.luaC'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")
endNotez : 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.luaEt 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. 🚀
