# 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**)
2. Anfang:
Vom **Stapel** mit verdeckten Restkarten eine Karte offen auf den ablegen **Ablage**
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.

## 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, ...)

## 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;">
🃑🃒 🃝🃞 |
🂡🂢 🂭🂮
</p>
<p style="font-size: 350%; color:red; margin: 0px;">
🂱🂲 🂽🂾 |
🃁🃂 🃍🃎
</p>
<p style="font-size: 350%; color:blue; margin: 0px;">
🂿🂠
</p>
Quelle als Übersicht über alle Karten [^1]
[^1]: https://de.wikipedia.org/wiki/Unicodeblock_Spielkarten