Menu
Coddy logo textTech

Repaso - Sistema de inventario

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 67 de 70.

challenge icon

Desafío

Fácil

¡Vamos a construir 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, uniendo la herencia, el polimorfismo y la composición en un proyecto cohesivo.

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 devuelva 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 que devuelva "{name}: {value} gold, {damage} damage".
  • Potion.lua: Otro objeto especializado que hereda de Item. Las pociones tienen un atributo healAmount. Sobrescribe :getInfo() para que devuelva "{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 imprima :getInfo() para cada objeto (uno por línea), y un método :getTotalValue() que devuelva 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. Luego, enumera 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 para añadir:

  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, luego imprime Total: {value} gold en la línea final.

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: Unir todo

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

-- Leer entradas para el primer objeto
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Leer entradas para el segundo objeto
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: Crear un inventario

-- TODO: Crear el primer objeto basado en type1 ("weapon" o "potion")
-- y añadirlo al inventario

-- TODO: Crear el segundo objeto basado en type2 ("weapon" o "potion")
-- y añadirlo al inventario

-- TODO: Llamar a listItems() para imprimir la información de cada objeto

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

Todas las lecciones de Object Oriented Programming