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
-
player1 heisst,
- das Interface ReversiPlayer implementiert und
- 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()
|