Revisão - Sistema de Inventário
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 67 de 70.
Desafio
FácilVamos 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 umnamee umvalue(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 adicionaldamage. Sobrescreva:getInfo()para retornar"{name}: {value} gold, {damage} damage".Potion.lua: Outro item especializado que herda de Item. As poções têm um atributohealAmount. 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:
- Tipo do primeiro item (
"weapon"ou"potion") - Nome do primeiro item
- Valor do primeiro item (um número)
- Tipo do segundo item (
"weapon"ou"potion") - Nome do segundo item
- 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 goldSe 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 goldExperimente 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
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas9Composição e Mixins
Relacionamento Tem-UmDelegaçãoMixins SimplesAplicando Múltiplos MixinsMixins vs HerançaRecapitulação - Montagem de Robô12Desafios Finais
Revisão - Sistema de InventárioRevisão - Gerenciador de UsuáriosRevisão - Rastreador de PontuaçãoVerificação Final de POO