# Übungsaufgabe 1: Zauberschule

## Einführung

Stell dir vor, du arbeitest an einem System zur Klassifizierung und Verwaltung von magischen Wesen in einer Zauberschule. Dein Ziel ist es, verschiedene Arten von magischen Wesen zu modellieren, ihre magische Stärke zu berechnen und Kämpfe zwischen ihnen zu simulieren.

## Aufgaben

##### 1. Definition der magischen Wesen
Definiere einen Datentyp ```MagicalCreature```, der verschiedene magische Wesen beschreibt. In der Zauberschule gibt es Drachen (*Dragon*), Einhörner (*Unicorn*), und Zauberer (*Wizard*).
Jede Kreatur hat:
* einen Namen *name* (String)
* ein Magielevel *level* (Int)
* Erfahrungspunkte *experience* (Int)

Kannst du Type- und Value-Konstruktor identifizieren?

##### 2. Beschreibung der magischen Wesen
Erstelle eine Funktion ```describeMagicalCreature```, die eine *MagicalCreature* entgegen nimmt und eine stringbasierte Beschreibung des Wesens zurückgibt. 

Beispielausgabe: *"Dumbledore ist ein Zauberer mit Magielevel 13 und 70 Erfahrungspunkten."*
Hinweis: Stelle sicher, dass die Werte des Datentyps in Zeichenketten umgewandelt werden können.


##### 3. Kräfte
Zwei Kreaturen können gegeneinander kämpfen. Manchmal sind auch Gäste aus anderen Welten zu Besuch an der Schule, die selbst keine *MagicalCreatures* sind, sich aber trotzdem gerne an den Kämpfen beteiligen möchten (Roboter, Schwertkämpfer, etc.). 
Deshalb soll eine Typklasse ```Fighter``` erstellt werden. Alle Instanzen der Typklasse müssen eine Methode ```power``` implementieren, die die Kraft der Fighter als *Int* zurückgibt. *MagicalCreatures* sollen eine Instanz dieser Typklasse sein. Die Power wird basierend auf dem Magielevel, Erfahrungswerten und dem Wesenstyp berechnet:
* *Dragon*: (Magielevel + Erfahrung) * 3
* *Unicorn*: (Magielevel + Erfahrung) * 4
* *Wizard*: (Magielevel + Erfahrung) * 5

##### 4. Magisches Duell
Erstelle eine Funktion ```duel```, die zwei *Fighter* gegeneinander antreten lässt. Die Kämpferin oder der Kämpfer mit der höheren Power gewinnt und soll zurückgegeben werden. Falls das Duell unentschieden ausgeht, soll ein String *"Unentschieden"* zurückgegeben werden.

Hinweis: Die Typklasse *Either* könnte für die Rückgabe hilfreich sein.

## Ausführen und Testen
Kompiliere den Code, führe das Programm aus und überprüfe die Ausgaben.