Récapitulatif - Système d'inventaire
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 67 sur 70.
Défi
FacileConstruisons un système complet de gestion d'inventaire pour un jeu de rôle ! Vous allez créer une hiérarchie de types d'objets et une classe de gestion pour les organiser — en réunissant l'héritage, le polymorphisme et la composition dans un projet cohérent.
Vous organiserez votre code sur cinq fichiers :
Item.lua: La classe de base pour tous les objets. Chaque objet possède unnameet unevalue(en pièces d'or). Incluez une méthode:getInfo()qui retourne une chaîne de caractères au format"{name}: {value} gold".Weapon.lua: Un objet spécialisé qui hérite de Item. Les armes ont un attribut supplémentairedamage. Surchargez:getInfo()pour retourner"{name}: {value} gold, {damage} damage".Potion.lua: Un autre objet spécialisé héritant de Item. Les potions ont un attributhealAmount. Surchargez:getInfo()pour retourner"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: Une classe de gestion qui stocke une collection d'objets. Incluez une méthode:addItem(item)pour ajouter n'importe quel type d'objet, une méthode:listItems()qui affiche:getInfo()pour chaque objet (un par ligne), et une méthode:getTotalValue()qui retourne la somme des valeurs de tous les objets.main.lua: Rassemblez tout ! Créez un inventaire et remplissez-le d'objets basés sur les entrées que vous recevez. Ensuite, listez tous les objets et affichez la valeur totale de l'inventaire sur la dernière ligne.
La beauté de cette conception réside dans le polymorphisme en action — votre Inventory n'a pas besoin de savoir s'il stocke une Weapon ou une Potion. Il appelle simplement :getInfo() et chaque objet répond de manière appropriée selon son type.
Vous recevrez six entrées décrivant deux objets à ajouter :
- Type du premier objet (
"weapon"ou"potion") - Nom du premier objet
- Valeur du premier objet (un nombre)
- Type du second objet (
"weapon"ou"potion") - Nom du second objet
- Valeur du second objet (un nombre)
Pour les armes, utilisez un dommage fixe de 25. Pour les potions, utilisez un montant de soin fixe de 50.
Après avoir ajouté les deux objets, appelez :listItems() pour afficher les informations de chaque objet, puis affichez Total: {value} gold sur la dernière ligne.
Par exemple, si les entrées sont weapon, Iron Sword, 150, potion, Health Elixir, et 75, la sortie devrait être :
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldSi les entrées sont potion, Mana Potion, 50, weapon, Steel Axe, et 200, la sortie devrait être :
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldEssayez vous-même
-- main.lua : Rassembler tous les éléments
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- Lire les entrées pour le premier objet
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- Lire les entrées pour le deuxième objet
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Valeurs fixes : les armes infligent 25 points de dégâts, les potions soignent 50 PV
-- TODO : Créer un inventaire
-- TODO : Créer le premier objet en fonction de type1 ("weapon" ou "potion")
-- et l'ajouter à l'inventaire
-- TODO : Créer le deuxième objet en fonction de type2 ("weapon" ou "potion")
-- et l'ajouter à l'inventaire
-- TODO : Appeler listItems() pour afficher les informations de chaque objet
-- TODO : Afficher "Total: {value} gold" en utilisant getTotalValue()
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes9Composition et Mixins
Relation 'A un'DélégationMixins simplesAppliquer plusieurs MixinsMixins vs HéritageRécapitulatif - Assemblage de robots12Défis finaux
Récapitulatif - Système d'inventaireRécapitulatif - Gestionnaire d'utilisateursRécapitulatif - Suivi des scoresVérification finale POO