Ripasso - Sistema di inventario
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 67 di 70.
Sfida
FacileCostruiamo un sistema completo di gestione dell'inventario per un gioco di ruolo! Creerai una gerarchia di tipi di oggetti e una classe manager per organizzarli: unendo ereditarietà, polimorfismo e composizione in un unico progetto coerente.
Organizzerai il codice in cinque file:
Item.lua: la classe base per tutti gli oggetti. Ogni oggetto ha unnamee unvalue(in monete d'oro). Includi un metodo:getInfo()che restituisca una stringa nel formato"{name}: {value} gold".Weapon.lua: un oggetto specializzato che eredita da Item. Le armi hanno un attributo aggiuntivodamage. Sovrascrivi:getInfo()in modo che restituisca"{name}: {value} gold, {damage} damage".Potion.lua: un altro oggetto specializzato che eredita da Item. Le pozioni hanno un attributohealAmount. Sovrascrivi:getInfo()in modo che restituisca"{name}: {value} gold, heals {healAmount} HP".Inventory.lua: una classe manager che memorizza una raccolta di oggetti. Includi un metodo:addItem(item)per aggiungere qualsiasi tipo di oggetto, un metodo:listItems()che stampi:getInfo()per ogni oggetto (uno per riga) e un metodo:getTotalValue()che restituisca la somma dei valori di tutti gli oggetti.main.lua: metti tutto insieme! Crea un inventario e riempilo con gli oggetti in base agli input ricevuti. Poi elenca tutti gli oggetti e stampa il valore totale dell'inventario nell'ultima riga.
La bellezza di questo design è il polimorfismo in azione. Il tuo inventario non deve sapere se sta memorizzando un'arma o una pozione. Basta che chiami :getInfo() e ogni oggetto risponde in modo appropriato in base al proprio tipo.
Riceverai sei input che descrivono due oggetti da aggiungere:
- Tipo del primo oggetto (
"weapon"o"potion") - Nome del primo oggetto
- Valore del primo oggetto (un numero)
- Tipo del secondo oggetto (
"weapon"o"potion") - Nome del secondo oggetto
- Valore del secondo oggetto (un numero)
Per le armi, usa un danno fisso di 25. Per le pozioni, usa una quantità di cura fissa di 50.
Dopo aver aggiunto entrambi gli oggetti, chiama :listItems() per stampare le informazioni di ciascun oggetto, quindi stampa Total: {value} gold nell'ultima riga.
Ad esempio, se gli input sono weapon, Iron Sword, 150, potion, Health Elixir e 75, l'output dovrebbe essere:
Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 goldSe gli input sono potion, Mana Potion, 50, weapon, Steel Axe e 200, l'output dovrebbe essere:
Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 goldProvalo tu
-- main.lua: Metti tutto insieme
local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')
-- Leggi gli input per il primo oggetto
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())
-- Leggi gli input per il secondo oggetto
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())
-- Valori fissi: le armi infliggono 25 danni, le pozioni ripristinano 50 HP
-- TODO: Crea un inventario
-- TODO: Crea il primo oggetto in base a type1 ("weapon" o "potion")
-- e aggiungilo all'inventario
-- TODO: Crea il secondo oggetto in base a type2 ("weapon" o "potion")
-- e aggiungilo all'inventario
-- TODO: Chiama listItems() per stampare le informazioni di ogni oggetto
-- TODO: Stampa "Total: {value} gold" usando getTotalValue()
Tutte le lezioni di Programmazione orientata agli oggetti
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle forme9Composizione e mixin
Relazione Has-ADelegaMixin sempliciApplicare più mixinMixin vs ereditarietàRiepilogo - Assemblaggio di robot12Sfide finali
Ripasso - Sistema di inventarioRipasso - Gestore utentiRipasso - Tracciamento punteggiVerifica finale di OOPEsercitati da solo: Compilatore Lua online