Kartenstapel als spezieller Stapel

Stapel und das LIFO-Prinzip

Stapel kennst du aus dem täglichen Leben: Tellerstapel, Bücherstapel, ....

Struktur eines Stapels

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".

Stapel

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.

Stapel und Kartenstapel

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.

Klassendiagramm

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.

Klassendiagramm

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.

X

Fehler melden

X

Suche