Unsere Beispiel-Anwendung
Das Programm, mit dem Sie sich in den nächsten drei Aufgaben beschäftigen werden, ist ein Vier-Gewinnt-Spiel, mit dem Sie über Rechnergrenzen hinweg gegeneinander oder gegen einen Computergegner spielen können.
Prinzipieller Aufbau des "VierGewint"-Systems:
- Partie-Manager und Spielpartien
Der Partiemanager hat die Aufgabe, die laufenden Spielpartien zu verwalten. Er startet bei Bedarf neue Spielpartien und weist diese den Clients zu, die spielen wollen.
Jede Spielpartie enthält die Spiellogik und ein Spielfeld, so daß immer zwei Clients in einer Spielpartie gegeneinander spielen.
- Computerspieler
Der Computerspieler liefert auf Anfrage des Clients den besten Zug für eine bestimmte Spielsituation zurück.
- Client
Der Client beantragt entweder beim Partie-Manager eine neue Spielpartie und wartet auf einen Gegner, oder er steigt als Gegner in einer vorhandenen Partie ein, die er sich vom Partie-Manager holt.
Während des Spiels übermittelt er seine Spielzüge an die Spielpartie und stellt das Spielfeld dar. Die zu übermittelnden Spielzüge nimmt er entweder über die Tastatur vom Benutzer entgegen, oder aber er fragt den Computerspieler nach dem im Moment besten Zug.
Für unsere Aufgabe vereinfachen wir diesen prinzipiellen Aufbau folgendermaßen:
Der Partie-Manager und ein Computerspieler laufen auf einem Rechner, es gibt also nur einen Server.
Die Verzeichnisstruktur unserer Anwendung
Alle Dateien, die Sie zur Praktikumsaufgabe benötigen, erhalten Sie weiter unten als Zip-Datei.
Wenn Sie diese entpacken, werden folgende Verzeichnisse mit den darin enthaltenen Dateien angelegt:
Aufgabe1
| VierGewinnt.idl
| vbroker.csh
|
+---ClientAufg1
| Client.java
|
+---ServerAufg1
PartieManagerImpl.java
Partie4GewinntImpl.java
Meister.java
Server.java
Die einzelnen Dateien:
- VierGewinnt.idl
Das IDL-Interface, in dem einige Konstanten, der Spielfeld-Variablentyp und die Interfaces unserer Objekte definiert werden.
- vbroker.csh
Mit dieser Datei werden die benötigten Umgebungsvariablen gesetzt.
- PartieManagerImpl.java
Das Partie-Manager-Objekt. Wird auf dem Serverrechner zur Verfügung gestellt und verwaltet die Spielpartien.
Die öffentlichen Methoden:
public Partie4gewinnt spielen(String name)
Diese Methode wird vom Client aufgerufen, wenn er eine Partie spielen will. Gibt es schon eine Partie des Namens name, die auf einen Gegner wartet, so wird diese zurückgeliefert, ansonsten instanziiert der Partie-Manager ein neues Spielpartie-Objekt und liefert dieses zurück.
public String auflisten()
Liefert in einem String die Namen aller Spielpartien (getrennt durch CRLF) zurück, die im Moment auf einen Gegner warten.
- Partie4gewinntImpl.java
Das Spielpartie-Objekt. Wird vom Partie-Manager instanziiert und enthält die Spiellogik sowie das Spielfeld in Form eines Arrays.
Die öffentlichen Methoden:
public short init(org.omg.CORBA.IntHolder clientTicket)
Wird von jedem der beiden Spieler zu Beginn aufgerufen. Liefert dem aufrufenden Client seine Spielernummer (1 oder 2) zurück.
Außerdem erhält jeder Spieler über einen out-Parameter ein "Ticket", d.h., eine Zufallszahl, mit der er sich in Zukunft bei der Übermittlung von Spielzügen ausweist.
Das Spiel kann beginnen, sobald init zweimal aufgerufen wurde, d.h., sobald zwei Spieler vorhanden sind.
public short status(int clientTicket)
Liefert dem Spieler, der sich über sein Ticket ausweisen muß, Informationen zum Spielverlauf, z.B. ob er an der Reihe ist oder ob das Spiel schon zu Ende ist.
public short ziehen(int clientTicket, short spalte)
Wirft einen Spielstein in die mit spalte angegebene Spalte des Spielfelds.
Liefert den Status nach dem Spielzug oder einen Fehlerstatus bei ungültigen Zügen zurück.
public short[][] holeSpielfeld()
Liefert das aktuelle Spielfeld zurück.
- MeisterImpl.java
Das Computerspieler-Objekt.
Die öffentlichen Methoden:
public short besterZug(short spieler, short[][] feld)
Untersucht das Spielfeld feld und liefert den besten Zug für den Spieler zurück, dessen Nummer in spieler übergegeben wird.
public void spielstaerke(int maxZeitMillis)
Legt die Spielstärke des Computerspielers fest. Als Eingabe wird die Zeit erwartet, die der Computerspieler zum Überlegen brauchen darf (genauer: Der Computerspieler überlegt insgesamt genau maxZeitMillis * 7/3).
- Client.java
Das Clientprogramm.
Die main-Methode sucht zunächst einen Partie-Manager und zeigt dann folgendes Menü:
1) Partie spielen
2) Computergegner starten (Java)
4) Computerbedenkzeit einstellen
5) Partien auflisten
7) Ende
(Fehlende Nummern werden in den folgenden Aufgaben ergänzt.)
Beim Anwählen der Menüpunkte passiert folgendes:
1) und 2):
Die private Methode private static void spielen(String partieName, int spielerTyp) wird aufgerufen.
Diese Methode erwartet als Argumente den Namen der Partie, die gespielt werden soll, sowie einen Spielertyp, der besagt, ob der Client während des Spiels die Spielzüge der Tastatur entnehmen oder ob er in jeder Runde den Computerspieler nach dem besten Zug fragen soll.
Beim Aufruf von spielen passiert folgendes:
1. Bei Bedarf (Spielertyp > 1) sucht der Client einen Computerspieler und stellt mittels dessen spielstaerke-Methode die unter Menüpunkt 4) gewählte Spielstärke ein.
2. Der Client ruft die Methode spielen des Partie-Managers auf und erhält von diesem ein Spielpartie-Objekt.
3. Der Client ruft die init-Methode der Spielpartie auf und erhält so Spielernummer und Ticket.
4. Innerhalb einer Schleife wird der Status der Spielpartie abgefragt und -wenn der Client an der Reihe ist- ein Spielzug ausgeführt.
4):
In einer Variable wird die gewählte Spielstärke gespeichert. In der spielen-Methode wird diese Variable -beim Spiel mittels Computerspieler- ausgewertet.
5):
Die auflisten-Methode des Partie-Managers wird aufgerufen und der zurückgelieferte String ausgegeben.
- Server.java
Wir wissen, daß jedes Objekt ins Implementation Repository eingetragen werden muß und daß für die Aktivierung der Objekte gesorgt werden muß.
Da wir der Einfachheit halber Partie-Manager und Computerspieler auf einem Rechner laufen lassen, erledigen wir dies für beide Objekte in einem einzigen Serverprogramm.
Dieses Programm initialisiert den ORB und den BOA, instanziiert die beiden Objekte und aktiviert sie mit Hilfe des BOAs und wartet dann auf eingehende Anfragen.
Die Java-Klassen sind zusammengefaßt in den Packages ClientAufg1 und ServerAufg1. Ein drittes Package VierGewinnt wird beim Compilieren der IDL-Datei generiert.
Die Package-Dokumentationen zu allen drei Packages finden Sie