Synthese-Projekt: Objektorientierte Programmierung

Das OOP-Battle-Arena-Game

Fortschritt:
PHASE 1

Discovery & Checkpoint

Video & Einstieg
Verständnis-Check Beantworte die Frage zum Video

Betrachte folgenden Codeaufbau:

class Kaempfer:
    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

    def erleide_schaden(self, punkte):
        self.hp -= punkte

held = Kaempfer("Morrigan", 130)
held.erleide_schaden(20)

Welchen Wert besitzt held.hp nach der Ausführung?

PHASE 2

Parsons Puzzle

Struktur & Logik
Aufgabe Bringe die Bausteine per Drag & Drop in Reihenfolge

Die Basisklasse Charakter ist im Hintergrund bereits vordefiniert:
Sie speichert name, hp und atk und besitzt eine Methode nimm_schaden(schaden).

Setze die spezialisierte Klasse Krieger zusammen, die im Konstruktor einen zusätzlichen wut-Wert initialisiert,
die Methode angreifen(ziel) überschreibt (Schaden = atk + wut) und anschließend ein Duell ausführt.

Tipp: Benutze die Anfasser zum Verschieben und ⇥- / ⇥+ zum Einrücken.

Dein Programm (Lösung) Hier die Zeilen in die richtige Reihenfolge bringen
Aussortierte Bausteine (Distraktoren) Hierhin fehlerhafte / nicht benötigte Zeilen ziehen
PHASE 3

Scaffolding & Bugfix

Geführte Praxis
Aufgabe Finde und behebe die Fehler im Code

In dieser Arena-Logik haben sich zwei Fehler eingeschlichen:
1. Der Konstruktor der Unterklasse Magier ruft die Elternklasse Charakter nicht korrekt auf.
2. Die Methode feuerball zieht zwar Mana ab, ruft aber nicht ziel.nimm_schaden() auf.

Korrigiere den Code, sodass der Magier erfolgreich zaubert und dem Ziel Schaden zufügt!

Tipp: Passe den Code im Editor an und klicke auf „Ausführen & Prüfen“.

script.py
Python 3.11
Konsole (Output)

                    

Musterlösung:
class Charakter:
    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

    def nimm_schaden(self, schaden):
        self.hp -= schaden

class Magier(Charakter):
    def __init__(self, name, hp, mana):
        super().__init__(name, hp)
        self.mana = mana

    def feuerball(self, ziel, schaden):
        self.mana -= 15
        ziel.nimm_schaden(schaden)
        print(f"{self.name} wirkt Feuerball!")

magier = Magier("Rowan", 130, 50)
gegner = Charakter("Boss", 130)
magier.feuerball(gegner, 20)

print("Gegner HP:", gegner.hp)
print("Magier Mana:", magier.mana)
PHASE 4

Coding Challenge

Eigenständiges Coden
Ziel-Aufgabe Löse die Aufgabe und bestehe alle Tests

Erstelle die Kern-Architektur für das Arena-Kampfspiel:

1. Basisklasse Charakter:
- Konstruktor __init__(self, name, hp, atk) speichert die Attribute.
- Methode nimm_schaden(self, punkte): Zieht punkte von self.hp ab (Minimum 0: nutze z. B. max(0, ...)).
- Methode ist_am_leben(self): Gibt True zurück, wenn hp > 0, sonst False.
2. Unterklasse Schurke(Charakter):
- Erbt von Charakter.
- Konstruktor __init__(self, name, hp, atk, krit_bonus): Ruft super().__init__(name, hp, atk) auf und speichert self.krit_bonus = krit_bonus.
- Methode hinterhalt(self, ziel): Berechnet Schaden als self.atk + self.krit_bonus, fügt diesen ziel über ziel.nimm_schaden(...) zu und gibt "Hinterhalt ausgefuehrt!" auf der Konsole aus.
3. Instanziierung & Duell:
- Erstelle held als Schurke mit Name 'Morrigan', HP 130, ATK 20 und Krit-Bonus 10.
- Erstelle boss als Basis-Charakter mit Name 'Gegner', HP 130 und ATK 10.
- Lasse held die Methode hinterhalt(boss) ausführen.
- Gib f"Boss HP: {boss.hp}" und f"Boss Lebt: {boss.ist_am_leben()}" aus.

Tipp: Schreibe deinen Code in den Editor und klicke auf „Code testen“.

solution.py
Python 3.11
Konsole (Output)

                    

Test-Suite

Musterlösung:
class Charakter:
    def __init__(self, name, hp, atk):
        self.name = name
        self.hp = hp
        self.atk = atk

    def nimm_schaden(self, punkte):
        self.hp = max(0, self.hp - punkte)

    def ist_am_leben(self):
        return self.hp > 0

class Schurke(Charakter):
    def __init__(self, name, hp, atk, krit_bonus):
        super().__init__(name, hp, atk)
        self.krit_bonus = krit_bonus

    def hinterhalt(self, ziel):
        schaden = self.atk + self.krit_bonus
        ziel.nimm_schaden(schaden)
        print("Hinterhalt ausgefuehrt!")

held = Schurke("Morrigan", 130, 20, 10)
boss = Charakter("Gegner", 130, 10)

held.hinterhalt(boss)

print(f"Boss HP: {boss.hp}")
print(f"Boss Lebt: {boss.ist_am_leben()}")
PHASE 5

Die vollständige Turnier-Arena

Kreatives Sandbox-Labor
Freies Experimentieren Erweitere deinen Code nach deinen eigenen Ideen

Baue die ultimative rundenbasierte Kampf-Arena!
Erstelle weitere Klassen wie Paladin (mit Schild-Attribut) oder Heiler (mit Heilzauber).
Lasse zwei Teams in einer while-Schleife gegeneinander antreten, bis ein Team komplett besiegt ist.

Tipp: Passe den Code an, führe ihn aus oder lade dein fertiges Programm als Python-Datei herunter.

programm.py
Python 3.11
Konsole (Output)

                    

Lektion vollständig abgeschlossen!

Du hast alle Phasen gemeistert und kannst hier im Sandbox-Labor frei weiterprogrammieren.

Zur Übersicht
Lektion beendet
>_

Benutzereingabe (input)

Dein Python-Programm wartet auf eine Eingabe

Tippe deine Eingabe ein und drücke Enter ↵ oder klicke auf Absenden.