Récapitulatif - Système d'inventaire
Fait partie de la section Programmation orientée objet 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 ! Tu vas créer une hiérarchie de types d'objets et une classe gestionnaire pour les organiser : réunissant l'héritage, le polymorphisme et la composition dans un seul projet cohérent.
Tu organiseras ton 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). Inclus une méthode:getInfo()qui renvoie une chaîne au format"{name}: {value} gold".Weapon.lua: un objet spécialisé qui hérite de Item. Les armes possèdent un attributdamagesupplémentaire. Redéfinis:getInfo()pour renvoyer"{name}: {value} gold, {damage} damage".Potion.lua: un autre objet spécialisé qui hérite de Item. Les potions possèdent un attributhealAmount. Redéfinis:getInfo()pour renvoyer"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: une classe gestionnaire qui stocke une collection d'objets. Inclus 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 renvoie la somme des valeurs de tous les objets.main.lua: rassemble tout ! Crée un inventaire et remplis-le avec des objets en fonction des entrées reçues. Ensuite, liste tous les objets et affiche la valeur totale de l'inventaire sur la dernière ligne.
La beauté de cette conception réside dans le polymorphisme en action. Ton Inventory n'a pas besoin de savoir s'il stocke un Weapon ou une Potion. Il appelle simplement :getInfo(), et chaque objet répond de manière appropriée selon son type.
Tu recevras 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 deuxième objet (
"weapon"ou"potion") - Nom du deuxième objet
- Valeur du deuxième objet (un nombre)
Pour les armes, utilise des dégâts fixes de 25. Pour les potions, utilise une valeur de soin fixe de 50.
Après avoir ajouté les deux objets, appelle :listItems() pour afficher les informations de chaque objet, puis affiche 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 le tout
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 second objet
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Valeurs fixes : les armes ont 25 de dégâts, les potions soignent 50 HP
-- TODO: Créer un inventaire
-- TODO: Créer le premier objet en fonction de type1 ("weapon" or "potion")
-- et l'ajouter à l'inventaire
-- TODO: Créer le second objet en fonction de type2 ("weapon" or "potion")
-- et l'ajouter à l'inventaire
-- TODO: Appeler listItems() pour afficher les infos de chaque objet
-- TODO: Afficher "Total: {value} gold" en utilisant getTotalValue()
Toutes les leçons de Programmation orientée objet
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 POOEntraînez-vous par vous-même : Compilateur Lua en ligne