Menu
Coddy logo textTech

Repaso - Sistema de inventario

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 67 de 70.

challenge icon

Desafío

Fácil

¡Construyamos un sistema completo de gestión de inventario para un juego de rol! Crearás una jerarquía de tipos de objetos y una clase administradora para organizarlos, reuniendo herencia, polimorfismo y composición en un único proyecto cohesionado.

Organizarás tu código en cinco archivos:

  • Item.lua: La clase base para todos los objetos. Cada objeto tiene un name y un value (en monedas de oro). Incluye un método :getInfo() que devuelve una cadena con el formato "{name}: {value} gold".
  • Weapon.lua: Un objeto especializado que hereda de Item. Las armas tienen un atributo adicional damage. Sobrescribe :getInfo() para devolver "{name}: {value} gold, {damage} damage".
  • Potion.lua: Otro objeto especializado que hereda de Item. Las pociones tienen un atributo healAmount. Sobrescribe :getInfo() para devolver "{name}: {value} gold, heals {healAmount} HP".
  • Inventory.lua: Una clase administradora que almacena una colección de objetos. Incluye un método :addItem(item) para añadir cualquier tipo de objeto, un método :listItems() que imprime :getInfo() para cada objeto (uno por línea) y un método :getTotalValue() que devuelve la suma de los valores de todos los objetos.
  • main.lua: ¡Une todo! Crea un inventario y llénalo con objetos basados en las entradas que recibas. Después, muestra la lista de todos los objetos e imprime el valor total del inventario en la última línea.

La belleza de este diseño es el polimorfismo en acción. Tu Inventory no necesita saber si está almacenando un Weapon o una Potion. Simplemente llama a :getInfo() y cada objeto responde adecuadamente según su tipo.

Recibirás seis entradas que describen dos objetos que se añadirán:

  1. Tipo del primer objeto ("weapon" o "potion")
  2. Nombre del primer objeto
  3. Valor del primer objeto (un número)
  4. Tipo del segundo objeto ("weapon" o "potion")
  5. Nombre del segundo objeto
  6. Valor del segundo objeto (un número)

Para las armas, usa un daño fijo de 25. Para las pociones, usa una cantidad de curación fija de 50.

Después de añadir ambos objetos, llama a :listItems() para imprimir la información de cada objeto y, después, imprime Total: {value} gold en la última línea.

Por ejemplo, si las entradas son weapon, Iron Sword, 150, potion, Health Elixir y 75, la salida debería ser:

Iron Sword: 150 gold, 25 damage
Health Elixir: 75 gold, heals 50 HP
Total: 225 gold

Si las entradas son potion, Mana Potion, 50, weapon, Steel Axe y 200, la salida debería ser:

Mana Potion: 50 gold, heals 50 HP
Steel Axe: 200 gold, 25 damage
Total: 250 gold

Pruébalo tú mismo

-- main.lua: Reúne todo

local Weapon = require('Weapon')
local Potion = require('Potion')
local Inventory = require('Inventory')

-- Lee las entradas para el primer ítem
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Lee las entradas para el segundo ítem
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- Valores fijos: las armas tienen 25 de daño, las pociones curan 50 HP

-- TODO: Crea un inventario

-- TODO: Crea el primer ítem basándote en type1 ("weapon" or "potion")
-- y añádelo al inventario

-- TODO: Crea el segundo ítem basándote en type2 ("weapon" or "potion")
-- y añádelo al inventario

-- TODO: Llama a listItems() para imprimir la info de cada ítem

-- TODO: Imprime "Total: {value} gold" usando getTotalValue()

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online