Menu
Coddy logo textTech

Wiederholung - Inventarsystem

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 67 von 70.

challenge icon

Aufgabe

Einfach

Erstellen wir ein vollständiges Inventarverwaltungssystem für ein Rollenspiel! Du erstellst eine Hierarchie von Gegenstandstypen und eine Managerklasse, um sie zu organisieren: Vererbung, Polymorphie und Komposition in einem zusammenhängenden Projekt vereint.

Du organisierst deinen Code über fünf Dateien:

  • Item.lua: Die Basisklasse für alle Gegenstände. Jeder Gegenstand hat einen name und einen value (in Goldmünzen). Füge eine :getInfo()-Methode ein, die einen String im Format "{name}: {value} gold" zurückgibt.
  • Weapon.lua: Ein spezialisierter Gegenstand, der von Item erbt. Waffen haben ein zusätzliches damage-Attribut. Überschreibe :getInfo(), sodass "{name}: {value} gold, {damage} damage" zurückgegeben wird.
  • Potion.lua: Ein weiterer spezialisierter Gegenstand, der von Item erbt. Tränke haben ein healAmount-Attribut. Überschreibe :getInfo(), sodass "{name}: {value} gold, heals {healAmount} HP" zurückgegeben wird.
  • Inventory.lua: Eine Managerklasse, die eine Sammlung von Gegenständen speichert. Füge eine :addItem(item)-Methode ein, um Gegenstände beliebiger Art hinzuzufügen, eine :listItems()-Methode, die für jeden Gegenstand :getInfo() ausgibt (einen pro Zeile), sowie eine :getTotalValue()-Methode, die die Summe aller Gegenstandswerte zurückgibt.
  • main.lua: Führe alles zusammen! Erstelle ein Inventar und fülle es anhand der erhaltenen Eingaben mit Gegenständen. Liste anschließend alle Gegenstände auf und gib in der letzten Zeile den Gesamtwert des Inventars aus.

Das Besondere an diesem Entwurf ist die Polymorphie in der Praxis. Dein Inventory muss nicht wissen, ob es eine Weapon oder eine Potion speichert. Es ruft einfach :getInfo() auf, und jeder Gegenstand reagiert entsprechend seinem Typ.

Du erhältst sechs Eingaben, die zwei hinzuzufügende Gegenstände beschreiben:

  1. Typ des ersten Gegenstands ("weapon" oder "potion")
  2. Name des ersten Gegenstands
  3. Wert des ersten Gegenstands (eine Zahl)
  4. Typ des zweiten Gegenstands ("weapon" oder "potion")
  5. Name des zweiten Gegenstands
  6. Wert des zweiten Gegenstands (eine Zahl)

Verwende für Waffen einen festen Schaden von 25. Verwende für Tränke eine feste Heilmenge von 50.

Rufe nach dem Hinzufügen beider Gegenstände :listItems() auf, um die Informationen zu jedem Gegenstand auszugeben, und gib anschließend in der letzten Zeile Total: {value} gold aus.

Wenn die Eingaben beispielsweise weapon, Iron Sword, 150, potion, Health Elixir und 75 lauten, sollte die Ausgabe folgendermaßen aussehen:

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

Wenn die Eingaben potion, Mana Potion, 50, weapon, Steel Axe und 200 lauten, sollte die Ausgabe folgendermaßen aussehen:

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

Probier es selbst

-- main.lua: Alles zusammenbringen

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

-- Eingaben für das erste Item lesen
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Eingaben für das zweite Item lesen
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

-- Feste Werte: Waffen haben 25 Schaden, Tränke heilen 50 HP

-- TODO: Erstelle ein Inventar

-- TODO: Erstelle das erste Item basierend auf type1 ("weapon" or "potion")
-- und füge es dem Inventar hinzu

-- TODO: Erstelle das zweite Item basierend auf type2 ("weapon" or "potion")
-- und füge es dem Inventar hinzu

-- TODO: Rufe listItems() auf, um die Infos jedes Items auszugeben

-- TODO: Gib "Total: {value} gold" mit getTotalValue() aus

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler