Menu
Coddy logo textTech

Wiederholung - Inventarsystem

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 67 von 70.

challenge icon

Aufgabe

Einfach

Lass uns ein komplettes Inventarverwaltungssystem für ein Rollenspiel bauen! Du wirst eine Hierarchie von Item-Typen und eine Manager-Klasse erstellen, um sie zu organisieren – dabei werden Vererbung, Polymorphie und Komposition in einem zusammenhängenden Projekt vereint.

Du wirst deinen Code über fünf Dateien organisieren:

  • Item.lua: Die Basisklasse für alle Items. Jedes Item hat einen name und einen value (in Goldmünzen). Füge eine :getInfo()-Methode hinzu, die einen String im Format "{name}: {value} gold" zurückgibt.
  • Weapon.lua: Ein spezialisiertes Item, das von Item erbt. Waffen haben ein zusätzliches damage-Attribut. Überschreibe :getInfo(), um "{name}: {value} gold, {damage} damage" zurückzugeben.
  • Potion.lua: Ein weiteres spezialisiertes Item, das von Item erbt. Tränke haben ein healAmount-Attribut. Überschreibe :getInfo(), um "{name}: {value} gold, heals {healAmount} HP" zurückzugeben.
  • Inventory.lua: Eine Manager-Klasse, die eine Sammlung von Items speichert. Füge eine :addItem(item)-Methode hinzu, um jede Art von Item hinzuzufügen, eine :listItems()-Methode, die :getInfo() für jedes Item ausgibt (eine pro Zeile), und eine :getTotalValue()-Methode, die die Summe aller Item-Werte zurückgibt.
  • main.lua: Bring alles zusammen! Erstelle ein Inventar und fülle es mit Items basierend auf den Eingaben, die du erhältst. Liste dann alle Items auf und gib den Gesamtwert des Inventars in der letzten Zeile aus.

Das Schöne an diesem Design ist die Polymorphie in Aktion – dein Inventory muss nicht wissen, ob es eine Weapon oder eine Potion speichert. Es ruft einfach :getInfo() auf und jedes Item antwortet entsprechend seinem Typ.

Du wirst sechs Eingaben erhalten, die zwei hinzuzufügende Items beschreiben:

  1. Erster Item-Typ ("weapon" oder "potion")
  2. Erster Item-Name
  3. Erster Item-Wert (eine Zahl)
  4. Zweiter Item-Typ ("weapon" oder "potion")
  5. Zweiter Item-Name
  6. Zweiter Item-Wert (eine Zahl)

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

Nachdem du beide Items hinzugefügt hast, rufe :listItems() auf, um die Informationen jedes Items auszugeben, und gib dann Total: {value} gold in der letzten Zeile aus.

Wenn die Eingaben zum Beispiel weapon, Iron Sword, 150, potion, Health Elixir und 75 sind, sollte die Ausgabe wie folgt 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 sind, sollte die Ausgabe wie folgt aussehen:

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

Probier es selbst

-- main.lua: Alles zusammenführen

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

-- Eingaben für den ersten Gegenstand lesen
local type1 = io.read()
local name1 = io.read()
local value1 = tonumber(io.read())

-- Eingaben für den zweiten Gegenstand lesen
local type2 = io.read()
local name2 = io.read()
local value2 = tonumber(io.read())

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

-- TODO: Ein Inventar erstellen

-- TODO: Ersten Gegenstand basierend auf type1 ("weapon" oder "potion") erstellen
-- und zum Inventar hinzufügen

-- TODO: Zweiten Gegenstand basierend auf type2 ("weapon" oder "potion") erstellen
-- und zum Inventar hinzufügen

-- TODO: listItems() aufrufen, um die Informationen jedes Gegenstands auszugeben

-- TODO: "Total: {value} gold" unter Verwendung von getTotalValue() ausgeben

Alle Lektionen in Object Oriented Programming