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:
this.getRing(int)
: gibt einen Java-Iterator zurück, der alle Karten auf einem Hexagon-Kreis umthis
, mit dem Radiusint
, enthält.this.getArea(int)
: gibt einen Java-Iterator zurück, der alle Karten auf einer Hexagon-Fläche umthis
, mit dem Radiusint
, enthält.- mit den Methoden
.add
,.sub
,.mul
,.div
,.neg
können normale Vektor-Operationen berechnet werden.
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 return
en.
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.
BuildArea
getBuildArea()
- Gibt ein Objekt mit allen Informationen über die Baufläche zurück.Hand
getHand()
- Gibt ein Objekt mit allen Karten auf der Hand zurück.Map
getMap()
- Gibt ein Objekt mit allen platzierten Karten zurück.Metrics
getRedrawCosts()
- Gibt ein Objekt zurück, welches die aktuellen Kosten zum Nachziehen beinhaltet.double getRedrawTime()
- Zeit in Sekunden, bis das nächste Mal kostenlos nachgezogen werden kann.Metrics
getResources()
- Gibt ein Objekt zurück, welches deine aktuelle Menge an Ressourcen beinhaltet.Metrics
getResourcesRate()
- Gibt ein Objekt zurück, welches beinhaltet, wie viele Ressourcen du momentan pro Sekunde erhältst.Rewards
getRewards()
- Gibt ein Objekt zurück, welches alle Belohnung beinhaltet, die gerade eingesammelt werden können.int getRound()
- Aktuelle Runde. Beginnt mit 0. (UI fängt mit 1 an zu zählen.)double getRoundTime()
- Wie viel Zeit (in Sekunden) in der aktuellen Runde noch übrig ist.Metrics
getTargetResources()
- Gibt ein Objekt zurück, welches das aktuelle Ressourcenziel beinhaltet.
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 return
st, 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) {}
}
}