# Projekt Kartenspiel Anhand des einfachen Kartenspiels [MauMau](https://de.wikipedia.org/wiki/Mau-Mau_(Kartenspiel)) soll ein projektorientierter Einstieg in die objektorientierte Programmierung erfolgen. Später soll das Projekt um weitere Kartenspiele erweitert werden, um die Vorteile von Objektorientierung aufzuzeigen. ## Kartenspiel MauMau :::info Aufgabe **Aufgabe** Schreibe die Spielelemente bzw. Spielregeln von [MauMau](https://de.wikipedia.org/wiki/Mau-Mau_(Kartenspiel)) auf. ::: <!--{%youtube XHLaxxUJN0Y %}--> Ausgangbasis: - mind. 2 **Spieler** - **Kartenspiel** mit 32 **Spielkarten** - Spielkarten haben **4 Farben:** Kreuz, Pik, Herz, Karo - Spielkarten haben **Werte** aus Zählern (7, 8, 9, 10) und Bildern (Bube, Dame, König, Ass) Spielablauf: 1. Austeilen: Jeder Spieler erhält 5-6 Karten vom Stapel, diese werden reihum verteilt (**Handkarte**)![IMG_20250924_143345-min](https://hackmd.io/_uploads/BkxwOvWngl.jpg) 2. Anfang: Vom **Stapel** mit verdeckten Restkarten eine Karte offen auf den ablegen **Ablage**![IMG_20250924_143429-min](https://hackmd.io/_uploads/HyADdw-ngg.jpg) 3. Spiel: Die Spieler legen reihum wenn möglich eine Karte auf die Ablage, wenn Wert oder Farbe passen oder müssen eine Karte vom Stapel ziehen 4. Sonderkarten: - 7 - Nächster Spieler muss zwei Karten ziehen (oder weitere 7 legen) - 8 - Nächster Spieler muss aussetzen - Bube - Farbe wünschen 6. Gewinn: Der erste Spieler, der seine letzte Karte auf der Handkarte auf die Ablage legt, hat gewonnen. ![IMG_20250924_143405-min](https://hackmd.io/_uploads/HJXqOwZhll.jpg) ## Erweiterungen - Ass Spieler kann direkt eine zweite Karte ablegen - Restkarten nach Ende (Gewinn) werden gezählt ## TODO - [x] Text analysieren (Markierung gelb) - [ ] Klassendiagramm erstellen - [ ] DB-Modell erstellen - [ ] Klassen erstellen - [ ] Spieler - [ ] Karte - [ ] Kartenstapel (Deck, Ablage, Hand) - [ ] Spiel (Uno, MauMau, ...) ![playing-cards-7559877_960_720](https://hackmd.io/_uploads/HkHqQIXjlg.png =x200) ## UML Klassendiagramm ```plantuml skinparam style strictuml class Uno { - spieler[]: array of Spieler - deck: Karten + getDeck(): Karten + setDeck(Karten) } class Karte { -farbe: string -zahl: int -spezial: string +getFarbe(): string +setFarbe() +getZahl(): int +setZahl() +getSpezial(): string +setSpezial() +__toString() } class Karten { -karten: array +erstelleDeck() +mischeDeck() +getKarten() +setKarten() +ausagabeKarten() +entnehmeKarte() +aufnahmeKarte() } class Spieler { -nummer: int -name: string -karten: Karten +getNummer(): int +setNummer() +getName(): string +setName() +getKarten(): Karten } ' Beziehungen ' Uno "1" -- "1" Deck Uno "1" -- "1" Ablage Uno "1" -- "2..n" Spieler Karten "1" o-- "n" Karte : besteht aus Karten <|-- Deck Karten <|-- Ablage Karten <|-- Hand Spieler "1" -- "1" Hand ``` ```plantuml @startuml skinparam style strictuml title Klassendiagramm – Skat ' Enumerationen enum Spielfarbe { KREUZ PIK HERZ KARO } enum Kartenwert { SIEBEN ACHT NEUN ZEHN BUBE DAME KOENIG ASS } enum Spieltyp { FARBSPIEL GRAND NULL } ' Karte class Karte { - farbe: Spielfarbe - wert: Kartenwert + getAugen(): int + toString(): String } ' Spieler class Spieler { - name: String - hand: List<Karte> - punkte: int + spieleKarte(k: Karte): void + nimmKarte(k: Karte): void + gibStich(stich: Stich): void } ' Stich class Stich { - karten: Map<Spieler, Karte> - führender: Spieler + gewinner(): Spieler + punkte(): int } ' Spiel class Spiel { - spieler: List<Spieler> - skat: List<Karte> - typ: Spieltyp - trumpfFarbe: Spielfarbe - stiche: List<Stich> - spielerAmZug: Spieler + starten(): void + spieleStich(): Stich + berechneErgebnis(): void } ' Beziehungen Spiel "3" --> Spieler : besteht aus Spiel --> Stich : enthält Spiel --> Karte : beinhaltet Spiel --> Spieltyp Spiel --> Spielfarbe : trumpf Stich --> Karte : enthält Stich --> Spieler : gehört zu Spieler --> Karte : besitzt Spieler --> Stich : erhält Karte --> Spielfarbe Karte --> Kartenwert @enduml ``` ```plantuml @startuml class Card { getIndex getSuit getSign getRank getValue getUnicode } class Cardset { getCards addCard getCard getLastCard getTopCard removeCard shuffle clear isEmpty count } class Cardgame { getDeck getDiscardPile getStatus setStatus addPlayer getPlayers getPlayer getCurrentPlayer setCurrentPlayer getDirection setDirection nextPlayer save load getUnicodeCard } class Player { setName getName setNumber getNumber setHand getHand } class MauMau { checkWinCondition initHands isValidPlay getDeck getDiscardPile getStatus setStatus addPlayer getPlayers getPlayer getCurrentPlayer setCurrentPlayer getDirection setDirection nextPlayer save load getUnicodeCard } class MauMauController { playCard drawCard resetGame } @enduml ``` ## Spielkarten Die folgenden Spielkarten sind per Unicode verfügbar und können ggf. für die Ausgabe genutzt werden (nur französiches Blatt). 1. Zeile: Kreuz und Pik 2. Zeile: Herz und Karo 3. Zeile: Joker und Rückseite <p style="font-size: 350%; color:black; margin: 0px;"> &#127185;&#127186; &#127197;&#127198; | &#127137;&#127138; &#127149;&#127150; </p> <p style="font-size: 350%; color:red; margin: 0px;"> &#127153;&#127154; &#127165;&#127166; | &#127169;&#127170; &#127181;&#127182; </p> <p style="font-size: 350%; color:blue; margin: 0px;"> &#127167;&#127136; </p> Quelle als Übersicht über alle Karten [^1] [^1]: https://de.wikipedia.org/wiki/Unicodeblock_Spielkarten