Projekt Spieleserver

 

Tic Tac Toe

 

 

 

 

 

 

 

 

Leitung:  Dr. Michael Hahsler

Java Code

 

 

 

 

 

Elisabeth Damberger

 

Matrikel-Nr.: 9950573

Studienrichtung: BW (151)

16. Jänner 2004

 

 


 

Inhaltsverzeichnis

 

1.    Problemsstellung.. 3

2.    Analyse. 4

2.1.     Spielregeln von Tic-Tac-Toe. 4

2.2.     Use-Case-Diagramm (UML) 5

3.    Design.. 6

3.1.     Klassendiagramm (UML) 6

3.2.     Sequenzdiagramm (UML) 7

3.3.     Protokoll 7

4.    Implementierung.. 8

4.1.     Javadocs. 8

4.2.     Java-Code. 14

5.    Installation.. 15

6.    Anwender-Hinweise. 15

6.1.     Einwählen. 15

6.2.     Anmelden/Registrieren. 15

6.3.     Spiel starten. 15

6.4.     Spielrunde beginnen. 15

6.5.     Ende der Spielrunde. 16

6.6.     Anderen Gegner auswählen. 16

6.7.     Hilfefunktion. 16

6.8.     Abmelden/Ausloggen. 16

 


1.      Problemsstellung

 

Es soll im Rahmen der LV „Rechnerpraktikum aus Java“ ein Spiele-Server (Multi-Thread-Server) und Clients für das Spiel Tic-Tac-Toe mit jeweils 2 Spielern implementiert werden.

 

 

Das entsprechende Vorgehen sieht wie folgt aus:

 

1.       Protokoll entwickeln

2.       UML-Diagramm für Server und Client

3.       Server implementieren (sollte über telnet bereits verwendbar sein)

4.       Client implementieren (Grafische Oberfläche/Applet oder Computergegner sind optional)

5.       Dokumentation:

Ø      Erklärung des Spiels (Problemstellung, Analyse)

Ø      UML-Diagramme & Protokoll (Design)

Ø      Erklärung der Klassen (Implementierung)

Ø      Installation & Wartung

 


2.         Analyse

 

2.1.   Spielregeln von Tic-Tac-Toe

 

 

Anzahl der Spieler pro Spiel: 2

 


Spielfeld: besteht aus 3 × 3 Feldern

 

 

 

Ablauf: abwechselnd markiert jeder Spieler ein Feld mit seinem Symbol (z.B. mit einem Kreuz "x" oder Kreis "o" bzw. mit Nummer 1 oder 2), um so eine Reihe von 3 gleichen Markierungen nebeneinander in horizontaler, vertikaler oder diagonaler Anordnung herzustellen

 

Beginner: nach Zufallsprinzip

 

Gewinner: der Spieler, dem die Reihe von 3 gleichen Markierungen nebeneinander in einer Reihe, Spalte oder in einer Diagonale zuerst gelingt

 

z.B.:

 

 

 
                                                                                             

 

 

Spalte

 
 


   Diagonale                              Reihe


2.2.   Use-Case-Diagramm (UML)

 

 



 

3.         Design

3.1.   Klassendiagramm (UML)

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 


3.2.   Sequenzdiagramm (UML)

 

siehe Beilage (Excel-Tabelle: tictactoe.xls, Blatt Sequenz)

 

 

3.3.   Protokoll

 

siehe Beilage (Excel-Tabelle: tictactoe.xls, Blatt Protokoll)

 

 


4.         Implementierung

4.1.   Javadocs

 

4.1.1.                                               Javadoc von Server.java

 

 

Class Server

java.lang.Object
  extended byServer

public class Server

extends java.lang.Object


Constructor Summary

Server()            

 

 

Method Summary

static void

main(java.lang.String[] args)
          Mainmethode

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

Constructor Detail

Server

public Server()
 

Method Detail

main

public static void main(java.lang.String[] args)
                 throws java.io.IOException

Mainmethode

Throws:

java.io.IOException

 

 


 

4.1.2.                                         Javadoc von SpieleThread.java

 

 

Class SpieleThread

java.lang.Object
  extended byjava.lang.Thread
      extended by    SpieleThread
 

All Implemented Interfaces:

java.lang.Runnable


public class SpieleThread

extends java.lang.Thread


Field Summary

Fields inherited from class java.lang.Thread

MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY

 

Constructor Summary

SpieleThread(java.net.Socket socket)
Konstruktor zur Erstellung eines neuen (Spiele)Threads für jeden eingewählten Spieler

 

 

Method Summary

 void

run()
          Überschreiben der Methode run der Klasse Thread

 

Methods inherited from class java.lang.Thread

activeCount, checkAccess, countStackFrames, currentThread, destroy, dumpStack, enumerate, getContextClassLoader, getName, getPriority, getThreadGroup, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setName, setPriority, sleep, sleep, start, stop, stop, suspend, toString, yield

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

 

Constructor Detail

SpieleThread

public SpieleThread(java.net.Socket socket)

Konstruktor zur Erstellung eines neuen (Spiele)Threads für jeden eingewählten Spieler

 

Method Detail

run

public void run()

Überschreiben der Methode run der Klasse Thread

 

 

 

4.1.3.                                              Javadoc von Protocol.java

 

 

Class Protocol

java.lang.Object
  extended byProtocol

public class Protocol

extends java.lang.Object


Field Summary

 TicTacToe

spiel            

 

Constructor Summary

Protocol(int usernummer, java.lang.String username, SpieleThread meinThread)
          Konstruktor inkl.

 

 

Method Summary

 void

generateoutput(java.lang.String output)
ermöglicht die Ausgabe von Text ohne Input bzw.

 java.lang.String

help()
Hilfefenster - Anzeige aller Befehle, Beschreibung des Spiels etc.

 java.lang.String

processInput(java.lang.String inputLine)
Verarbeitung der Eingaben der Benutzer (start, help, bye, spielen etc.)

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

Field Detail

spiel

public TicTacToe spiel
 
 

Constructor Detail

Protocol

public Protocol(int usernummer,
                java.lang.String username,
                SpieleThread meinThread)

Konstruktor inkl. Spielernummer u. Spielernamen laut Server-Einwahl bzw. –Registrierung

 

Method Detail

processInput

public java.lang.String processInput(java.lang.String inputLine)

Verarbeitung der Eingaben der Benutzer (start, help, bye, spielen etc.)


generateoutput

public void generateoutput(java.lang.String output)

ermöglicht die Ausgabe von Text ohne Input bzw. Eingabe des Spielers


help

public java.lang.String help()

Hilfefenster - Anzeige aller Befehle, Beschreibung des Spiels etc.

 

 

 

4.1.4.                                             Javadoc von TicTacToe.java

 

 

Class TicTacToe

java.lang.Object
  extended byTicTacToe

public class TicTacToe

extends java.lang.Object


Constructor Summary

TicTacToe(Protocol sp1)
          Konstruktor: ein neues Spielfeld 3 x 3 wird erzeugt, Spielstand wird auf 0 gesetzt, der erzeugende Spieler bzw. desseb Protokoll wird übergeben

 

 

Method Summary

 java.lang.String

anfangen()
der Zufallsgenerator bestimmt, ob Spieler 1 oder 2 beginnen darf

 java.lang.String

feldAnzeigen(java.lang.String eingabe)
          Anzeige des Feldes, das vom aktuellen Spieler gewählt wurde

 java.lang.String

feldSuchen()
Abfrage des gewünschten Feldes, das der aktuelle Spieler belegen will

 java.lang.String

gegnerAnzeigen(int gegnernr, java.lang.String gegnername)
          der ausgewählte Gegenspieler wird angezeigt

 void

gegnerbenachrichtigen(Protocol sp2, java.lang.String sp2_name)
          der ausgewählte Gegner wird benachrichtigt, daß er für ein Spiel ausgewählt wurde

 java.lang.String

gegnerSuchen()
          die Spielernummer des gewünschten Gegenspielers soll aus der Liste der eingeloggten Spieler ausgewählt werden; ist kein weiterer Spieler eingeloggt, kann nicht gespielt werden

 java.lang.String

gewinnstatusChecken()
          Kontrolle, ob ein Spieler bereits gewonnen hat (3 in einer Reihe/Spalte/Diagonale)

 java.lang.String

naechstenAnzeigen()
          Anzeige des Spielers für den nächsten Spielzug (abwechselnd)

 java.lang.String

setzen()
          je nach Spieler wird das ausgewählte Spielfeld entsprechend belegt - sofern es noch frei ist bzw. existiert und noch nicht 9 Züge absolviert wurden

 java.lang.String

spielen()
eine neue Runde des Spiels beginnt; alle Felder sind noch frei (= 0)

 java.lang.String

spielstandAnzeigen()
          der Spielstand (Gewinne pro Spieler) wird angezeigt

 java.lang.String

toString()
          Ausgabeformat für die Anzeige des Spielfeldes

 java.lang.String

zuegestatusChecken()
          Kontrolle, ob bereits 9 Züge (ohne Gewinner = unentschieden) durchgeführt wurden

 

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

 

Constructor Detail

TicTacToe

public TicTacToe()

Default-Konstruktor


TicTacToe

public TicTacToe(Protocol sp1)

Konstruktor: ein neues Spielfeld 3 x 3 wird erzeugt, Spielstand wird auf 0 gesetzt, der erzeugende Spieler bzw. desseb Protokoll wird übergeben

 

Method Detail

toString

public java.lang.String toString()

Ausgabeformat für die Anzeige des Spielfeldes


gegnerSuchen

public java.lang.String gegnerSuchen()

die Spielernummer des gewünschten Gegenspielers soll aus der Liste der eingeloggten Spieler ausgewählt werden; ist kein weiterer Spieler eingeloggt, kann nicht gespielt werden


gegnerAnzeigen

public java.lang.String gegnerAnzeigen(int gegnernr,
                                       java.lang.String gegnername)

der ausgewählte Gegenspieler wird angezeigt


gegnerbenachrichtigen

public void gegnerbenachrichtigen(Protocol sp2,
                                  java.lang.String sp2_name)

der ausgewählte Gegner wird benachrichtigt, daß er für ein Spiel ausgewählt wurde


spielen

public java.lang.String spielen()

eine neue Runde des Spiels beginnt; alle Felder sind noch frei (= 0)


anfangen

public java.lang.String anfangen()

der Zufallsgenerator bestimmt, ob Spieler 1 oder 2 beginnen darf


feldSuchen

public java.lang.String feldSuchen()

Abfrage des gewünschten Feldes, das der aktuelle Spieler belegen will


feldAnzeigen

public java.lang.String feldAnzeigen(java.lang.String eingabe)

Anzeige des Feldes, das vom aktuellen Spieler gewählt wurde


naechstenAnzeigen

public java.lang.String naechstenAnzeigen()

Anzeige des Spielers für den nächsten Spielzug (abwechselnd)


gewinnstatusChecken

public java.lang.String gewinnstatusChecken()

Kontrolle, ob ein Spieler bereits gewonnen hat (3 in einer Reihe/Spalte/Diagonale)


zuegestatusChecken

public java.lang.String zuegestatusChecken()

Kontrolle, ob bereits 9 Züge (ohne Gewinner = unentschieden) durchgeführt wurden


spielstandAnzeigen

public java.lang.String spielstandAnzeigen()

der Spielstand (Gewinne pro Spieler) wird angezeigt


setzen

public java.lang.String setzen()

je nach Spieler wird das ausgewählte Spielfeld entsprechend belegt - sofern es noch frei ist bzw. existiert und noch nicht 9 Züge absolviert wurden

 

 

 

4.2.     Java-Code

 

 

Der Java-Code der vier betreffenden Klassen ist in der Beilage bzw. in folgenden Dateien zu finden:

 

Ø       Server.java

Ø       SpieleThread.java

Ø       Protocol.java

Ø       TicTacToe.java

 

Wählt sich ein Spieler ein, wird vom Server (Server.java) ein neuer SpielerThread (SpielerThread.java) erzeugt. Dieser wiederum erzeugt für den Spieler bzw. SpielerThread ein neues Protocol (Protocol.java). Das Protocol des Spielers, der den Befehl „start“ eingibt, erstellt ein neues Spiel bzw. eine Instanz von TicTacToe (TicTacToe.java).

 


 

5.      Installation

 

Der Spieleserver ist auf dem lokalen Server bzw. Localhost, Port 5555 installiert. Zugriff erhalten die Spieler (User) durch Einwahl mittels Telnet („telnet localhost 5555“). Es sind 4 Java-Dateien programmiert (siehe auch UML-Klassendiagramm).

 

 

6.      Anwender-Hinweise

 

6.1.   Einwählen

Um TicTacToe spielen zu können, muß man sich am Spieleserver einwählen. Dies erfolgt im Eingabeaufforderungsfenster durch den Befehl „telnet localhost 5555“.

 

6.2.   Anmelden/Registrieren

Nach dem Einwählen fragt der Server nach einem (beliebigen) Benutzernamen, mit dem man anschließend in der Spielerliste aller eingewählter Spieler/User eingetragen wird.

 

6.3.   Spiel starten

Ist noch kein weiterer Spieler eingewählt, kann (noch) nicht gespielt werden. Erst wenn sich ein weiterer Spieler (= Spieler 1) eingewählt hat, kann dieser durch den Befehl „start“ das Spiel TicTacToe starten. Anschließend erscheint eine aktuelle Liste aller eingewählten bzw. wartenden Spieler, aus der er einen Gegner (= Spieler 2) auswählen kann. Nach Eingabe der Spielernummer seines Wunschgegners wird dieser benachrichtigt, daß er zu einem Spiel eingeladen wurde.

 

6.4.   Spielrunde beginnen

Nachdem das Spielerpaar (Spieler 1 und Spieler 2) feststeht, kann Spieler 1 durch den Befehl „spielen“ die erste (bzw. eine neue) Runde des Spiels TicTacToe starten. Der Zufallsgenerator bestimmt, welcher Spieler beginnen darf. Jeder Spieler wird nun abwechselnd aufgefordert, auf ein freies Feld zu setzen, welches entsprechend mit 1 oder 2 markiert wird. Das Spielfeld besteht aus 3 Zeilen und 3 Spalten. Die Feldbezeichnungen lauten z.B. „1-1“ oder „3-1“ (die erste Zahl steht dabei für die Zeile, die zweite Zahl für die Spalte). Die genauen Spielregeln finden sich in Kapitel 2.1.

 

6.5.   Ende der Spielrunde

Sobald ein Spieler 3 in einer Reihe (= gewonnen) hat oder 9 Spielzüge (= unentschieden) erreicht wurden, meldet dies der Server. Bei einem Sieg wird der Spielstand entsprechend aktualisiert. Danach kann mit dem Befehl „spielen“ eine weitere Spielrunde gestartet werden.

 

6.6.   Anderen Gegner auswählen

Durch Eingabe von „start“ gelangt man wieder an den Beginn des Spieles, wo die Auswahl eines (anderen) Gegners möglich ist, sofern weitere Spieler eingeloggt sind. Der Spielstand wird wieder auf 0 gesetzt.

 

6.7.   Hilfefunktion

Durch Eingabe von „help“ gelangt man jederzeit in das Hilfefenster, in dem alle möglichen Befehle, Spielregeln u.ä. aufgelistet sind.

 

6.8.   Abmelden/Ausloggen

Durch Eingabe von „bye“ kann mich sich jederzeit vom Server abmelden. Spielstände und Benutzernamen werden gelöscht. Die Verbindung zum Server wird beendet. Etwaiig laufende Spielrunden werden somit abgebrochen.