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.
Desafio
FácilVamos 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 umnamee umvalue(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 adicionaldamage. Substitua:getInfo()para retornar"{name}: {value} gold, {damage} damage".Potion.lua: Outro item especializado que herda de Item. As poções têm um atributohealAmount. 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:
- 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 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 goldSe 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 goldExperimente 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
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ânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrã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 POOPratique por conta própria: Compilador de Lua online