Menu
Coddy logo textTech

Revisão - Sistema de Inventário

Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 67 de 70.

challenge icon

Desafio

Fácil

Vamos criar 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 único projeto coeso.

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

  • Item.lua: A classe-base para todos os itens. Cada item tem um name e um value (em moedas de ouro). Inclua um método :getInfo() que retorne uma string no formato "{name}: {value} gold".
  • Weapon.lua: Um item especializado que herda de Item. As armas têm um atributo adicional damage. Substitua :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. Substitua :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 dos valores de todos os itens.
  • main.lua: Reúna tudo! Crie um inventário e preencha-o com itens com base nas entradas recebidas. Em seguida, liste todos os itens e imprima o valor total do inventário na última linha.

A beleza desse design está no 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 adequadamente com base em seu tipo.

Você receberá seis entradas descrevendo dois itens a serem adicionados:

  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 fixa de cura de 50.

Depois de adicionar os dois itens, chame :listItems() para imprimir as informações de cada item e, em seguida, imprima Total: {value} gold na última linha.

Por exemplo, se as entradas forem weapon, Iron Sword, 150, potion, Health Elixir e 75, a saída deverá 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 deverá ser:

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

Experimente você mesmo

-- main.lua: Reúna tudo

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

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

-- Leia 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: Crie um inventário

-- TODO: Crie o primeiro item com base em type1 ("weapon" or "potion")
-- e adicione-o ao inventário

-- TODO: Crie o segundo item com base em type2 ("weapon" or "potion")
-- e adicione-o ao inventário

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

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

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online