200 lines
11 KiB
HTML
200 lines
11 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Kapitel 06: Tamagotchi Abschlussprojekt</title>
|
|
<link rel="stylesheet" href="../../assets/style.css">
|
|
</head>
|
|
<body>
|
|
|
|
<header>
|
|
<div class="header-container">
|
|
<nav class="nav-links">
|
|
<a href="../../index.html">🏠 Zur Kursübersicht</a>
|
|
<span>›</span>
|
|
<a href="../05_objekte_kombinieren/index.html">Kapitel 05</a>
|
|
<span>›</span>
|
|
<span style="color: white; font-weight: 600;">Kapitel 06</span>
|
|
</nav>
|
|
<div class="header-badge">Abschlussprojekt</div>
|
|
<h1>Dein eigenes Tamagotchi (Virtuelles Haustier) 🥚🐣</h1>
|
|
<p>Kombiniere alle gelernten OOP-Konzepte in einem interaktiven, voll funktionsfähigen Konsolenspiel!</p>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="container">
|
|
|
|
<!-- 📂 Schnellzugriff & Download aller Dateien dieser Einheit -->
|
|
<div style="background: #ffffff; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 14px 20px; margin-bottom: 25px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: var(--shadow-sm);">
|
|
<div style="font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px;">
|
|
<span>📂 Dateien dieser Einheit:</span>
|
|
</div>
|
|
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
|
|
<a href="aufgabe.py" class="btn" style="padding: 6px 14px; font-size: 0.88rem; background: var(--primary);" download>📄 aufgabe.py (Startercode)</a>
|
|
<a href="test_aufgabe.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🧪 test_aufgabe.py (Tests)</a>
|
|
<a href="musterloesung.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>💡 musterloesung.py (Lösung)</a>
|
|
<a href="tamagotchi_spiel.py" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🎮 tamagotchi_spiel.py</a>
|
|
<a href="README.md" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;">📖 README.md</a>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!-- 1. Das große Finale -->
|
|
<section class="card">
|
|
<h2>1. Das große Finale! 🏆</h2>
|
|
|
|
<p>
|
|
Du hast alle Grundlagen gemeistert: Klassen & Konstruktoren, Methoden, <code>__str__</code> und Objekt-Beziehungen. Jetzt bauen wir ein komplettes, virtuelles Haustier (Tamagotchi), das du im Terminal füttern, schlafen legen und mit dem du spielen kannst!
|
|
</p>
|
|
</section>
|
|
|
|
<!-- 2. Vollständiges Mini-Beispiel: Der Roboter -->
|
|
<section class="card">
|
|
<h2>2. 🤖 Vollständiges Beispiel: Ein Roboter mit Lebenszyklus</h2>
|
|
|
|
<p>Bevor du das Tamagotchi baust, schau dir dieses vollständige Beispiel an. Es zeigt, wie Attribute begrenzt werden (Clamping 0-100) und wie ein Status überprüft wird:</p>
|
|
|
|
<div class="code-container">
|
|
<div class="code-header">
|
|
<div class="code-dots">
|
|
<span class="code-dot dot-red"></span>
|
|
<span class="code-dot dot-yellow"></span>
|
|
<span class="code-dot dot-green"></span>
|
|
</div>
|
|
<span>Python (Komplettes Beispiel: roboter.py)</span>
|
|
</div>
|
|
<pre><span class="kw">class</span> <span class="fn">Roboter</span>:
|
|
<span class="kw">def</span> <span class="fn">__init__</span>(<span class="var">self</span>, <span class="var">name</span>):
|
|
<span class="var">self</span>.<span class="attr">name</span> = <span class="var">name</span>
|
|
<span class="var">self</span>.<span class="attr">energie</span> = <span class="num">100</span> <span class="cm"># 100% Start-Energie</span>
|
|
<span class="var">self</span>.<span class="attr">ist_aktiv</span> = <span class="kw">True</span>
|
|
|
|
<span class="cm"># Hilfsmethode, um Werte zwischen 0 und 100 zu halten:</span>
|
|
<span class="kw">def</span> <span class="fn">_begrenzen</span>(<span class="var">self</span>, <span class="var">wert</span>):
|
|
<span class="kw">return</span> <span class="fn">max</span>(<span class="num">0</span>, <span class="fn">min</span>(<span class="num">100</span>, <span class="var">wert</span>))
|
|
|
|
<span class="kw">def</span> <span class="fn">arbeiten</span>(<span class="var">self</span>, <span class="var">dauer_stunden</span>):
|
|
<span class="kw">if</span> <span class="kw">not</span> <span class="var">self</span>.<span class="attr">ist_aktiv</span>:
|
|
<span class="kw">return</span> <span class="str">f"{self.name} ist ausgeschaltet!"</span>
|
|
|
|
<span class="var">verbrauch</span> = <span class="var">dauer_stunden</span> * <span class="num">20</span>
|
|
<span class="var">self</span>.<span class="attr">energie</span> = <span class="var">self</span>.<span class="fn">_begrenzen</span>(<span class="var">self</span>.<span class="attr">energie</span> - <span class="var">verbrauch</span>)
|
|
|
|
<span class="kw">if</span> <span class="var">self</span>.<span class="attr">energie</span> == <span class="num">0</span>:
|
|
<span class="var">self</span>.<span class="attr">ist_aktiv</span> = <span class="kw">False</span>
|
|
<span class="kw">return</span> <span class="str">f"{self.name} hat keine Energie mehr und schaltet sich ab!"</span>
|
|
|
|
<span class="kw">return</span> <span class="str">f"{self.name} hat {dauer_stunden}h gearbeitet. Restenergie: {self.energie}%"</span>
|
|
|
|
<span class="kw">def</span> <span class="fn">aufladen</span>(<span class="var">self</span>):
|
|
<span class="var">self</span>.<span class="attr">energie</span> = <span class="num">100</span>
|
|
<span class="var">self</span>.<span class="attr">ist_aktiv</span> = <span class="kw">True</span>
|
|
<span class="kw">return</span> <span class="str">f"{self.name} ist wieder voll aufgeladen!"</span>
|
|
|
|
<span class="kw">def</span> <span class="fn">__str__</span>(<span class="var">self</span>):
|
|
<span class="var">status</span> = <span class="str">"Aktiv ⚡"</span> <span class="kw">if</span> <span class="var">self</span>.<span class="attr">ist_aktiv</span> <span class="kw">else</span> <span class="str">"Ausgeschaltet 💤"</span>
|
|
<span class="kw">return</span> <span class="str">f"[{self.name}] Energie: {self.energie}% | Status: {status}"</span>
|
|
|
|
|
|
<span class="cm"># Ausprobieren:</span>
|
|
<span class="kw">if</span> <span class="var">__name__</span> == <span class="str">"__main__"</span>:
|
|
<span class="var">bot</span> = <span class="fn">Roboter</span>(<span class="str">"Wall-E"</span>)
|
|
<span class="fn">print</span>(<span class="var">bot</span>)
|
|
<span class="fn">print</span>(<span class="var">bot</span>.<span class="fn">arbeiten</span>(<span class="num">3</span>)) <span class="cm"># Verbraucht 60% -> 40% übrig</span>
|
|
<span class="fn">print</span>(<span class="var">bot</span>.<span class="fn">arbeiten</span>(<span class="num">3</span>)) <span class="cm"># Energie auf 0 -> schaltet ab</span>
|
|
<span class="fn">print</span>(<span class="var">bot</span>)
|
|
<span class="fn">print</span>(<span class="var">bot</span>.<span class="fn">aufladen</span>())</pre>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 3. Aufgaben Card -->
|
|
<section class="card">
|
|
<h2>3. 🎯 Deine Aufgaben in <code><a href="aufgabe.py" style="color: inherit; text-decoration: underline;">aufgabe.py</a></code></h2>
|
|
|
|
<ul class="task-list">
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_1">
|
|
<label for="t6_1" class="task-label">
|
|
<strong>TODO 1:</strong> <code>__init__(self, name, tierart="Drache")</code>: Startwerte <code>hunger=50</code>, <code>muedigkeit=20</code>, <code>glueck=80</code>, <code>alter_tage=0</code>, <code>ist_lebendig=True</code>.
|
|
</label>
|
|
</li>
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_2">
|
|
<label for="t6_2" class="task-label">
|
|
<strong>TODO 2:</strong> <code>fuettern(self, menge=20)</code>: Senkt Hunger, erhöht Glück & Müdigkeit um 5.
|
|
</label>
|
|
</li>
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_3">
|
|
<label for="t6_3" class="task-label">
|
|
<strong>TODO 3:</strong> <code>spielen(self, spass=25)</code>: Steigert Glück, erhöht Hunger (15) & Müdigkeit (20). Wenn <code>muedigkeit > 80</code> -> ablehnen!
|
|
</label>
|
|
</li>
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_4">
|
|
<label for="t6_4" class="task-label">
|
|
<strong>TODO 4:</strong> <code>schlafen(self)</code>: Müdigkeit auf 0, Hunger +15, <code>alter_tage += 1</code>.
|
|
</label>
|
|
</li>
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_5">
|
|
<label for="t6_5" class="task-label">
|
|
<strong>TODO 5:</strong> <code>zeit_vergeht(self)</code>: Hunger +10, Müdigkeit +10, Glück -10. Prüfen, ob Hunger >= 100 oder Glück <= 0.
|
|
</label>
|
|
</li>
|
|
<li class="task-item">
|
|
<input type="checkbox" class="task-checkbox" id="t6_6">
|
|
<label for="t6_6" class="task-label">
|
|
<strong>TODO 6:</strong> <code>__str__(self)</code>: Übersicht mit Name, Tierart, Alter und Werten.
|
|
</label>
|
|
</li>
|
|
</ul>
|
|
|
|
<h3>💡 Lösungshinweise (Aufklappen bei Bedarf)</h3>
|
|
|
|
<details>
|
|
<summary>🔍 Tipp zur Werte-Begrenzung (Clamping)</summary>
|
|
<div class="details-content">
|
|
<p>Damit Werte nicht unter 0 fallen oder über 100 steigen, nutze <code>max(0, min(100, wert))</code>:</p>
|
|
<div class="code-container">
|
|
<pre><span class="var">self</span>.<span class="attr">hunger</span> = <span class="fn">max</span>(<span class="num">0</span>, <span class="fn">min</span>(<span class="num">100</span>, <span class="var">self</span>.<span class="attr">hunger</span> - <span class="var">menge</span>))</pre>
|
|
</div>
|
|
</div>
|
|
</details>
|
|
</section>
|
|
|
|
<!-- 4. Spiel starten Card -->
|
|
<section class="card">
|
|
<h2>4. 🕹️ Das interaktive Spiel starten!</h2>
|
|
|
|
<p>Sobald alle Unittests grün sind, kannst du das Spiel live spielen:</p>
|
|
|
|
<div class="code-container">
|
|
<div class="code-header">
|
|
<span>Terminal</span>
|
|
</div>
|
|
<pre><code>python3 tamagotchi_spiel.py</code></pre>
|
|
</div>
|
|
|
|
<div class="box box-success">
|
|
<div class="box-title">🎉 Du hast es geschafft!</div>
|
|
Herzlichen Glückwunsch zum erfolgreichen Abschluss der Python OOP Übungsreihe!
|
|
</div>
|
|
|
|
<div class="footer-nav">
|
|
<a href="../05_objekte_kombinieren/index.html" class="btn btn-secondary">← Zurück zu Kapitel 05</a>
|
|
<a href="../../lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html" class="btn">Weiter zu Kapitel 07: Referenzen →</a>
|
|
</div>
|
|
</section>
|
|
|
|
</main>
|
|
|
|
|
|
<!-- Lokale Gamification-Scripts (funktionieren auch offline per Doppelklick via file://) -->
|
|
<script src="../../assets/gamification_data.js"></script>
|
|
<script src="../../assets/gamification.js"></script>
|
|
<script src="../../assets/parsons.js"></script>
|
|
<script src="../../assets/interpreter.js"></script>
|
|
</body>
|
|
</html>
|