Files
blackjack/docs/roadmap.md
2025-10-26 11:14:38 +01:00

88 lines
4.1 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.
# Blackjack Implementierungs-Roadmap
Dies ist eine schrittweise Anleitung zur Implementierung des Blackjack-Spiels basierend auf dem bereitgestellten Klassendiagramm. Der Fokus liegt auf der **inkrementellen Entwicklung** und dem Testen jeder Klasse, bevor mit der nächsten begonnen wird.
---
## Phase 1: Die Grundlagen Karten und Stapel
Das Ziel dieser Phase ist die Erstellung des statischen Materials: der Karten und des Decks.
### 1. Card (Karte)
| Fokus | Hinweise |
| :--- | :--- |
| **Attribute** | `rank` (z.B. 'A', 'K', '5'), `suit` (z.B. 'Herz', 'Pik'), `value` (initialer Blackjack-Wert). |
| **Logik** | Definiere die Wertzuordnung: 2-10 sind ihr Nennwert, Bube/Dame/König sind **10**, Ass ist initial **11**. |
| **Methode** | Implementiere `__str__` für eine klare Ausgabe (z.B. "Ass der Pik"). |
### 2. Deck (Kartenstapel)
| Fokus | Hinweise |
| :--- | :--- |
| **Initialisierung** | Erzeuge im Konstruktor **alle 52** `Card`-Objekte (vier Farben $\times$ 13 Ränge) und speichere sie in der internen Liste `cards`. |
| **`shuffle()`** | Verwende eine geeignete Bibliotheksfunktion (z.B. `random.shuffle` in Python) zum Mischen der `cards`-Liste. |
| **`deal_card()`** | Entferne die oberste Karte aus der Liste (z.B. `pop()`) und gib sie zurück. Behandele den Fall, dass das Deck leer ist (optional). |
---
## Phase 2: Hände und Wertberechnung
Diese Phase implementiert die Kernlogik von Blackjack: die Verwaltung einer Hand und die flexible Wertberechnung.
### 3. Hand (Spielerhand)
| Fokus | Hinweise |
| :--- | :--- |
| **`add_card(card)`** | Füge die Karte zur Liste hinzu. Aktualisiere **sofort** den Handwert und zähle die Anzahl der Asse (`aces`). |
| **`calculate_value()`** | Gib die einfache Summe der Werte aller Karten zurück. |
| **`adjust_for_ace()`** | Die **wichtigste Logik** von Blackjack: Rufe diese Methode nach jeder Kartenaufnahme auf. **Schleife:** Solange der Gesamtwert (`value`) **über 21** ist **UND** Asse vorhanden sind (`aces > 0`), **reduziere** den Wert um 10 und verringere `aces` um 1. |
### 4. Player / Dealer (Basisstruktur)
| Fokus | Hinweise |
| :--- | :--- |
| **`Player`** | Definiere die Basisattribute (`name`, `chips`, `hand`). |
| **`hit(deck)`** | Ruft `deck.deal_card()` auf und übergibt die Karte an `self.hand.add_card()`. |
| **`Dealer`** | Erbt von `Player`. Benötigt zunächst nur die Vererbung. |
---
## Phase 3: Spielsteuerung und Rundenablauf
Hier wird das Spielbrett aufgestellt und die grundlegende Interaktion ermöglicht.
### 5. Game-Setup
| Fokus | Hinweise |
| :--- | :--- |
| **Konstruktor** | Initialisiere die zentralen Komponenten: `Deck` (mischen nicht vergessen!), `Player` und `Dealer`. |
| **`show_cards()`** | Zeige die Karten des Spielers komplett an. Für den Dealer zeige nur die **erste** Karte an, bis die Spielzüge beendet sind. |
### 6. Geber-Logik und Spielzüge
| Fokus | Hinweise |
| :--- | :--- |
| **`Dealer.play(deck)`** | Implementiere die feste Geber-Regel: Der Dealer muss `hit()` aufrufen, solange sein Handwert **kleiner als 17** ist. |
| **Spieler-Zug** | Implementiere eine Schleife in `play_round()`, die den Spieler nach "Hit" oder "Stand" fragt, bis er steht oder überkauft ("Bust", $>21$). |
---
## Phase 4: Abschluss, Vergleich und Finanzen
Der letzte Schritt kümmert sich um die Auszahlung und den wiederholten Spielbetrieb.
### 7. Ergebnis und Chip-Management
| Fokus | Hinweise |
| :--- | :--- |
| **`compare_hands()`** | Diese Methode wird aufgerufen, nachdem sowohl der Spieler als auch der Dealer ihre Züge abgeschlossen haben. |
| **Vergleich** | Berücksichtige alle Fälle in dieser Reihenfolge: **Blackjack** (21 auf 2 Karten), **Bust** (wer hat > 21?), **höherer Wert** gewinnt, **Push** (Gleichstand). |
| **Chips** | Passe die `chips` des Spielers basierend auf dem Ergebnis von `compare_hands()` an (z.B. $\times 1.5$ für Blackjack, $\times 1$ für normalen Gewinn, $0$ für Push, $-\text{Einsatz}$ für Verlust). |
### 8. Spiel-Loop
| Fokus | Hinweise |
| :--- | :--- |
| **Hauptfunktion** | Erstelle die Hauptroutine, die wiederholt **Einsatz erfragt**, `deck.shuffle()` aufruft und `play_round()` startet, bis der Spieler keine Chips mehr hat oder beenden möchte. |