Mein Java Projekt: 4-Gewinnt

Praktikum aus Programmierung

 

 

Christian Grübl (email: C.Gruebl@oerk.at)

18.12.2003

Java Code

 

1.   Problemdefinition

Entwickeln Sie einen Spiele - Server: Sie sollen einen Server und Clients für das Spiel 4-Gewinnt mit beliebigen Mitspielern, wobei immer 2 Spieler ein Spiel spielen, implementieren. Das Spielbrett besteht aus einer 7x7 Matrix. Die beiden Spieler werfen abwechselnd je einen Stein in eine der 7 Spalten. Der Stein fällt immer in die unterste freie Zeile der jeweiligen Spalte. Ziel ist es, 4 eigene Steine in eine horizontale, vertikale oder diagonale Linie zu bekommen. Jeder Spieler muss mit jedem beliebigen anderen Spieler ein Spiel aufnehmen können. Nach dem Ende eines Spieles kann ein weiteres Spiel mit wiederum jedem beliebigen Spieler gestartet werden. Es muss die Möglichkeit bestehen, dass die Spieler an verschiedenen PCs spielen.

2.   Analyse

Die Probleme bestehen aus 2 großen Teilproblemen. Erstens darin, dass die Spieler an verschiedenen Rechnern sitzen und jeder mit jedem in ein Spiel eintreten kann. Zweitens in der Sicherstellung des richtigen Spielablaufes. Die Spieler müssen abwechselnd werfen, wenn ein Spieler gewonnen hat oder das Spielbrett vollständig gefüllt ist darf kein Wurf mehr möglich sein.

 

UML- UseCase Diagramm:

 

3.   Design

Das Spiel besteht im Groben aus 2 Phasen:

Ø      Spielauswahl

Ø      Spiel an sich

Die Spielauswahl ist eine reine Textapplikation. Mit dem Befehl „help“ bekommt man einen Überblick über alle gültigen Befehle. Diese sind:

Ø      „name xxx“: Befehl um den Spielername festzulegen. Statt xxx wird der Spielername angegeben.

Ø      „wait“: Schickt den Spieler in eine Warteschleife, bis ein anderer Spieler ins Spiel eintritt

Ø      „play xxx“: Ermöglicht das Eintreten in ein Spiel. Statt xxx wird der Spielername des wartenden Spielers angegeben.

Ø      „list“: Gibt eine Liste aller wartenden Spieler zurück

Ø      „bye.“: Beendet die Serververbindung

 

Das Spiel an sich ist eine Grafikapplikation. Tritt man in ein Spiel ein, oder beendet das Eintreten eines anderen die durch „wait“ ausgelöste Warteschleife, so öffnet sich ein 4 Gewinnt Spielbrett. In der oberen schwarzen Zeile wird angezeigt, ob man selbst an der Reihe ist oder man auf den Wurf des Gegners warten muss. Ist man an der Reihe kann man durch Mausklick auf die gewünschte Spalte einen Stein in eben diese werfen. Ist kein Zug mehr möglich, weil entweder alle Felder belegt sind oder ein Spieler 4 Steine in eine horizontale, vertikale oder diagonale Linie gebracht hat, so erscheint eine Meldung und das Spiel ist beendet. Nun ist eine erneute Eingabe in der Spielauswahlmaske möglich um entweder das Spiel zu beenden oder in ein weiteres Spiel einzutreten.

 

UML: Klassendiagramm vom Server

 


UML: Klassendiagramm vom Client

 

4.   Implementierung

SpieleServer:

Diese Klasse besitzt nur eine main Methode um auf neue Threads zu warten und ihnen den Zeiger auf die Instanz von Spielesammlung mitzugeben.

 

SpieleServerThread:

Diese Klasse besitzt einen Konstruktor und eine run Methode. Sie dient in erster Linie dazu, mehreren Usern einen Zugang zum Server zu ermöglichen und diese parallel arbeiten zu lassen. Weiters koordiniert diese Klasse auch den Input eines Clients und gibt über die Variable out auch Daten an den Client zurück.

 

Spielesammlung:

Diese Klasse ist ein Container von mehreren Spielen. Sie ist dazu notwendig, um den 2 verschiedenen Threads Zugang zu dem selben Spiel zu ermöglichen.

 

Spiel:

Diese Klasse beinhaltet alle Informationen zu genau einem Spiel. Welche Spieler nehmen teil, wer ist an der Reihe, wie viele Steine wurden in welchen Slot geworfen und gibt es schon einen Sieger und wenn ja wie heißt er. Weiters beinhaltet diese Klasse 2 wichtige Methoden. Eine wirft einen Stein in den angegebenen Slot und die andere ermittelt einen möglichen Sieger.

 

AuswahlProtocol:

Diese Klasse dient in erster Linie dazu, einen String zu bekommen, diesen zu verstehen und eine entsprechende Meldung zurückzugeben. Es gibt 2 Protokolle. Eines für die Auswahl des Spielers und eines für das Spiel selbst.

 


SpieleClient:

Diese Klasse stellt den Client ohne grafische Spieloberfläche dar. Sie bereitet empfangene Strings auf und gibt Sie aus.

 

Spielbrett:

Diese Klasse dient zum öffnen bzw. schließen des Grafik Fensters.

 

SMCanvas

Diese Klasse dient zur grafischen Darstellung des Spielbretts und der Möglichkeit Steine per Mausklick zu werfen.

 

5.   Dokumentation für den Anwender

Installation:

Für den Serverbetrieb benötigt man die *.class Files der Klassen SpieleServer, SpieleServerThread, Spielesammlung, Spiel, AuswahlProtocol. Im File SpieleClient.java muss die IP-Adresse des Servers eingetragen werden. Sonst benötigt man nur die *.class Files der Klassen SpieleClient und Brett. Weiters ist natürlich eine JAVA virtuell machine von Nöten.

 

Wartung:

Nur notwendig wenn der Server übersiedelt. In diesem Fall muss die neue Adresse in die Klasse SpieleClient eingetragen und diese dann neu kompiliert werden.