---
# System prepended metadata

title: Projekt Kartenspiel
tags: [Programmierung, Projekt]

---

# 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