Repaso - Sistema de inventario
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 67 de 70.
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 unnamey unvalue(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 adicionaldamage. Sobrescribe:getInfo()para que devuelva"{name}: {value} gold, {damage} damage".Potion.lua: Otro objeto especializado que hereda de Item. Las pociones tienen un atributohealAmount. 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:
- 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, 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 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: 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
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 OOP