Eigenschaften & Methoden

Aufgabe 1: Transaktionskonto

Datei: 1-transaction-account.ts

Definiere eine Klasse TransactionAccount, welche ein Bankkonto repräsentiert. Die Klasse soll die folgenden privaten Eigenschaften haben:

  • balance: Der Kontostand als Zahl, die mit 0.0 initialisiert wird und nur innerhalb der Klasse verwendet werden kann.
  • iban: Eine Zeichenkette, die eine IBAN (internationale Kontonummer) repräsentiert, und die nach der Initialisierung via Konstruktorparameter nicht mehr verändert werden kann.
  • holder: Der Name des Kontoinhabers als Zeichenkette.

Implementiere die folgenden Methoden:

  • withdraw(amount: number): void: Der angegebene Betrag soll vom Konto abgezogen werden, sofern der Kontostand dabei nicht ins Negative fällt.
  • deposit(amount: number): void: Der angegebene Betrag soll auf das Konto gutgeschrieben werden.
  • show(): string: Eine Methode, die alle Eigenschaften übersichtlich formatiert zurückgibt.

Das amount-Argument muss eine positive Zahl sein. Für negative Zahlen soll nichts passieren.

Erstelle mindestens drei Konti, um die Klasse damit zu testen.

Aufgabe 2: Sparkonto

Datei: 2-savings-account.ts

Kopiere die Datei aus der ersten Aufgabe. Benenne die Klasse in SavingsAccount um, aber belasse ihre Eigenschaften und Methoden. Ergänze die Klasse um folgende Eigenschaft:

  • interestRate: Ein Zinssatz in Prozent, der nur via Konstruktor und mit einem entsprechenden Setter gesetzt, aber nicht ausgelesen werden kann. Der Zinssatz muss in einem Bereich zwischen 0.0 und 25.0 (jeweils inklusive) liegen.

Implementiere eine Methode namens payInterest, welche die Zinsen auf dem Konto gutschreibt. Die Gutschrift entspricht dem Produkt aus dem Zinssatz (dividiert durch 100) und dem Kontostand.

Teste die Zinsgutschrift mit verschiedenen Konti.

Aufgabe 3: Banküberweisung

Datei: 3-transaction.ts

Kopiere die Datei aus der ersten Aufgabe. Benenne die Klasse in BankAccount um.

Erstelle eine zusätzliche Klasse namens Transaction. Diese soll folgende Eigenschaften haben und via Konstruktor initialisieren:

  • account: Das Zielkonto vom Typ BankAccount.
  • amount: Der zu überweisende (positive) Betrag.

Erweitere die Klasse BankAccount um die folgende Methode:

  • execute(t: Transaction): void: Falls der Transaktionsbetrag durch den Kontostand gedeckt ist, soll dieser dem Zielkonto (t.account) gutgeschrieben und vom Konto, auf dem die Methode aufgerufen worden ist, abgezogen werden. Wird die Transaktion verweigert, weil der Kontostand zu tief ist, soll dies ausgegeben werden. Ist die Transaktion erfolgreich, soll eine Vollzugsnachricht mit den Details der Transaktion ausgegeben werden.

Erstelle drei Konti und überweise Beträge hin und her. Gib die Kontostände nach den Transaktionen jeweils auf der Konsole aus.

Aufgabe 4: Waffe

Datei: 4-weapon.ts

Erstelle eine Klasse namens Weapon mit folgenden Eigenschaften, die jeweils über den Konstruktor initialisiert werden:

  • description: Der Name bzw. die Bezeichnung der Waffe.
  • damage: Eine Zahl von 1 bis 100, die den Maximalschaden der Waffe definiert.
  • accuracy: Eine Zahl von 1 bis 100, welche die Genauigkeit der Waffe definiert.

Die Eigenschaften sollen nur lesbar, d.h. nicht schreibbar sein. Erweitere die Klasse um einen Getter:

  • effect: number: Betrachte damage und accuracy als Prozentsatz und multipliziere die beiden Zahlen, sodass ein Produkt zwischen 0 und 1 entsteht. Dir Rückgabe soll dann wieder als Prozentsatz erfolgen.

Exportiere die Klasse, indem du sie folgendermassen deklarierst:

export class Weapon {
  // ...
}

Dadurch kann die Klasse in anderen Dateien verwendet werden.

Aufgabe 5: Krieger

Datei: 5-warrior.ts

Importiere die Klasse Weapon folgendermassen:

import { Weapon } from "./4-weapon.ts";

Schreibe nun eine (ebenfalls exportierte) Klasse namens Warrior mit folgenden Eigenschaften:

  • name: Der Name des Kriegers.
  • weapon: Die Waffe des Kriegers.
  • health: Die Gesundheit des Kriegers als Wert zwischen 1 und 100.
  • strength: Die Kraft des Kriegers als ein Wert zwischen 1 und 100.
  • dexterity: Die Geschicklichkeit des Kriegers als ein Wert zwischen 1 und 100.

Ergänze die Klasse um folgende Methoden:

  • attack(opponent: Warrior): Der Krieger soll den Gegner mit der Waffe angreifen. Der Gegner soll einen Schaden erleiden, wenn der Angriff erfolgreich ist.
  • suffer(damage: number): boolean: Der Krieger soll einen Schaden erleiden. Diese Methode wird von attack des Gegners aufgerufen (opponent.suffer(damage)). Stirbt der Spieler, wird true zurückgegeben, sonst false.

Die Methode attack soll folgendermassen implementiert werden:

  • Berechne eine Zufallszahl mit Math.random(). Diese (statische) Methode gibt einen Zufallswert zwischen 0 und 1 zurück. Multipliziere diese Zahl mit dexterity/100. Ist das Ergebnis grösser als 0.5, liegt ein Treffer vor. Sonst passiert nichts.
  • Bei einem Treffer wird die Methode effect von der Waffe des Kriegers aufgerufen. Der zurückgegebene Wert wird mit strength multipliziert. Das Ergebnis ist der Schaden.
  • Mit dem berechneten Schaden wird nun die Methode suffer des Gegners aufgerufen. Diesem werden Gesundheitspunkte abgezogen (health -= strength). Fällt der Wert health auf 0 oder tiefer, stirbt der Gegner. Bei einem Treffer sollen auch strength und dexterity um einen Zehntel des erlittenen Schadens reduziert werden.

Aufgabe 6: Kampf

Datei: 6-fight.ts

Importiere die Klassen Weapon und Warrior aus den entsprechenden Dateien. Erstelle eine Klasse namens Fight mit folgenden Eigenschaften:

  • playerOne: Warrior: Der erste Spieler.
  • playerTwo: Warrior: Der zweite Spieler.

Implementiere eine Methode fight(): Warrior, welche die beiden Krieger auf einander losgehen lässt. Die beiden Kontrahenten sollen sich solange gegenseitig angreifen, bis einer davon stirbt. Es soll der überlebende Krieger zurückgegeben werden. Jeder Angriff soll mithilfe von console.log-Ausgaben dokumentiert werden, sodass der Spieler das Geschehen nachvollziehen kann.

Simuliere einige Kämpfe mit verschiedenen Kriegern und Waffen, z.B. wie Harry Potter Sauron mit einem Lichtschwert angreift und von ihm mit Thors Hammer auf die Mütze bekommt.

Zusatzaufgabe: Erweiterung der Kampfsimulation

Implementiere zusätzliche Features für die Kampfsimulation. Hier einige Ideen:

  • ein Turniersystem nach dem KO-Modus
  • ein Ligasystem mit Hin- und Rückrunde
  • ein Verteidigungssystem mit Schildern
  • ein Vampirsystem zum Absaugen von Gesundheitspunkten
  • ein zwei-gegen-zwei Kampfsystem