Wiederholung - Inventarsystem
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 67 von 70.
Aufgabe
EinfachLass 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 einennameund einenvalue(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ätzlichesdamage-Attribut. Überschreibe:getInfo(), um"{name}: {value} gold, {damage} damage"zurückzugeben.Potion.lua: Ein weiteres spezialisiertes Item, das von Item erbt. Tränke haben einhealAmount-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:
- Erster Item-Typ (
"weapon"oder"potion") - Erster Item-Name
- Erster Item-Wert (eine Zahl)
- Zweiter Item-Typ (
"weapon"oder"potion") - Zweiter Item-Name
- 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 goldWenn 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 goldProbier 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
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check