Kartenstapel als spezieller Stapel
Stapel und das LIFO-Prinzip
Stapel kennst du aus dem täglichen Leben: Tellerstapel, Bücherstapel, ....
Stapel werden im Alltag benutzt, wenn man Gegenstände nach dem LIFO-Prinzip verwaltet. LIFO bedeutet dabei "last in, first out" bzw. "wer zuletzt kommt, wird als erstes bearbeit".
Kartenstapel
Kartenstapel sind spezielle Stapel, bei denen Karten nach dem LIFO-Prinzip verwaltet werden.
Kartenstapel weisen zusätzliche Besonderheiten auf. Die Karten eines Kartenstapels möchte man auch mischen können.
Vorgabe einer Basisklasse Stapel
Im Folgenden gehen wir davon aus, dass es bereits eine Klasse Stapel
gibt, mit der man das Verhalten
von "gestapelten Daten" simulieren kann.
Die Klasse Stapel
ist dabei folgendermaßen konzipiert.
Auch eine Implementierung dieser Klasse soll bereits vorliegen: stapel.py
Aufgabe 1
Entwickle ein Testprogramm, in dem alle Stapeloperationen mindestens einmal benutzt werden.
Die Klasse Kartenstapel als Erweiterung der Klasse Stapel
Die Klasse Stapel
sieht bereits einige Methoden zur Realisierung eines Kartenstapels vor.
So kann die Methode pop
benutzt werden, um eine Karte vom Stapel zu ziehen.
Mit der Methode isEmpty
kann man überprüfen, ob noch Karten auf dem Stapel liegen.
Noch nicht realisiert ist dagegen das Mischen der Karten. Ebenfalls noch nicht realisiert ist die adäquate Initialisierung des Stapel: Bei einem Kartenstapel sollten zunächst alle 32 Spielkarten im Stapel vorkommen.
Die Klasse Kartenstapel
lässt sich jetzt leicht als Erweiterung der Klasse
Stapel
gewinnen. Die Idee ist hierbei, das Rad nicht noch einmal neu zu erfinden,
sondern die bereits vorhandenen Funktionalitäten zu nutzen und gegebenenfalls zu erweitern oder auch abzuändern.
Das folgende Klassendiagramm verdeutlicht diesen Erweiterungsprozess.
Die Klasse Kartenstapel
übernimmt alle Attribute und Methoden der Klasse Stapel
.
Sie ergänzt die noch fehlende Methode mischen
. Beachte, dass der Konstruktor der Klasse
Kartenstapel
auch anders konzipiert werden muss als der Konstruktor der Klasse Stapel
.
Eine Implementierung der Klasse Kartenstapel
als Erweiterung der Klasse Stapel
findest du in der Datei kartenstapel.py.
Aufgabe 2
Was leistet das folgende Testprogramm? Überprüfe deine Vermutung.
from kartenstapel import Kartenstapel
# Test
kartenstapel = Kartenstapel()
kartenstapel.mischen()
while not kartenstapel.isEmpty():
obersteKarte = kartenstapel.pop()
print(obersteKarte)
Aufgabe 3
Keep or Throw ist ein (noch mäßig bekanntes) Kartenspiel für einsame Stunden. Es wird nach folgenden Regeln gespielt:
Gegeben ist ein durchmischter Kartenstapel. Der Spieler nimmt sich die oberste Karte und entscheidet, ob er die Karte behält (keep) oder wegwirft (throw). Behält er die Karte, wird sie auf einem Keep-Stapel abgelegt, ansonsten auf dem Throw-Stapel. Ziel ist es, möglichst viele Karten zu behalten. Dabei muss aber folgende Bedingung beachtet werden: Die Karten im Keep-Stapel müssen in aufsteigender Reihenfolge vorliegen. Die Reihenfolge der Karten ist dabei folgendermaßen festgelegt:
'X-A' > 'X-K' > 'X-D' > 'X-B' > 'X-10' > 'X-9' > 'X-8' > 'X-7' > 'P-A' > 'P-K' > 'P-D' > 'P-B' > 'P-10' > 'P-9' > 'P-8' > 'P-7' > 'H-A' > 'H-K' > 'H-D' > 'H-B' > 'H-10' > 'H-9' > 'H-8' > 'H-7' > 'K-A' > 'K-K' > 'K-D' > 'K-B' > 'K-10' > 'K-9' > 'K-8' > 'K-7'
Äußerst ungeschickt wäre es, direkt am Anfang eine "hohe" Karte wie "X-K" zu behalten. Die meisten der folgenden Karten müssten dann auf den Throw-Stapel gelegt werden.
Entwickle ein einfaches Programm zur Realisierung dieses Spiels. Beachte, dass der Keep- und Throw-Stapel zu Beginn des Spiels
leer sind. Du musst also mit zwei Stapel
-Objekten und einem Kartenstapel
-Objekt arbeiten.