Mein Java Projekt: Tic Tac Toe

Praktikum aus Programmierung

 

 

 

Barbara Palka (email: h9750383@wu-wien.ac.at)

21.01.2004   

Java Code

Problemdefinition

Es soll ein einfaches Spiel für User, die auf der ganzen Welt verteilt sein können, ausgesucht und implementiert werden. Als Spiel wurde Tic Tac Toe gewählt und als verteilte und mehrbenutzerfähige Anwendung programmiert.

Dabei können sich die Spieler mit dem Server verbinden und gegeneinander antreten. Die Spieler sind mittels ihres persönlichen Nicknames zu identifizieren und können ihren Punktestand mit denen der anderen Spieler vergleichen. Der User braucht auf seinem Rechner keinerlei Installationen durchzuführen. Er verbindet sich einfach über Telnet mit dem Spieleserver und bekommt alle Daten von diesem übermittelt.

 

Analyse

Der Server stellt die technische Basis für das Spiel zur Verfügung und entspricht auch einem Spielleiter. Er übernimmt dabei folgende Aufgaben:

 

Die Spieler sollen sich, nachdem sie sich mit dem Server verbunden haben, einen Spielernamen aussuchen können. Danach sollen sie in einen Warteraum kommen, in dem sich alle Spieler befinden, die momentan nicht an einem Spiel teilnehmen. Hier sollen die Punktestände der einzelnen, sich gerade online befindlichen Spieler abrufbar sein. Auf die Speicherung eines „all-time-high-scores“ wurde verzichtet.

Vom Warteraum aus sollen die Spieler die Möglichkeit haben, Spiele zu starten oder einem schon bestehenden Spiel beizutreten.

Der Server übernimmt vollständig die Kommunikation zwischen den beiden Spielpartnern. Nach jedem Zug wird der aktuelle Spielstand an beide Spieler übermittelt. So wird sichergestellt, dass beide Mitspieler alle notwendigen Informationen für die Durchführung ihres nächsten taktischen Zuges zur Verfügung haben.

Das Verlassen des Programms sowie der Aufruf der Hilfe soll jederzeit möglich sein, egal ob der Spieler noch nicht angelegt ist (also noch keinen Namen hat), sich im Warteraum befindet oder gerade ein Spiel spielt.

Weiters soll die Möglichkeit bestehen aus einem laufenden Spiel auszusteigen und in den Warteraum zurückzukehern. Hiebei wird vom Fair-Play der Spieler ausgegangen, da man auf diese Art auch einer bevorstehenden Niederlage entgehen kann und der „Sieger“ somit keine Punkte erhält.

 

UML: Use Case Diagramm

 

 

Design

Der Spieleserver hat einen Eingangsport an dem jeder Client sich anmeldet. Nach Aufbau der Verbindung leitet der Server den Client auf einen anderen Port um, damit der Anmeldeport wieder für andere Spieler frei ist. Mit der Umleitung auf einen anderen Port wird auch ein eigener Thread für den Client erstellt. Pro Thread gibt es ein Protokoll, das die möglichen Befehle eines Spielers beinhaltet. Es gibt also an, was das Programm tun soll, wenn der User eine bestimmte Eingabe macht oder eben nicht macht. Jedes Protokoll gehört zu einem bestimmten Spieler. Spieler, Protokoll und Thread haben also untereinander eine 1:1-Beziehung.

Um die Möglichkeit eines für alle Spieler gemeinsamen Warteraumes zu realisieren, legt der Server einen solchen gleich zu Beginn (also gleich nach dem Start des Servers selbst) an. Wird ein neuer Spieler mit Namen angelegt, wird dieser über sein Protokoll in den Warteraum eingetragen. Die Eintragung der einzelnen Spielerdaten in den Warteraum werden ebenso vom Protokoll aus aufgerufen wie der Abruf der aktuellen Liste, wer sich gerade im Warteraum befindet.

Erstellt ein Spieler ein Spiel, so wird ein eigenes Spiel unter seinem Namen angelegt und befindet er sich nicht mehr im Warteraum, sondern in seinem Spiel. Warteraumbefehle sind daher nichtmehr gültig. Steigt ein Gegenspieler ins Spiel ein, so wird dem Spiel das Protokoll des Gegners übergeben, ebenso wie bei Erstellung eines Spiels das Protokoll des eröffnenden Spielers übergeben wird. Dadurch wird die  Erkennung, welcher Spieler gerade am Zug ist bzw einen Zug gemacht hat, sichergestellt.

Die beiden Spieler setzen nun abwechselnd ihre Markierungen. Nach jedem Zug wird überprüft, ob bereits ein Gewinner feststeht oder ein Unentschieden erreicht wurde. Beiden Spielern wird immer der aktuelle Spielstand und die Mitteilung, wer gerade am Zug ist, übermittelt. Steht ein Gewinner oder ein Unentschieden fest, werden die Punkte verteilt. Danach gelangen die Spieler wieder in den Warteraum zurück.

Die Punkteverteilung erfolgt bewußt so, dass ein Gewinner des Spiels extrem belohnt wird (100 Punkte) und ein Verlierer nur mit einem symbolischen Punkt versehen wird. Spielpartner die ein Unentschieden erreicht haben erhalten jeweils 5 Punkte.

 


Protokoll:

Eingabe

Methode

Ergebnis

Wann aufrufbar?

hallo

hello()

gibt Begrüßungstext am Bildschirm

jederzeit

hilfe

help()

liefert eine Übersicht, welche Eingaben gemacht werden können

jederzeit

verlassen

close()

verlässt das Programm; Verbindung wird getrennt

jederzeit

name:spieler

login(String)

legt – wenn noch keiner vergeben wurde – einen neuen Spielernamen an; existiert der Name schon wird der Spieler aufgefordert, sich einen neuen Namen auszusuchen

ganz am Anfang (bevor der Spieler den Warteraum betritt)

w:liste

warteraum(String)

gibt die Liste aller im Warteraum existierenden Spieler mit ihren Punkteständen und ihrem jeweiligen Status aus

im Warteraum

w:spiel

warteraum(String)

legt ein neues Spiel an

im Warteraum

w:join:gegnername

warteraum(String)

beitreten zu einem angelegten Spiel;

im Warteraum

ttt:marke:feld

game(String)

setzen einer Markierung auf das gewünsche Feld

im Spiel

ttt:verlassen

game(String)

verlässt das Spiel; beide Spieler kommen in den Warteraum zurück

im Spiel

 

 

UML: Klassendiagramm (Klassendiagramm mit Methoden*)

 

UML: Sequenzdiagramm

Implementierung

Wie aus dem Klassendiagramm ersichtlich, wurden 7 Klassen geschaffen:

1)     TicTacToeServer

2)     ServerThread

3)     ServerSendThread (innere Klasse von ServerThread)

4)     Protokoll

5)     Spieler

6)     TicTacToe

7)     Warteraum

Die Klasse ServerSendThread wird dafür gebraucht, dass nicht nur nach einer Anfrage vom Client Nachrichten vom Server gesendet werden können. Es ermöglicht also die „unaufgeforderte“ Kommunikation vom Server mit dem Client. Dies ist notwendig um nach jedem getätigten Spielzug beiden Spielern den aktuellen Spielstand zu übermitteln.  

 

Dokumentation für den Anwender

 

Wilkommen in der wunderbaren Welt des TicTacToe!

 

Wer hat nicht in der Schule heimlich unter dem Tisch mit seinem Sitznachbarn eine oder zwei schnelle Runden TicTacToe gespielt, wenn die Geschichtestunde zu langweilig wurde? Wer kennt ihn nicht, den Nervenkitzel der schnellen Taktik?

Jetzt ist es soweit….TicTacToe-Träume werden wahr: das Spiel ist online! Komm’ mit in die aufregende Welt voller ‚x’ und ‚o’, voller Siege und Niederlagen. Komm’ mit auf Barbara’s TicTacToe-Server v1.0!

 

Erste Schritte:

Verbinde Dich mit dem Server und connecte auf Port 5555. Gib ‚hallo’ ein und schon wirst Du vom Server begrüßt. Es kann also losgehen….

Bei eventuellen Unklarheiten kannst Du jederzeit -  egal an welcher Stelle im Programm Du Dich gerade befindest - um Hilfe rufen (‚hilfe’ eingeben) und Dir wird geholfen.  ;-)

 


Warteraum:

Wenn Du eine Verbindung zum Server hast, musst Du als erstes Deinen Spielernamen eingeben (z.B.: gibt Spieler Maxi ein:  name:maxi), danach kommst Du in den Warteraum.

Der Warteraum bietet Dir viele Möglichkeiten: Mit dem Befehl ‚w:listeerhälst Du Informationen über alle Spieler, die sich im Warteraum befinden. Du siehst den jeweiligen Spielernamen, seinen Punktstand und seinen Status. Der Status gibt an, in welchem Zustand sich der jeweilige Spieler gerade befindet (Warteliste/Frei, Wartet auf Gegner, Spielt).

Hast Du in der Liste einen Spieler entdeckt, der auf einen Gegner wartet, so kannst Du in sein Spiel einsteigen. Gib dazu ‚w:join:gegnername’ (gegnername ist der Name des gewünschten Gegners) ein und sogleich beginnt das Spiel.

Du kannst natürlich auch ein eigenes Spiel eröffnen. Mit ‚w:spiel’ legst Du ein solches neues Spiel an. Wenn Du das getan hast, befindest Du Dich in einer Warteposition: Du wartest darauf, dass sich einer Deiner Mitspieler dazu entschließt mit Dir zu spielen. Während Du wartest kannst Du keine anderen Befehle eingeben. Aber keine Angst: es wird nicht lange dauern, bis einer der TicTacToe-Verrückten in Dein Spiel einsteigt und der Kampf beginnt.  ;-)

 

Spiel:

Im Spiel kannst Du mit ‚ttt:marke:feldnummer’ eine Markierung auf das von Dir gewünschte Feld setzen. Aber nur, wenn Du auch wirklich dran bist! Das Spielgitter ist von 1 bis 9 durchnummeriert. Lass Dich nicht davon verunsichern, dass die Zahlen vorerst noch in einer Reihe präsentiert werden. Der Server rechnet trotzdem bzgl Spielstand richtig mit. Bis das Client-Update von Barbara’s TicTacToe-Server herauskommt, kannst Du Dir ja das Spielgitter auf ein Blatt Papier aufzeichnen (alter Hausfrauentrick).  ;-)

Du kannst das Spiel jederzeit mit ‚ttt:verlassen’ beenden. Es werden dann keine Punkte verteilt und Du und Dein Gegner kommen wieder in den Warteraum zurück.

 

Spiel verlassen:

Möchtest Du aus dem Spiel aussteigen (ist zwar für den echten TicTacToer unvorstellbar, soll aber schon das eine oder andere Mal vorgekommen sein), dann gib ‚verlassen’ ein. VORSICHT: das funktioniert von jeder Stelle des Programms aus (ebenso wie die Hilfe)! Also schmeiß Dich nicht versehentlich selber vom Server!

 

Und jetzt ran an das Spiel! Mach’ Deine Gegner fertig und erreiche in Rekordzeit den höchsten Punktestand! Tic Tac Toe!!!