Menu
Coddy logo textTech

Ripasso - Sistema di inventario

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 67 di 70.

challenge icon

Sfida

Facile

Costruiamo 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 un name e un value (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 aggiuntivo damage. 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 attributo healAmount. 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:

  1. Tipo del primo oggetto ("weapon" o "potion")
  2. Nome del primo oggetto
  3. Valore del primo oggetto (un numero)
  4. Tipo del secondo oggetto ("weapon" o "potion")
  5. Nome del secondo oggetto
  6. 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 gold

Se 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 gold

Provalo 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

Esercitati da solo: Compilatore Lua online