Übungsaufgabe: Inventarsystem für ein Spiel

Ziel der Übung

In dieser Aufgabe entwickelst du ein kleines Inventarsystem für ein einfaches Computerspiel.

Du sollst dabei selbst überlegen, wo es sinnvoll ist, gemeinsamen Code zusammenzufassen und wo ein flexibler Datentyp gebraucht wird, der mit verschiedenen Objektarten arbeiten kann.


Ausgangssituation

In einem Spiel können verschiedene Dinge gesammelt werden:

  • Waffen
  • Tränke
  • Rüstungsteile

Alle diese Dinge haben einige gemeinsame Eigenschaften, aber sie unterscheiden sich auch in bestimmten Details.

Außerdem soll es Behälter geben, in denen nur bestimmte Arten von Gegenständen gespeichert werden können. Zum Beispiel:

  • Eine Waffenkiste darf nur Waffen enthalten.
  • Eine Tranktasche darf nur Tränke enthalten.
  • Eine Rüstungskiste darf nur Rüstungsteile enthalten.

Aufgabe

Erstelle ein C#-Konsolenprogramm, das ein einfaches Inventarsystem umsetzt.

Das Programm soll mehrere Arten von Spielgegenständen verwalten und verschiedene Behälter verwenden, die jeweils nur passende Gegenstände aufnehmen können.


Anforderungen

1. Spielgegenstände

Jeder Spielgegenstand soll mindestens folgende Informationen besitzen:

  • Name
  • Gewicht
  • Wert in Gold

Zusätzlich soll jeder Gegenstand eine Methode besitzen, mit der eine kurze Beschreibung auf der Konsole ausgegeben werden kann.

Beispielausgabe:

Iron Sword weighs 4.5 kg and is worth 25 gold.

2. Verschiedene Gegenstandsarten

Erstelle mindestens diese drei Arten von Gegenständen:

Weapon

Eine Waffe soll zusätzlich speichern:

  • Damage

Beispiel:

Iron Sword weighs 4.5 kg and is worth 25 gold. Damage: 12

Potion

Ein Trank soll zusätzlich speichern:

  • Effect

Beispiel:

Health Potion weighs 0.5 kg and is worth 10 gold. Effect: Restores health

Armor

Ein Rüstungsteil soll zusätzlich speichern:

  • Defense

Beispiel:

Steel Helmet weighs 2.0 kg and is worth 18 gold. Defense: 5

3. Behälter für Gegenstände

Erstelle einen Behälter, der mehrere Gegenstände speichern kann.

Der Behälter soll:

  • einen Namen haben
  • Gegenstände hinzufügen können
  • alle gespeicherten Gegenstände ausgeben können
  • den Gesamtwert aller enthaltenen Gegenstände berechnen können
  • das Gesamtgewicht aller enthaltenen Gegenstände berechnen können

Wichtig: Ein Behälter soll nur eine bestimmte Art von Gegenständen enthalten dürfen.

Beispiele:

ItemContainer<Weapon> weaponChest = new ItemContainer<Weapon>("Weapon Chest");
ItemContainer<Potion> potionBag = new ItemContainer<Potion>("Potion Bag");
ItemContainer<Armor> armorChest = new ItemContainer<Armor>("Armor Chest");

Ein Versuch wie dieser soll nicht möglich sein:

weaponChest.AddItem(new Potion("Health Potion", 0.5, 10, "Restores health"));

4. Test im Hauptprogramm

Erstelle im Hauptprogramm mindestens:

  • zwei Waffen
  • zwei Tränke
  • zwei Rüstungsteile

Lege anschließend passende Behälter an und füge die Gegenstände hinzu.

Gib danach für jeden Behälter aus:

  • den Namen des Behälters
  • alle enthaltenen Gegenstände
  • das Gesamtgewicht
  • den Gesamtwert

Beispielausgabe:

=== Weapon Chest ===
Iron Sword weighs 4.5 kg and is worth 25 gold. Damage: 12
Wooden Bow weighs 2.0 kg and is worth 15 gold. Damage: 8
Total weight: 6.5 kg
Total value: 40 gold

Wichtige Einschränkungen

  • Schreibe nicht dreimal denselben Code für Name, Gewicht und Wert.
  • Verwende keinen Behälter, der einfach object speichert.
  • Verwende keine separate Klasse wie WeaponChest, PotionBag und ArmorChest, wenn sich diese Klassen fast gleich verhalten würden.
  • Achte darauf, dass falsche Gegenstände möglichst schon beim Programmieren auffallen und nicht erst während das Programm läuft.

Hinweise

Diese Fragen können dir beim Entwurf helfen:

  • Welche Eigenschaften haben alle Gegenstände gemeinsam?
  • Welche Eigenschaften unterscheiden sich je nach Gegenstandsart?
  • Wie kann man verhindern, dass eine Waffenkiste plötzlich einen Trank enthält?
  • Wie kann ein Behälter mit Waffen, Tränken oder Rüstungsteilen arbeiten, ohne dreimal denselben Code zu schreiben?

Optionale Erweiterungen

Wenn du früher fertig bist, kannst du eine oder mehrere Erweiterungen einbauen:

Erweiterung 1: Maximales Gewicht

Ein Behälter bekommt ein maximales Gewicht. Ein Gegenstand darf nur hinzugefügt werden, wenn das Gesamtgewicht danach nicht zu hoch ist.

Erweiterung 2: Wertvollster Gegenstand

Der Behälter soll den wertvollsten enthaltenen Gegenstand zurückgeben können.

Erweiterung 3: Suche nach Name

Der Behälter soll einen Gegenstand anhand seines Namens suchen können.