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.
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 unnamey unvalue(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 adicionaldamage. Sobrescribe:getInfo()para devolver"{name}: {value} gold, {damage} damage".Potion.lua: Otro objeto especializado que hereda de Item. Las pociones tienen un atributohealAmount. 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:
- Tipo del primer objeto (
"weapon"o"potion") - Nombre del primer objeto
- Valor del primer objeto (un número)
- Tipo del segundo objeto (
"weapon"o"potion") - Nombre del segundo objeto
- 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 goldSi 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 goldPrué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
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas9Composición y Mixins
Relación "Tiene-Un"DelegaciónMixins simplesAplicación de múltiples MixinsMixins vs. HerenciaResumen - Ensamblaje de robots12Desafíos finales
Repaso - Sistema de inventarioRepaso - Gestor de usuariosRepaso - Seguimiento de puntuaciónVerificación final de OOPPractica por tu cuenta: Compilador de Lua online