Frequently Asked Questions [Allgemeines zum Turnier] [Implementierung eigener Spieler]


Index

Q1: Wie starte ich meine Implementierung? Gibt es eine Methode main()?
Q2: Wie "linke" ich meine Implementierung mit dem Monitor?
Q3: Wie erzeuge ich aus GameBoard ein Array int[8][8]?
Q4: Wie erzeuge ich aus GameBoard ein Array int[64]?


Q1: Wie starte ich meine Implementierung? Gibt es eine Methode main()?
A: Der Monitor "startet" Eure Implementierung. Es gibt keine Methode main(), die Ihr explizit aufrufen müsst. Für eine ausführliche Beschreibung wie das Zusammenspiel zwischen Eurer Implementierung und dem Monitor funktioniert, siehe Q2.

Q2: Wie "linke" ich meine Implementierung mit dem Monitor?
A: Gar nicht! Der Monitor lädt Eure Implementierung dynamisch nach. D.h. er instanziert ein Objekt Eurer Klasse und ruft auf diesem Objekt die Methoden initialize() und nextMove() auf. Es ist weder ein explizites Linken, noch eine Methode public static main() notwendig!

Hier eine technische Beschreibung, für die, die es genau wissen wollen (das Verständnis dieser Beschreibung ist nicht wichtig für das Implementieren eigener Spieler!): Wenn Ihr den Monitor mit

java reversi.Monitor player1 player2
startet, sucht er nach einer Datei mit Namen player1.class im Unterverzeichnis player1, also player1/player1.class. Analoges gilt für player2. In der Datei player1.class muss eine Klasse definiert sein, die
  1. player1 heisst,
  2. das Interface ReversiPlayer implementiert und
  3. im package player1 liegt.
In dem Verzeichnis, in dem Ihr den Monitor startet, muss es also ein Unterverzeichnis player1 geben, dass die Klasse player1 und alle von dieser Klasse benutzten Klassen enthält. Alle von player1 benutzten Klassen müssen ebenfalls im package player1 liegen.
Findet der Monitor eine solche Klasse, instanziert er ein Objekt dieser Klasse. Wie das genau vor sich geht erfahren Interessierte in der Implementierung der Methode initPlayers() der Klasse ReversiGame, die Teil des Monitors ist und im Verzeichnis reversi Eurer lokalen Installation liegt.
Hat er das Objekt erst erzeugt, ruft er auf ihm die Methode initialize() auf. Das kann natürlich nur funktionieren, wenn der Monitor im Vorhinein weiss, dass es eine solche Methode gibt. Das ist auch der Grund, warum es zwingend Notwendig ist, dass Eure Klasse das Interface ReversiPlayer implementiert.

Q3: Wie erzeuge ich aus GameBoard ein Array int[8][8]?
A: So zum Beispiel:
    public Coordinates nextMove( GameBoard gb ) {

        // sanity check
	size = gb.getSize();
        if (size != 8) {
            // error!
            System.out.println("Invalid GameBoard passed to nextMove()");
            return;
        }
  
        int[][] array = new int[8][8];

	// map GameBoard gb to int [8][8]
	try {
	    for( int i = 0; i < size; i++ ) {
		for(int j = 0; j < size; j++) {
		    array[i][j] =
			gb.getPosition( new Coordinates(i+1,j+1) );
		} // end inner for
	    } // end outer for
	} catch ( Exception e ) {
	    System.out.println( "Error mapping the GameBoard gb to int[8][8]." );
	    System.out.println( e.getMessage() );
	    e.printStackTrace();
	    return null;
	}

        // Coordinates coords = ...
        // ...

	return coords;
    } // end nextMove()
       
Q4: Wie erzeuge ich aus GameBoard ein Array int[64]?
A: So zum Beispiel:
    public Coordinates nextMove( GameBoard gb ) {

        // sanity check
	size = gb.getSize();
        if (size != 8) {
            // error!
            System.out.println("Invalid GameBoard passed to nextMove()");
            return;
        }
  
        int[] array = new int[64];

	// map GameBoard gb to int [64]
	try {
	    for( int i = 0; i < size; i++ ) {
		for(int j = 0; j < size; j++) {
                    // careful! might be i+j*8 in your representation!
		    array[i*8+j] =
			gb.getPosition( new Coordinates(i+1,j+1) );
		} // end inner for
	    } // end outer for
	} catch ( Exception e ) {
	    System.out.println( "Error mapping the GameBoard gb to int[64]." );
	    System.out.println( e.getMessage() );
	    e.printStackTrace();
	    return null;
	}

        // Coordinates coords = ...
        // ...

	return coords;
    } // end nextMove()
       



Contact kasten@inf.ethz.ch with questions or comments regarding this page.
Last modified: Thu Jun 15 16:28:01 MEST 2000