Computational-Intelligence

News-Archiv

Implementierung eines eigenen Spielers

Um ein Programm als Spieler zu nutzen, muss es in Java implementiert und von der Klasse algds.Player abgeleitet sein. Es ist verboten, eigene Threads zu benutzen, es sei denn, man kann es begründen und der Thread wird spätestens mit dem Ende der play()-Methode beendet.

Mithilfe der algds.Player-Methoden können alle nötigen Informationen zum Spielstand ermittelt werden. Die Klasse implementiert das Interface algds.Constants, das Konstanten festlegt, die von etlichen Methoden in algds.Player als Rückgabewerte genutzt werden. Die Konstanten können direkt genutzt werden, d.h. man muss nicht folgendes schreiben: if (getAction() == Constants.SET_MAN) ... Es reicht das Folgende zu schreiben: if (getAction() == SET_MAN) ...

Zwei Methoden in algds.Player müssen von jedem Spieler implementiert werden:

  • getAuthor() gibt den Namen des Entwicklers des Spielers zurück.
  • play() wird aufgerufen, wenn der Spieler an der Reihe ist und muss mit der Ausführung eines Spielzugs enden.

Das Gerüst des Programms sieht wie folgt aus (MyPlayer steht für den Namen eures Spielers):

    package player.myplayer;

    import algds.Player;

    public class MyPlayer extends Player {

        public void play() {
          // hier führt das Programm einen Spielzug aus
        }

        public String getAuthor() {
            return "Vorname Nachname";
        }

    }		

Die Methode play() wird immer aufgerufen, wenn der Spieler an der Reihe ist. Jedes Programm hat zwei Minuten Zeit, den nächsten Spielzug zu berechnen und auszuführen. Danach muss die play()-Methode beendet sein. Jedes Programm hat danach Pause bis zum nächsten Spielzug.

Schließt ein Spieler mit einem Spielzug eine Mühle, wird seine play()-Methode erneut aufgerufen, um einen gegnerischen Stein zu entfernen. Mehrere Spielzüge hintereinander auszuführen ist nicht erlaubt!

Mögliche Spielzüge sind:

  • setMan(int to) setzt einen Stein auf das Spielbrett an Position to.
  • moveMan(int to, int from) bewegt einen Stein auf dem Spielbrett von Position from nach Position to (springt auch, wenn der Spieler nur noch drei Steine hat).
  • removeMan(int from) nimmt einen Stein des Gegners an Position from vom Spielbrett, nachdem eine Mühle geschlossen wurde.

Als Beispiel für einen Spieler ist die Klasse Walter im Unterverzeichnis "player" gegeben. Sie beachtet (fast) alle Regeln des Spiels, verfolgt aber keine Strategie.

Spielfeld

Das Spielfeld ist als eindimensionales Array der Länge 24 (Indices 0 bis 23) gespeichert. Position 0 ist außen links oben. Von da aus wird im Uhrzeigersinn auf einem Ring und von außen nach innen gezählt.

Ob zwei Spielsteine auf dem gleichen Ring (also Quadrat auf dem Spielfeld) liegen, kann man ermitteln, indem man ihre Indices durch 8 teilt. Ob zwei Spielsteine auf einer Linie aber unterschiedlichen Ringen liegen, kann man ermitteln, indem man ihre Indices modulo 8 rechnet.

Kompilieren

Aus dem "muehle"-Verzeichnis heraus kann der Spieler wie folgt kompiliert werden:

  • unter Windows: javac -classpath muehle.jar;. player/MyPlayer.java
  • unter UNIX: javac -classpath muehle.jar:. player/MyPlayer.java

Der Unterschied liegt im Semikolon unter Windows und dem Doppelpunkt unter UNIX.

Dateistruktur

Es muss ein Package mit dem Namen des Spielers angelegt werden, das außer einer Startklasse alle nötigen Dateien enthält. Die Startklasse (als .java und .class) und das Package werden im "player"-Verzeichnis abgelegt. In das Package gehören die java- und class-Dateien sowie die Dokumentation im pdf-Format. Für alle java-Dateien im Package lautet die erste Zeile package myplayer;. Der Package-Name sollte klein geschrieben werden.

Ein Beispiel für eine Dateistruktur im "player"-Verzeichnis könnte wie folgt aussehen:

    MyPlayer.java
    MyPlayer.class
    myplayer/MyPlayer.java
    myplayer/MyPlayer.class
    myplayer/Hilfsklasse1.java
    myplayer/Hilfsklasse1.class
    myplayer/Hilfsklasse2.java
    myplayer/Hilfsklasse2.class
    myplayer/dokumentation.pdf

Die Startklasse player.MyPlayer leitet nur an die eigentliche Klasse player.myplayer.MyPlayer im Package player.myplayer weiter und sieht wie folgt aus:

    package player;

    public class MyPlayer extends player.myplayer.MyPlayer {}
en lang icon de lang icon Printable View - Recent Changes
Page last modified on April 09, 2010, at 02:22 PM by cmoewes