Vertiefungskurs 1 aus
Informationswirtschaft
Dr. Michael Hahsler
Autor: Angelika
Brändle
Matrikelnr.: 0051964
E-Mail: h0051964@wu-wien.ac.at
Datum: 25.01.2005
Problemdefinition:
Ziel dieses Projekt ist es, das Spiel Black Jack textbasiert mittels Java zu implementieren.
Es soll ein Spieler gegen die Bank spielen können.
Das Spiel Black Jack soll anhand folgender Spielregeln implementiert werden:
Jede Karte ist das Ergebnis einer Zufallsziehung aus 312 Karten ( = 6 Kartenspiele zu jeweils 52 Karten).
Es soll ein Spieler gegen die Bank spielen.
Ziel des Spielers ist es, mit den Spielkarten den Punktewert 21 zu erreichen, bzw. ihm möglichst nahe zu kommen. Wird der Punktestand von 21 überschritten, so hat der betreffende Spieler verloren.
Der Spieler erhält die Spielkarten von der Bank, die Bank ist gleichzeitig der Gegenspieler und zieht nach festgesetzten Regeln.
Das Spiel gewinnt, wer die höhere Punkteanzahl hat, ohne jedoch 21 zu überschreiten.

Beschreibung Use Case „Spiel starten“ :
Use-Case Name: Spiel starten
Akteure: Bank und Spieler
Vorbedingungen: Interesse am Spiel Black Jack
Nachbedingungen: Spieler über Kontostand und seine aktuellen Karten informiert
Auslöser: Start des Programms
Ablaufbeschreibung: - Das Programm Black Jack wird gestartet
- Der aktuelle Kontostand wird angezeigt
- Der Spieler erhält 2 Karten und deren Wert
- Die Bank erhält eine Karte
Ergebnisse: Der Spieler ist über seinen Punktewert und seine Karten informiert und kann zum nächsten Spielzug übergehen.
Beschreibung Use Case „Karte anfordern“ :
Use-Case Name: Karte anfordern
Akteure: Bank und Spieler
Vorbedingungen: Spiel wurde gestartet
Nachbedingungen: Entscheidung getroffen, ob neue Karte angefordert werden soll oder nicht
Auslöser: Start des Spiels
Ablaufbeschreibung: - der Spieler wird gefragt ob er weitere Karten möchte
- es werden so lange weitere Karten ausgegeben bis der Spieler dies ablehnt, oder den Wert 21 überschritten hat
- dann fordert die Bank Karten an, bis sie die Summe 17 erreicht oder 21 überschritten hat
Fehlsituationen: anstatt j oder n wurde anderer Befehl eingegeben
Ergebnisse: Punktewert der Karten des Spielers wird ausgegeben
Beschreibung Use Case „Runde beendet“ :
Use-Case
Name: Runde beendet
Akteure: Bank und Spieler
Vorbedingungen: Spieler fordert keine weiteren Karten mehr an
Nachbedingungen: Kontostand wurde geändert
Auslöser: Bank fordert keine weiteren Karten mehr an
Ablaufbeschreibung: - Die Karten und Werte der Karten des Spieler und der Karten der Bank werden ausgegeben
- Die Werte werden verglichen
- Spieler gewinnt
- Bank gewinnt
- Unentschieden
- Spieler wird gefragt ob er weiterspielen möchte
Variation: - Spieler oder Bank gewinnen mit Black Jack
- Spieler erreicht Maximalkontostand
- Spieler ist bankrott
Ergebnisse: - Spieler gewinnt: Gewinn wird auf seinem Konto gespeichert
- Bank gewinnt: Einsatz wird vom Konto des Spielers abgezogen
- Unentschieden: Kontostand bleibt gleich
- Bank gewinnt mit Black Jack: 1,5 facher Einsatz wird vom Spielerkonto abgezogen
- Spieler gewinnt mit Black Jack: 1,5 facher Einsatz wird auf sein Konto aufgebucht
- Spieler möchte weiterspielen: Spiel beginnt von vorne
- Spieler beendet das Spiel: Programmende
- Spieler hat Maximalkontostand erreicht: Programmende
- Spieler ist bankrott: Programmende
Klassendiagramm

Klassenbeschreibung:
Klasse Karte
In der Klasse Karte werden die Farbe, der Name und der Wert der Karte gespeichert.
Über die Methoden getFarbe(), getName(),getWert() können diese abgefragt werden.
Klasse Kartenstapel
Mit dem Konstruktor Kartenstapel wird eine leere Linked List erzeugt, die String-Variablen werden zunächst auf leer gesetzt, der int Wert auf 0 initialisiert.
Die innere Schleife weist den Karten zunächst Farben zu, dann den jeweiligen Namen und den Wert. Mit break wird diese Schleife abgebrochen. Farbe,Name und Wert werden in Karte gespeichert, welche wiederum in der Linked List karten gespeichert werden.
Dies geschieht so lange, bis sich 6 Kartenstapel zu jeweils 52 Karten in der Linked List befinden.
Mit der Methode getKarte() wird eine Karte zufällig ausgewählt und zurückgegeben.
Klasse Hand
Im Konstruktor wird eine leere Linked List erzeugt.
In der Methode addKarte() wird zunächst geprüft, ob die entsprechende Karte eine As ist, wenn ja wird die Anzahl der Asse um 1 erhöht. Die Karte wird an die Linked List angehängt. Die Methode getAnzKarten() fragt mittels LinkedList.size() ab, wie viele Karten die Linked List enthält.
Die Methode clear() löscht mit LinkedList.clear() die gespeicherten Karten, die Anzahl der Asse wird auf 0 gesetzt.
Die Methode getPunkte() berechnet mittels einer Schleife die Summe der Kartenwerte:
Zunächst wird mittels LinkedList.get() das gespeicherte Object aus der Linked List abgefragt, (Cast auf Karte), dann werden mit getWert() die Werte der jeweiligen Karten abgefragt und schließlich aufaddiert. Zurückgegeben wird die Summe aller Kartenwerte.
Mit der Methode getAnzAsse() kann deren erhaltene Anzahl abgefragt werden.
Wird die Methode toString() aufgerufen, werden die Karten mit ihrer Farbe (k.getFarbe()),mit ihrem Wert (k.getWert()) und ihrem Namen (k.getName()) als String zurückgegeben.
Klasse Spieler
In der abstrakten Klasse Spieler wird im Konstruktor zunächst der Kontruktor der Superklasse Hand aufgerufen, um einen neues Objekt Hand zu erzeugen.
Mit der Methode karteAnfordern() kann eine weitere Karte gezogen werden. Dazu wird zunächst die Methode kstapel.getKarte() aufgerufen um eine Karte zu ziehen, mit hand.addKarte() wird sie in Hand gespeichert.
Mit der Methode hasBlackJack wird geprüft, ob der Spieler einen Black Jack erreicht hat.
Mit der Methode getPunkte() wird die Punkteanzahl des Spielers ermittelt, indem die Methode getPunkte() aus der Klasse Hand aufgerufen und das Ergebnis zurückgegeben wird.
Mit der Methode asseAbfragen() wird die optimale Kombination für den Spieler ausgwählt.
Die Methode zeigeKarten() gibt die Karten aus.
Mit der Methode kartenRetourGeben() wird die clear Methode der Klasse Hand aufgerufen um die Karten zu löschen, die Anzahl der Asse wird auf 0 gesetzt.
Die abstrakte Methode willNochKarten() bedeutet, dass diese Methode in den Unterklassen implementiert werden muss, diese sie jedoch unterschiedlich implementieren können.
Klasse Bank
Die Klasse Bank erbt von der Klasse Spieler
Der Konstruktor erzeugt ein Objekt der Klasse Bank, indem der Konstruktor der Superklasse Spieler aufgerufen wird.
Die Methode willNochKarten() prüft zuerst den Punktestand, ist der Punktestand kleiner als 17 wird noch eine Karte angefordert.
Klasse Mensch
Die Klasse Mensch erbt von der Klasse Spieler, ein neues Objekt wird mit dem Konstruktor Mensch erzeugt, indem der Konstruktor der Superklasse Spieler aufgerufen wird.
Mit der Methode getKontostand() kann der Kontostand abgefragt werden.
Mit der Methode addToKontostand() wird der Kontostand des Spieler erhöht oder vermindert.
Mit der Methode willNochKarten() können weitere Karten angefordert werden, sofern die Kartensumme 21 nicht überschreitet und noch nicht bereits 10 Karten angefordert wurden.
Mit der Methode zeigeKarten() werden die aktuellen Karten des Spielers angezeigt.
Mit System.out.print werden sowohl die Anzahl der Asse als auch die damit minimal und maximal erreichbare Punktezahl ausgegeben, indem die Methoden getAnzAsse() und getPunkte() aus der Klasse Hand aufgerufen werden.
Der Spieler wird gefragt ob er noch weitere Karten möchte.
In der Schleife wird mittels readLine() die Antwort eingelesen.
Sollte readLine() eine Input-Output-Exception werfen wir das Programm mit einer Fehlermeldung beendet.
Gibt der Spieler j ein, erhält er eine weitere Karte.
Antwortet er mit q/n, wird das Programm beendet. Bei etwaigen anderen Eingaben wird der Spieler aufgefordert mit q/j/n zu antworten.
Die Spielbegrüßung wird am Bildschirm ausgegeben.
Mit der Schleife beginnt die eigentliche Spielrunde:
Zunächst fordert der Mensch, dann die Bank Karten an.
Will keiner der Spieler mehr Karten, werden die Karten und die Punkte ausgegeben.
Die verschiedenen Ergebnismöglichkeiten werden geprüft, am Bildschirm ausgegeben und der Einsatz am Kontostand gutgeschrieben oder abgezogen. Der Kontostand wird am Bildschirm ausgegeben. Die Schleife wird abgebrochen wenn der Mensch den maximalen Kontostand überschreitet oder sein Kontostand auf 0 gesunken ist.
Dann ist das Programm beendet.
Treffen diese Möglichkeiten nicht zu, wird die Methode nochEineRunde () aufgerufen:
Der Spieler wird gefragt ob er weiterspielen will, antwortet er mit j beginnt die Schleife erneut, antwortet er mit q oder n wird das Programm ebenfalls beendet.
Gibt er einen anderen Befehl ein, wird er aufgefordert j, n bzw. q einzugeben.
Dokumentation für den Anwender:
Speichern Sie den Code auf Ihrem PC und starten Sie das Programm über die Kommandozeile. Gleich zu Beginn werden Ihnen Ihr Kontostand und ihre Karten angezeigt.
Sie antworten mit j für ja, mit n für nein, mit q können Sie das Spiel verlassen.
Viel Spass!