Aufgaben-Python/03_methoden_und_verhalten/README.md

79 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kapitel 03: Methoden & Verhalten – Wenn Objekte lebendig werden ⚔️
Bisher haben unsere Objekte hauptsächlich Daten gespeichert (wie Name oder Kontostand). Aber Objekte können noch viel mehr: **Sie können Aktionen ausführen!**
Funktionen, die innerhalb einer Klasse definiert sind, nennt man **Methoden**.
---
## 🏃‍♀️ Was unterscheidet eine Methode von einer normalen Funktion?
1. Eine Methode steht **eingerückt in der Klasse**.
2. Das **erste Argument ist immer `self`**.
3. Über `self` hat die Methode direkten Zugriff auf alle Eigenschaften des Objekts und kann diese verändern.
```python
class Zauberer:
def __init__(self, name, mana=50):
self.name = name
self.mana = mana
# Das hier ist eine Methode:
def zauberspruch_wirken(self, mana_kosten):
if self.mana >= mana_kosten:
self.mana -= mana_kosten
print(f"{self.name} wirkt einen Zauber! Verbleibendes Mana: {self.mana}")
return True
else:
print(f"{self.name} hat nicht genug Mana!")
return False
merlin = Zauberer("Merlin", 30)
merlin.zauberspruch_wirken(10) # self wird automatisch merlin!
```
---
## 🤝 Wenn Objekte miteinander interagieren!
Das Spannendste an der objektorientierten Programmierung ist, wenn **ein Objekt mit einem anderen Objekt interagiert**.
Du kannst ein ganzes Objekt als Parameter an die Methode eines anderen Objekts übergeben:
```python
class Spieler:
def __init__(self, name, geld):
self.name = name
self.geld = geld
def bezahle_an(self, empfaenger, betrag):
if self.geld >= betrag:
self.geld -= betrag
empfaenger.geld += betrag # Wir greifen direkt auf das andere Objekt zu!
return True
return False
```
---
## ⚠️ Typische Stolperfallen in diesem Kapitel
1. **Grenzen beachten (Min/Max Clamping):**
- Lebenspunkte dürfen nach Schaden nie negativ werden: `if self.leben < 0: self.leben = 0`
- Lebenspunkte dürfen nach Heilung nie über `max_leben` steigen: `self.leben = min(self.max_leben, self.leben + heilung)`
2. **Besiegte Objekte können nicht mehr handeln:**
- Vor Aktionen wie Angreifen oder Heilen immer prüfen: `if not self.ist_am_leben: return False` bzw. `return 0`
---
## 🎯 Deine Aufgabe: Das RPG-Duell
In `aufgabe.py` erstellst du eine Klasse `Held` für ein Rollenspiel:
- Ein Held hat `name`, `leben`, `max_leben` und `angriffskraft`.
- Ein Held kann Schaden erleiden (`schaden_erleiden`), geheilt werden (`heilen`) und einen anderen Helden angreifen (`angreifen(gegner)`).
- Du sorgst mit Bedingungen dafür, dass die Lebenspunkte nicht unter `0` fallen und nicht über `max_leben` steigen!
### Testen:
```bash
python3 test_aufgabe.py
```