Sie sind auf Seite 1von 4

Einführung in die Programmierung

Prof. Dr. Franziska Matthäus


Prof. Dr. Matthias Kaschube
Dr. Karsten Tolle

Ausgabe: 23.11.2023
Übungsblatt ÜE-05 Abgabe: 02.12.2023
13:00 Uhr

Ein kleines Kartenspiel (II)


Hinweis:
• Es dürfen keine Lösungen aus dem Skript, dem Internet oder anderen Quellen abgeschrieben werden.
Diese Quellen dürfen nur mit Quellenangaben verwendet werden und es muss ein hinreichend großer
Eigenanteil in den Lösungen deutlich zu erkennen sein.
• Digitale Abgaben, die nicht im Format .pdf oder .txt für Texte oder .py für Code erfolgen, werden nicht
bewertet. Bei Abgaben mehrerer Dateien müssen diese als .zip zusammengefasst werden.
• Achten Sie darauf die Variable __author__ in allen Quellcode Dateien (.py) korrekt zu setzen (am
Anfang des Quellcodes):
__author__ = "<Matr-Nr>, <Nachname>"
Beispiel: __author__ = "1234567, Tolle"
... Leerstellen vor und nach dem "=" und Leerstelle nach dem Komma beachten, sowie keine spitzen
Klammern verwenden.
• Außerdem muss Ihr Name in jeder abgegebenen .pdf und .txt Datei zu finden sein. Abgaben der
Dokumentation, die per Hand geschrieben und eingescannt werden, sind nur in zuvor abgesprochenen
Ausnahmefällen erlaubt.
• NEU: Datei- und Ordnernamen sollen keine Umlaute, diakritische oder Sonderzeichen, mit Ausnahme
des Unterstrichs in der Namensmitte, enthalten!

∑ 10 Punkte

Zusatz: Achten Sie auch auf Vorgaben Ihrer Tutorin/Tutors. Hierfür auch in das Gruppenforum im Moodle-Kurs
von EPR schauen!

Aufgabe – Erstellung eines Kartenspiels II


Schreiben Sie ein Python 3.X Programm, das den gesamten Spielablauf eines Spiels verwirklicht und dabei die
Funktionen (eventuell angepasst) von letzter Woche verwendet. Entwickeln Sie dabei eine übersichtliche
Benutzerschnittstelle, indem Sie dem Spieler die für ihn relevanten Infos anzeigen.

Es gibt die folgenden Teilaufgaben, wobei die Funktionen, die in a-d) erzeugt werden, in ein eigenständiges
Modul ausgelagert werden sollen. Dieses Modul soll die Tests der Funktionen in einer main()-Funktion
enthalten, welche nur beim Start des Moduls (und nicht beim Import) ausgeführt werden.

Gespielt wird mit 3 – 4 Spielern.

Vorbereitung
Es gibt drei verschiedene Farben (Karo, Herz, und Kreuz). Die jeweils höchste Karte einer Farbe ist die 4, die
niedrigste eine 1. Zu Beginn des Spiels werden alle Karten vollständig an die Spieler verteilt.

Ziel des Spiels und Spielablauf


Spieler probieren Stiche zu vermeiden in denen Karten der Farbe ‚Kreuz‘ auftauchen. Jede Karte mit einem
Kreuz gibt einen Strafpunkt. Am Ende des Spiels, d.h. nachdem alle Karten gespielt wurden, werden die

EPR WiSe 2023/2024 1


Strafpunkte notiert. Der Spieler mit den wenigsten Strafpunkten gewinnt. Es können auch mehrere Spieler
gewinnen.

Stiche
Jeder Spieler spielt reihum genau eine Karte aus der Hand aus. Diese Karten bilden den Stich. In einem Spiel
werden so viele Stiche gespielt, wie Spieler Handkarten besitzen. Der beginnende Spieler kann jede Karte aus
der Hand abspielen. Die Farbe der ersten ausgespielten Karte in einem Stich ist Trumpf und muss ‚bedient‘
werden. Das heißt, hat ein Spieler die Farbe der erstgelegten Karte auf der Hand, muss er diese spielen. Kann
ein Spieler die Trumpffarbe nicht spielen, darf dieser Spieler eine andere Farbe spielen. Am Anfang jedes Stichs
wird die Trumpffarbe neu bestimmt. Die Karte mit dem höchsten Wert der Trumpffarbe gewinnt und der
Spieler, der diese Karte ausgespielt hat, bekommt alle Karten des Stichs. Karten, die eine andere Farbe als die
Trumpffarbe haben, können einen Stich nie gewinnen. Nach jedem Stich werden die Stichkarten ausgewertet
und die Strafpunkte der Spieler aufaddiert. Jede Kreuz-Karte ergibt einen Strafpunkt.

a) Spieler mit Spielernamen erfassen 1 Punkt


Erstellen Sie eine Benutzeroberfläche, in welcher die Spielernamen erfasst werden. Diese sollen in einer Liste
gespeichert werden. Erstellen Sie dafür die Funktion:

load_players() -> [str]

Die Funktion nimmt keinen Wert entgegen, liest aber über die Kommandozeile die eingegebenen Namen der
Spieler ein. Testen Sie, dass die richtige Anzahl der Spieler (drei bis vier) angegeben wird.

b) Spiel initiieren 1 Punkt


Erstellen Sie nun die benötigten Variablen, welche im Laufe des Spiels genutzt werden und verteilen Sie die
Karten. Erstellen Sie dafür eine Funktion:

initialize_variables(players:[str]) -> {str: int}, {str: list}

Die Funktion soll die oben erstellte Liste der Spieler entgegennehmen und sowohl einen ‚score‘ Dictionary als
auch einen Dictionary mit den Handkarten jedes Spielers zurückgeben. Der Score-Dictionary soll den
Punktestand für jeden Spieler als Integer enthalten. Außerdem soll der Kartenstapel erstellt werden und
gemischt werden. Alle Karten sollen an die Spieler verteilt werden. Passen Sie dafür Ihre letzte Woche erstellte
Funktion an, sodass diese nun einen Dictionary mit den Spielernamen und einer jeweiligen Liste der zugeteilten
Karten zurückgibt.

c) Spielen 6 Punkte
Schreiben Sie nun eine Funktion, welche es erlaubt zu spielen. Dafür werden so viele Stiche gespielt, wie Spieler
Handkarten haben. Eine Stichrunde läuft wie folgt ab:
• Gespielt wird in zufälliger Reihenfolge, welche für jeden Stich neu bestimmt wird. Ein zufällig
ausgewählter Spieler darf das Spiel beginnen und die erste Karte ausspielen. Die Farbe der
ausgespielten Karte ist nun Trumpf und muss bedient werden.
• Danach dürfen alle anderen Spieler in zufälliger Reihenfolge eine Karte ausspielen. Testen Sie dabei,
dass jeder Spieler eine valide Karte abspielt. D.h. kann der Spieler die Trumpffarbe bedienen, muss
dies auch getan werden. Speichern Sie die gelegten Karten in einer Liste.
• Wenn alle Spieler an der Reihe waren, wird der Stich ausgewertet und dem Spieler zugeteilt, welcher
den höchsten Trumpf ausgespielt hat. Die Strafpunkte des Gewinners des Stichs werden ggf.
angepasst.
• Danach beginnt wieder ein zufällig ausgewählter Spieler den nächsten Stich, sofern noch nicht alle
Handkarten gespielt wurden.
Programmieren Sie dafür eine Benutzeroberfläche, welche es den Spielern erlaubt das Spiel zu spielen. Die
Funktionalitäten sollen in der Funktion play_game ausgeführt werden.
play_game(players: list, scores: {str: int}, all_hands: {str: list}) -> {str: int}

EPR WiSe 2023/2024 2


Diese Funktion nimmt die Liste mit Spielern, den initialisierten Spielstand sowie die Ausgeteilten Handkarten
entgegen und gibt den finalen Spielstand zurück. Folgende Punkte sollen Bestandteil der play_game Funktion
sein:

1. Karten checken 1 von 6 Punkten


Schreiben Sie eine Funktion check_card, welche eine Karte, die Handkarten eines Spielers und die
Trumpffarbe entgegennimmt und zurückgibt, ob die angegebene Karte gespielt werden darf. Eine
Karte darf nur dann gespielt werden, wenn sie die Trumpffarbe hat, oder wenn der Spieler keine
Karten in der Trumpffarbe auf der Hand hat.
check_card(card: (int, str), player_hand: list, trump: str) -> bool

2. Karten ausspielen 1 von 6 Punkten


Schreiben Sie eine Funktion play_card, welche es dem momentanen Spieler erlaubt, eine Karte aus der
Hand zu spielen. Diese Funktion soll die momentanen Handkarten und die Trumpffarbe
entgegennehmen. Der Spieler soll per Eingabe in die Befehlszeile die Karte auswählen können, welche
gespielt werden soll. Der Spieler soll so lange nach einer Karte gefragt werden, bis diese gespielt
werden darf. Nutzen Sie hierfür die oben erstellte Funktion check_card. Passen Sie dann die
entsprechenden Handkarten des Spielers an. Geben Sie die Karte, als auch die angepassten
Handkarten zurück.
play_card(player_hand: list, trump: str) -> ((int, str), list)

3. Stich zuteilen 1 von 6 Punkten


Schreiben Sie nun eine Funktion get_winner, welche den Gewinner eines Stichs bestimmt. Die
Funktion soll eine Liste, welche alle gespielten Karten in diesem Stich enthält, als auch die Trumpffarbe
entgegennehmen. Zudem gibt die Funktion den Index des Spielers zurück, der den Stich gewonnen
hat.
get_winner(current_trick: list, trump: str) -> int

4. Punktestand anpassen 1 von 6 Punkten


Schreiben Sie nun Funktion update_score, welche den Punktestand nach einem Stich anpasst. Die
Funktion soll die gespielten Karten in diesem Stich, den Namen des Siegers des Stichs als auch den
momentanen Punktestand entgegennehmen. Die Funktion soll den Punktestand anpassen und
zurückgeben.
update_score(won_cards: list, player: str, scores:{str: int}) -> {str: int}

5. Play game 1 von 6 Punkten


Fügen Sie nun alles in einer Funktion play_game zusammen. Die Abläufe in der Funktion sollen wie
folgt aussehen:
• Es werden so viele Stiche gespielt, wie jeder Spieler Handkarten hat.
• Pro Stich soll die Reihenfolge der Spieler zufällig bestimmt werden.
• Jeder Spieler ist entsprechend dieser Reihenfolge nacheinander am Zug.
• Der erste Spieler in einem Stich kann jede Handkarte spielen und bestimmt mit dieser Karte
die Trumpffarbe. Pro Stich wird die Trumpffarbe neu bestimmt.
• Der Spieler, der am Zug ist, soll eine Karte spielen. Nach dem Zug sollen die Handkarten des
Spielers als auch die Liste des momentanen Stichs angepasst werden.
• Nachdem jeder Spieler an der Reihe war, wird der Stich ausgewertet und dem Gewinner
zugeteilt.
• Am Ende soll der finale Spielstand zurückgegeben werden.

6. Ausgaben 1 von 6 Punkten


Erweitern Sie Ihre play_game Funktion mit einigen Ausgaben. Schreiben Sie dafür entweder
eigenständige Funktionen oder Statements, welche über das Spiel hinweg die Zwischenergebnisse

EPR WiSe 2023/2024 3


anzeigen. Dabei können Sie selbst bestimmen, wie viele Informationen sie vermitteln. Allerdings
sollten über das Spiel hinweg mindestens folgende Ausgaben erfolgen:
• Momentaner Spieler mit Namen
• Die momentane Trumpffarbe
• Die bisher gespielten Karten
• Die momentanen Handkarten des Spielers, der an der Reihe ist
• Die gespielte Karte in einem Zug eines Spielers
• Der Gewinner eines Stichs

d) Gewinner bestimmen 1 Punkt


Schreiben Sie eine Funktion, welche den Gewinner des Spiels ermittelt und dafür den Dictionary mit den über
das Spiel gesammelten Strafpunkte entgegennimmt.
determine_winner(scores: {str: int}) -> list
Beachten Sie, dass es mehr als einen Gewinner geben kann. Zeigen Sie die Gewinner des Spiels an.

e) Fügen Sie alles zusammen 1 Punkt


Fügen Sie nun alle Schritte zu einer Funktion zusammen, welche das gesamte Spiel beschreibt.

Zusatzanforderungen:
• Für die Aufgabenteile a) bis e) sollen die Funktionen und Testfälle erstellt werden. Erstellen Sie die
entsprechende Dokumentation, welche das Programm abdeckt.
• Für fehlende Angaben in der Aufgabestellungen dürfen Annahmen aufgestellt werden, die in der
Dokumentation beschrieben werden.

EPR WiSe 2023/2024 4

Das könnte Ihnen auch gefallen