Small logo of ETH main building ETH Zurich : Computer Science : Pervasive Computing : Distributed Systems : Education : I2 SS2003

Reversi

Das Turnier

Das Reversi-Turnier hat am Mittwoch den 2.7.03 von 13:00 bis 15:00 Uhr im Raum IFW D42 stattgefunden. Die Ergebnisse des Turniers gibt es hier.

Wettkampfbedingungen

Technisch müssen die Programme die Bedingungen erfüllen, die im Laufe der Übungen vorgegeben wurden. Die Spielqualität selbst hat keinen Einfluss darauf, ob das Programm teilnehmen kann oder nicht. (Aber natürlich aller Voraussicht nach auf die Platzierung.) Selbstverständlich müssen die Reversi-Spielregeln eingehalten werden, da nur so ein sinnvolles Spiel möglich ist. Ausserdem wird ein Mindestmass an Kooperation verlangt, um den technischen Ablauf eines Spiels nicht zu gefährden.

Einsendungen

Wer selbst mit einem Programm teilnehmen möchte, sollte es bis Montag, 30. Juni per Mail an oliver.kasten@inf.ethz.ch einreichen. Alle Programmteile müssen in Java geschrieben sein und sowohl im Quellcode als auch als übersetzte Klassendateien abgegeben werden. Einsendungen ohne vollständigen Quellcode können nicht teilnehmen! Bitte sendet unter Angabe des Paket- und Klassennamens den Quellcode zusammen mit den compilierten Klassen im entsprechenden Unterverzeichnis in einem (tar-, zip- oder gz-)Archiv.

Ermittlung des Siegers

Die genauen Wettkampfmodalitäten, also das System, nach dem der Sieger ermittelt wird, hängen von der Anzahl der Teilnehmer ab und werden vor Beginn des Turniers angekündigt. Typischerweise gibt es 2-4 (abhängig von der Anzahl der Einsendungen) parallel durchgeführte und zufällig ausgeloste Vorrunden. Jeweils die beiden Sieger kommen in die Finalrunden. Den Autoren der besten Programme winken kleine Sachpreise.

Die Vorrunden und die Finalspiele werden auf vier Linux-PCs ausgetragen. Alle vier unterscheiden sich bezueglich Prozessortakt und Speicherausbau. Die Fairness ist dennoch gewährleistet, da die beiden Kontrahenten natuerlich auf ein und demselben Rechner ausgeführt werden. Die Zeit, die pro Zug zur Verfügung steht, beträgt 5 Sekunden. Wenn ein Programm dieses Limit überschreitet, gilt das Spiel als verloren.

Regeln

Es gibt verschiedene Varianten dieses einfachen Spieles. Wir verwenden die folgenden Regeln: .ps .pdf

Die Reversi Arena

Ab dem 6. Übungsblatt startet eine Serie, die zum Ziel hat, das Spiel Reversi zu implementieren. Gegen Ende des Semesters wird ein Turnier stattfinden, bei dem die Programme gegeneinander antreten. Dazu haben wir ein Programm namens Arena entwickelt, welches es ermöglicht, Reversi-Computerspieler gegeneinander antreten zu lassen. Dieses Programm und weitere Klassen für Ihre Computerspieler mit dazugehöriger Dokumentation befinden sich in einem Paket, welches Sie bei sich lokal installieren müssen.

Installation

Laden Sie sich die neuste Version des Reversi-Paketes von dieser Webseite (siehe Software Downloads unten). Wechseln Sie in ein beliebiges Verzeichnis und entpacken Sie den Inhalt der Datei mit dem Kommando gtar xvfz reversi-X.Y.tgz bzw. unzip reversi-X.Y.zip (X und Y sind dabei mit der entsprechenden (Unter-) Versionsnummer zu ersetzen).

Im aktuellen Verzeichnis befinden sich jetzt die Unterverzeichnisse reversi, humanPlayer und javadoc. Das Verzeichnis reversi enthält das Paket reversi mit Klassen und Interfaces, die wir für alle weiteren Reversi-Aufgaben bis zum Ende des Semesters benutzen werden. Es enthält weiterhin das Program Arena, welches es erlaubt, die von Ihnen in dieser und in zukünftigen Aufgaben entwickelten Reversi-Computerspieler gegeneinander antreten zu lassen. Im Verzeichnis javadoc befindet sich die Dokumentation zum Reversi-Paket im HTML-Format.

Das Verzeichnis humanPlayer enhält einen "Computerspieler" HumanPlayer, der seine Züge berechnet, indem er sie über die Tastatur einliesst.

Testen Sie die Installation, indem Sie folgendes Kommando auf der Kommandozeile eingeben:

  java -classpath . reversi.Arena -t 0 IchGegenMich humanPlayer.HumanPlayer humanPlayer.HumanPlayer
Erzeugen Sie ein weiteres Unterverzeichnis mit einem Namen Ihrer Wahl für Ihren eigenen Cumputerspieler.

Eigene Spieler

Damit es möglich wird, automatisch verschiedene Reversi-Computerspieler gegeneinander antreten zu lassen, müssen die von Ihnen zu Implementierenden Computerspieler gewisse Anforderungen erfüllen.

Ihre Spielerklasse muss das Interface ReversiPlayer aus dem Paket reversi implementieren. Wenn ein Computrspieler an der Reihe ist, wird die Methode nextMove() aufgerufen. Sie hat einen Parameter vom Typ GameBoard, der die aktuelle Version des Spielbretts enthält. Geben Sie Ihren Zug in einem Coordiantes-Objekt zurück. Die linke obere Ecke des Spielfeldes entspricht Coordiantes(1,1), die rechte untere Ecke Coordinates(8,8).

Die Arena erlaubt es, einen Computerspieler gegen sich selbst spielen zu lassen. Achten Sie deshalb darauf, dass Ihre Implementierung keine static-Attribute enthält, da diese Attribute sonst für beide Instanzen (den roten und den grünen Spieler) identisch sind!

Zum Compilieren Ihres eigenen Spielers rufen Sie den Compiler wie folgt auf:
 javac -classpath . mypackage/*.java 
Das setzt voraus, dass es ein Unterverzeichnis mypackage gibt!

Ein Spiel starten

Aufrufsyntax des Programms Arena:
  java -classpath . reversi.Arena [options] GameName package1.myclass1 package2.myclass2

Der obige Aufruf startet ein Spiel zwischen zwei Computerspielern package1.myclass1 und package2.myclass2. Dabei bezeichnet myclassX die Klasse, die das Interface ReversiPlayer implementiert. packageX bezeichnet das Package, in dem die Spielerklasse implementiert ist.

GameName ist ein beliebiger Name für das Spiel. Der Name wird beim Schreiben von Spielinformationen in eine Log-Datei verwendet. Das erlaubt das spätere Wiederfinden von einzelnen Spielen in einer Log-Datei, die mehrere Spiele enthält.

Folgende Optionen können verwendet werden:
  -?            Hilfe anzeigen
  -t timeout    Zeit in Millisekunden, die jeder Spieler brauchen darf
  -d delay      Verzögerung zwischen Zügen; wichtig nur zur Animation
  -e exittime   Verzögerung, bis das Programm nach Spielende stoppt
  -l logfile    Name der Log-Datei für das Protokollieren des Spiels
  -s            keine graphische Oberfläche anzeigen

Tips

  • Die Klassen in einem Package müssen immer in einem Verzeichnis liegen, das den gleichen Namen wie das Package hat. Die Klassen eines Package p müssen also im Verzeichnis p liegen.
  • Im Klassenpfad (-classpath) muss das Verzeichnis oberhalb von p angegeben werden, damit das Package (Verzeichnis) p gefunden wird. Beispiel: im Verzeichnis /usr/james/java/beisser liegt das Package beisser. Als Klassenpfad muss dann angegeben werden -classpath /usr/james/java.
  • In eine Java-Klasse, die Klassen aus einem anderen Package benutzt, müssen diese Klassen per import eingeführt werden. Beispiel:

    package subway;
    // eigene Klasse

    import beisser.*;
    // import all classes from package beisser
    import beisser.tomorrow.*; // import all classes from package beisser.tomorrow
    import phantasy.Cloud;
    // import class Cloud from package phantasy

    public class Subway extends Cloud { ...

  • Statt Packages zu importieren, kann man im Code auch jedesmal den vollen Klassennamen angeben, z.B.

    public class Subway extends phantasy.Cloud { ...

Software Downloads

Nicht verfügbar.

Literatur

  • Kai-Fu Lee, Sanjoy Mahajan: The Development of a World Class Othello Program, Artificial Intelligence 43 (1990).
  • Martin Hirt et al, Einführung in die Spieltheorie (educETH, 1999). (Lokale Kopie im PDF-Format.)
ETH ZurichDistributed Systems Group
Last updated June 20 2023 01:44:54 PM MET ok