ETH Zurich :
Computer Science :
Pervasive Computing :
Distributed Systems :
Education :
I2 HS2009 :
Reversi
Reversi
Reversi-Turnier
Das Reversi-Turnier fand am Mittwoch, 27.05.2009, von 12:30 Uhr bis 15:30 Uhr in der Semper Aula (HG G60) statt.
Resultate gibt es hier
Vielen Dank an die Helfer, die Teilnehmer und an die Zuschauer!
Preise
1. Preis |
Je ein iPod Shuffle |
|
2. Preis |
Je ein 4- Kanal R/C UFO |
|
3. Preis |
Je ein Micro R/C UFO |
|
Zusätzlich verlosen wir unter allen Teilnehmern einen weiteren iPod Shuffle!
Wettkampfbedingungen
Technisch müssen die Programme die nachfolgend genannten Bedingungen erfüllen.
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 sonst der Spieler disqualifiziert wird.
Ausserdem wird ein
Mindestmass an Kooperation verlangt, um den technischen Ablauf eines
Spiels nicht zu gefährden:
- Die Zugdauer beträgt 5 Sekunden, der für Ihren Spieler verfügbare Speicher 128 MB.
- Es sind keine zusätzlichen Threads erlaubt, die Priorität des gegebenen Threads darf nicht verändert werden.
- Um einen störungsfreien Ablauf des Turnier zu gewährleisten, dürfen die Spieler
keine GUI-Elemente verwenden (wie z.B. Fenster öffnen) oder die System-Streams (System.in, System.out, System.err)
umleiten. Textausgabe auf die Konsole ist jedoch erlaubt.
- "Unfaires" Verhalten, wie z.B. Netzwerkzugriffe, exzessive
Berechnungen während des Konstruktors bzw. des initialize()-Aufrufs oder
Manipulationsversuche führen zum Ausschluss vom Turnier.
Einsendungen
Wer selbst mit einem Programm teilnehmen möchte, muss dieses bis spätestens
Sonntag, den 24.5.2009, 23:59 Uhr (Zürich Time!) per Mail an
Matthias Kovatsch schicken. Dabei müssen Sie folgendes beachten:
- Teilnehmen können Sie entweder alleine oder im Zweierteam. Alle Teammitglieder müssen jedoch dieses Semester
die Vorlesung "Informatik II für ITET" belegt haben.
- 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!
- Alle Programmteile müssen in einem eigenen Package untergebracht sein (also nicht im Reversi-Package!)
- Alle Programmteile müssen sich mit Java 1.5.0 übersetzen und ausführen lassen.
- Zitieren ist erlaubt - Abschreiben nicht:
Falls Sie Teile Ihres Quellcodes von anderen Spielern kopiert haben, so müssen Sie das
im Quellcode kenntlich machen. Anderenfalls ist das ein Disqualifikationsgrund.
- Ihr Spieler muss eine eigene Leistung erkennen lassen, um am Turnier
teilnehmen zu können - Sie können also nicht einfach einen RandomPlayer abgeben!
Bitte senden Sie unter Angabe des Paket- und Klassennamens den Quellcode zusammen mit
den kompilierten Klassen im entsprechenden Unterverzeichnis in einem (tar-,
zip- oder gz-) Archiv. Nennen Sie bitte in der E-Mail den Vor- und Nachnamen
der Autoren und tragen Sie als Betreff ''Reversispieler'' ein.
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 Gruppensieger oder die zwei
Gruppenersten kommen in die Finalrunden, in denen dann nach dem K.O.-System
gespielt wird. Den Autoren der besten Programme winken
spannende Sachpreise.
Die Vorrunden und die Finalspiele werden auf ca. vier PCs / Notebooks
ausgetragen. Diese können sich bezüglich Prozessortakt und
Speicherausbau unterscheiden. Die Fairness ist dennoch gewährleistet, da die beiden
Kontrahenten natürlich auf ein und demselben Rechner ausgeführt
werden. Es ist aber wichtig, dass Ihr Programm bzgl. des Zeitlimits
flexibel reagiert, Sie können nicht davon ausgehen, dass die Computer
neueste Gigahertztaktraten erreichen - die Vorrunde könnte auch auf
einem langsameren Rechner stattfinden.
Die Zeit, die pro Zug zur Verfügung steht, beträgt 5
Sekunden. Wenn ein Programm dieses Limit überschreitet oder einen
ungültigen Zug durchführt, gilt das Spiel als verloren.
Regeln
Es gibt verschiedene Varianten dieses einfachen Spieles. Wir verwenden
die folgenden Regeln: reversi-spielregeln.pdf
Reversi-Arena
Für das Turnier 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
Wichtig: Für das Reversi-Turnier benötigen Sie Java Version 1.5.0. Falls
Sie mit einer neueren Version arbeiten, so müssen Sie sicherstellen, dass Ihr Code mit
Java 1.5.0 kompiliert und die .class-Dateien
binärkompatibel zu Java 1.5 sind! Ihre Java-Version können Sie
mit dem Befehl java -version feststellen.
Fall sie Eclipse verwenden, gehen sie am einfachsten nach dieser Anleitung vor.
Ansonsten laden Sie sich die neuste Version des Reversi-Paketes von dieser
Webseite herunter (siehe Software). Wechseln Sie in ein
beliebiges Verzeichnis und entpacken Sie den Inhalt der Datei mit dem
Kommando gtar xvfz reversi-X.Y.Z.tgz bzw. unzip
reversi-X.Y.Z.zip (X, Y und Z sind dabei
durch die entsprechenden Versionsnummer zu ersetzen). Der Inhalt des Archivs
wird dabei in ein Verzeichnis mit dem Namen reversi-1.2.2 entpackt.
Wechseln Sie in dieses Verzeichnis.
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 einliest.
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 Computerspieler.
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 Computerspieler 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 Kompilieren Ihres eigenen Spielers rufen Sie den Compiler wie
folgt auf:
javac -classpath . mypackage/*.java
Das setzt natürlich voraus, dass es ein Unterverzeichnis mypackage gibt, in dem
Ihre Spielerklasse abgelegt ist!
Ein Spiel starten
Aufrufsyntax des Programms Arena:
java -classpath . reversi.Arena [options] GameName package1.myclass1 package2.myclass2
Der obige Aufruf startet ein Spiel zwischen den beiden 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
Tipps
- 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
-classpath /usr/james/java angegeben werden.
- In eine Java-Klasse, die Klassen aus einem anderen Package
benutzt, müssen diese Klassen per
import
eingebunden 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
Das Reversi-Paket enthält alle für die Reversi-Aufgaben benötigten Klassen und
Interfaces inklusive Dokumentation. Es gibt zwei Versionen des Pakets: Die erste (1.2.2) ist für die
Serie 7 gedacht und enthält nicht alle Quellen. Die zweite Version (1.4.2) enthält dann alle
benötigten Quellen und kommt ab der Serie 8 zum Einsatz.
Hinweise
Downloads
Aktualisierte Version ab der Serie 8: Entpacken Sie die neuen Dateien in Ihr vorhandenes Projekt und überschreiben Sie die alten Dateien.
Probleme
Bei Problemen mit der Reversi-Distribution gehen Sie bitte nach folgender Eskalationsstrategie vor:
- Konsultieren Sie die Dokumentation (1.4.2).
- Wenden Sie sich per Email an Ihren Betreuer.
- Wenden Sie sich per Email an Matthias Kovatsch.
Bekannte Probleme:
- Unter Ubuntu 8.10 mit Gnome wurden Probleme mit dem X-Server festgestellt, die nicht direkt vom Reversi-Framework ausgelöst werden.
Bisher ist leider keine Lösung – ausser auf ein anderes System umzusteigen – bekannt.
- Ebenfalls unter Ubuntu 8.10 mit Gnome kann es zum Einfrieren des Spielfeldes nach folgender Meldung in der Konsole kommen: server thread is waiting for connections.
Als Workaround kann in der Arena.java die Zeile 130 (server_thread.start();) auskommentiert werden.
- Die Linux-Paketmanager installieren meist die alte Eclipse-Version 3.2.x. Diese unterstützt die .launch-Dateien noch nicht und bringt auch ein paar weitere Probleme mit sich.
Installieren Sie die aktuelle Version 3.4 "Ganymede", die Sie unter http://www.eclipse.org/downloads/ finden (Eclipse IDE for Java Developers).
Literatur
Der Zugriff auf die unten angegebenen Dokumente ist passwortgeschützt. Bitte fragen Sie
Ihren Übungsgruppenleiter nach Benutzernamen und Passwort. Bei Problemen können Sie sich
an Philipp Bolliger wenden.
|