Menu
Coddy logo textTech

Revisão - Sistema de Inventário

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 67 de 70.

challenge icon

Desafio

Fácil

Vamos construir um sistema completo de gerenciamento de inventário para um jogo de RPG! Você criará uma hierarquia de tipos de itens e uma classe gerenciadora para organizá-los — reunindo herança, polimorfismo e composição em um projeto coeso.

Você organizará seu código em cinco arquivos:

  • Item.lua: A classe base para todos os itens. Cada item possui um name e um value (em moedas de ouro). Inclua um método :getInfo() que retorna uma string no formato "{name}: {value} gold".
  • Weapon.lua: Um item especializado que herda de Item. As armas têm um atributo adicional damage. Sobrescreva :getInfo() para retornar "{name}: {value} gold, {damage} damage".
  • Potion.lua: Outro item especializado que herda de Item. As poções têm um atributo healAmount. Sobrescreva :getInfo() para retornar "{name}: {value} gold, heals {healAmount} HP".
  • Inventory.lua: Uma classe gerenciadora que armazena uma coleção de itens. Inclua um método :addItem(item) para adicionar qualquer tipo de item, um método :listItems() que imprime :getInfo() para cada item (um por linha) e um método :getTotalValue() que retorna a soma de todos os valores dos itens.
  • main.lua: Reúna tudo! Crie um inventário e preencha-o com itens baseados nas entradas que você receber. Em seguida, liste todos os itens e imprima o valor total do inventário na última linha.

A beleza deste design é o polimorfismo em ação — seu Inventory não precisa saber se está armazenando uma Weapon ou uma Potion. Ele apenas chama :getInfo() e cada item responde apropriadamente com base em seu tipo.

Você receberá seis entradas descrevendo dois itens para adicionar:

  1. Tipo do primeiro item ("weapon" ou "potion")
  2. Nome do primeiro item
  3. Valor do primeiro item (um número)
  4. Tipo do segundo item ("weapon" ou "potion")
  5. Nome do segundo item
  6. Valor do segundo item (um número)

Para armas, use um dano fixo de 25. Para poções, use uma quantidade de cura fixa de 50.

Após adicionar ambos os itens, chame :listItems() para imprimir as informações de cada item e, em seguida, imprima Total: {value} gold na linha final.

Por exemplo, se as entradas forem weapon, Iron Sword, 150, potion, Health Elixir e 75, a saída deve ser:

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

Se as entradas forem potion, Mana Potion, 50, weapon, Steel Axe e 200, a saída deve ser:

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

Experimente você mesmo

-- main.lua: Reúne tudo

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

-- Lê as entradas para o primeiro item
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Lê as entradas para o segundo item
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- Valores fixos: armas têm 25 de dano, poções curam 50 HP

-- TODO: Criar um inventário

-- TODO: Criar o primeiro item baseado no type1 ("weapon" ou "potion")
-- e adicioná-lo ao inventário

-- TODO: Criar o segundo item baseado no type2 ("weapon" ou "potion")
-- e adicioná-lo ao inventário

-- TODO: Chamar listItems() para imprimir as informações de cada item

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

Todas as lições de Object Oriented Programming