Anleitung

Die Dokumentation von Klassen und Methoden ist als Javadoc verfügbar.
Du kannst sie über deine IDE ansehen, wenn du die -full Variante nutzt. Alternativ kannst du dir die Dokumentation online ansehen.

Das Ziel der Java-Bot-Bibliothek ist es, dir das Entwickeln eines Bots so einfach wie möglich zu machen.
Sie bietet dir dazu hilfreiche Klassen zum Interagieren mit der Welt an.

Sie bietet auch die ChallengeBot und CreativeBot Klassen an, von denen deine eigene Bot-Klasse erben kann.
In der javabot Repository kannst du jeweils einen Beispiel-Bot finden.

CubeCoordinates

TerraTactician-Expandoria nutzt CubeCoordinates als Koordinatensystem.
Eine ausführliche Anleitung kannst du hier finden.

Die Bot-Bibliothek enthält eine CubeCoordiante Klasse, die dir den Umgang mit CubeCoordinates erleichtert.

Einige sehr nützliche Features:

ChallengeBot

Die ChallengeBot Klasse erlaubt es dir, Bots für Challenge-kompatible Spielmodi zu schreiben (Challenge Modus, die meisten Kampagnenlevel, Zen Modus).
Du kannst deinen Code in die executeTurn Methode tun. Diese wird einmal pro Sekunde aufgerufen.
Nachdem die Methode aufgerufen wurde, hast du 40 ms Zeit um eine Aktion festzulegen und zu returnen. Ansonsten gilt dein Zug als ungültig.

Du kannst den Controller nutzen, um deinen Zug zu festzulegen. Einige Beispiele:

@Override
public void executeTurn(World world, Controller controller) {
    // Platziert das erste Tile in der Hand an (0,0,0) ohne zu prüfen, ob das eine
    // valide Koordinate ist oder die Hand überhaupt Karten beinhaltet.
    // Du kannst mit `world.getHand().len()` wie viele Karten auf der Hand sind.
    // Mit `world.getBuildArea().contains(coord)` und `world.getMap().at(coord)`
    // kannst du prüfen ob das Feld noch frei ist und auf der Baufläche liegt.
    controller.placeTile(world.getHand().get(0), new CubeCoordinate(0, 0, 0));

    // Folgender Aufruf ist equivalent.
    controller.selectSlot(0);
    controller.placeTile(new CubeCoordinate(0, 0, 0));

    // Es ist auch möglich eine Karte wie folgt zu plazieren, wenn sie in der Hand ist:
    // Du kannst Karten anhand ihres Typs plazieren
    controller.placeTile(TileType.Wheat, new CubeCoordinate(0, 0, 0));
    // Wenn du direkt beim Plazieren Daten angeben willst, 
    // kannst du auch eine Klasse angeben
    controller.placeTile(new MarketplaceTile().withFoodRatio(0.5), new CubeCoordinate(0, 0, 0));
    
    // Karten können wie folgt wieder eingesammlt werden
    CubeCoordinate coord = /* ... */ ;
    // prüfe ob das Einsammeln möglich ist
    if (world.getMap().at(coord).takeable()) {
        // Karte einsammeln
        controller.takeTile(coord);
    }
    
    // Belohnung einsammeln
    controller.collectReward(/* coord */);
    
    // Karten nachziehen
    controller.redraw();

    // Marktplatz konfigurieren
    controller.configureMarket(/* coord */, /* food [0.0-1.0] */, /* materials [0.0-1.0] */);
}

Nötige Informationen erhältst du aus: World.

CreativeBot

Die CreativeBot Klasse hat weniger Einschränkungen als die ChallengeBot Klasse, kann aber nur genutzt werden, um Bots für den Kreativ-Modus zu schreiben.

Nachdem eine Verbindung zum Spiel hergestellt wurde, wird die startGame Methode aufgerufen.
Sobald du aus dieser returnst, wird die Verbindung zum Spiel getrennt.

In der Methode hast du die Möglichkeit, mit dem Spiel über den ConnectionHandler zu kommunizieren.

Dazu kannst du entweder Aktionen (Actions) senden:
(Eine Liste aller Aktionen kannst du in der Java-Dokumentation finden.)

public void startGame(ConnectionHandler conn) {
    conn.send(new PlaceAction(new WheatTile(new CubeCoordinate(0, 0, 0))));
}

Oder auf Events vom Spiel hören:
(Eine Liste aller Events kannst du in der Java-Dokumentation finden.)

public void startGame(ConnectionHandler conn) {
    conn.register(EventType.TileClicked, (Event evt) -> {
        TileClickedEvent event = (TileClickedEvent) evt;
        System.out.println(event);
    });
}

Da die Ausführzeit der startGame Methode nicht beschränkt ist, kannst du in ihr auch Ausführung verzögern.

public void startGame(ConnectionHandler conn) {
   CubeCoordinate.AreaIterator iter = new CubeCoordinate(0, 0, 0).getArea(10);

   while (running && iter.hasNext()) {
       conn.send(new PlaceAction(new WheatTile(iter.next())));
       try {
           // Wartet 2 Sekunden
           Thread.sleep(2000);
       } catch (Exception e) {}
   }
}