Docs Anleitungen

Beispiel-Bots

Vier Beispiele von einfach bis komplex – jedes sofort lauffähig, jeder Logikblock entspricht einer SDK-Fähigkeit. Dazu ein vollständiges Referenz-Brain.

Alle Beispiele liegen in brains/examples/. Jedes baut auf dem vorherigen auf und ergänzt nur Neues. Lies sie am besten der Reihe nach:

BeispielWas du lernstAusführen
hello_bot.pyAbbauen (5 pro Goldmine, bei voller Mine ab ins Holz), Arbeiter ausbilden (nur 1 in der Warteschlange), Nahrungsgebäude bauen, liegengebliebene Fundamente weiterbauen; läuft mit allen vier Völkernpython tools/play.py --bot brains/examples/hello_bot.py
rush_bot.pyKaserne und Altar (fehlen sie, per build_near bauen), Held zuerst (ist er tot, wiederbeleben), Fähigkeitspunkte sofort vergeben, eine Welle sammeln und per Angriffsbewegung losschicken… --bot brains/examples/rush_bot.py
macro_bot.pyBauplan + nach dem Bau selbst zurück zur Mine (Shift), Nahrungsengpass sofort beheben, Kasernen-Warteschlange mit 1 Einheit, Angriffs-/Rüstungs-Upgrades, Tier-Up und High-Tech-Einheiten, Ziel nach echter Laufdistanz wählen und dem Pfad folgen… --bot brains/examples/macro_bot.py --speed 200
micro_bot.pyÜbernimmt aufbauend auf dem Makro die Kämpfe: Fokusfeuer auf das Ziel, das am schnellsten fällt, Verwundete zurückziehen, Helden retten, nachts schaffbare Creep-Lager wählen, bei Angriffen auf die Basis zurückverteidigen; alle Befehle eines Ticks als ein Batch… --bot brains/examples/micro_bot.py --fair

In den Kommentaren von hello_bot und rush_bot stehen die Stolperfallen aus echten Spielen, etwa „jedes Mal wurde der erste Arbeiter zum Bauen geschickt – am Ende standen 3 halbfertige Farmen herum“ oder „die fest eingetragenen Kasernen-Koordinaten lagen mitten im Wald, nach 3 Minuten war keine einzige gebaut“. Die Kommentare bringen mehr als der Code.

hello_bot: Wirtschaft

# Volk -> (Arbeiter, Hauptgebäude, Nahrungsgebäude)
RACES = {
    "h": ("hpea", {"htow", "hkee", "hcas"}, "hhou"),
    "o": ("opeo", {"ogre", "ostr", "ofrt"}, "otrb"),
    "u": ("uaco", {"unpl", "unp1", "unp2"}, "uzig"),
    "e": ("ewsp", {"etol", "etoa", "etoe"}, "emow"),
}
MINE_CAP = 5            # max. 5 Arbeiter pro Goldmine (mehr bringt kein Einkommen)
LUMBER_CREW = 5         # Holzfäller: pro Mine 5 auf Gold + so viele aufs Holz = Arbeiterziel

Drei Aufgaben: Untätige Arbeiter bauen Gold ab (der Bot zählt selbst mit, wie viele an jeder Mine sind; ist eine Mine voll, geht es ans Holz); fehlen Arbeiter, werden welche ausgebildet (nur 1 in der Warteschlange); ist die Nahrung fast voll, baut ein Arbeiter, der nicht schon baut, ein Nahrungsgebäude neben dem Hauptgebäude (bei Menschen und Orcs werden außerdem liegengebliebene Fundamente weitergebaut).

rush_bot: Armee aufstellen und angreifen

Auf hello_bot kommen drei Dinge dazu: Fehlen Kaserne und Altar, werden sie gebaut; der Altar bildet einen Helden aus (ist er tot, zuerst wiederbeleben – Helden sind einzigartig), und Fähigkeitspunkte werden sofort vergeben; bei 8 Einheiten geht die ganze Armee per Angriffsbewegung auf das gegnerische Hauptgebäude los – ist sie aufgerieben, sammelt sie sich zu Hause neu. Befehle gehen nur an untätige Einheiten, damit Kämpfe nicht Tick für Tick unterbrochen werden.

macro_bot: Makro-Grundlagen

TECH = {
    "h": dict(order=["halt", "hbar", "hbla", "hlum"], altar="halt", hero="Hamg", skills=["AHwe", "AHbz", "AHab"],
              barracks="hbar", soldiers=["hfoo", "hrif", "hkni"], smith="hbla", upgrades=["Rhme", "Rhar", "Rhra", "Rhla"],
              tiers=["hkee", "hcas"]),
    ...
}

Die Dinge, die Profis in jedem Spiel tun, jeweils mit der passenden SDK-Fähigkeit: Bauplan + gather(..., queue="after"), damit Arbeiter nach dem Bau zurück zur Mine gehen; production().blocked erkennt Nahrungsengpässe; g.queue sorgt dafür, dass in der Kaserne nur 1 Einheit wartet; can_do fragt die Engine, ob die nächste Angriffs-/Rüstungsstufe erforschbar ist; Tier-Up und High-Tech-Einheiten (Lektion aus dem Live-Spiel: auf Tier 1 hängen geblieben, nach 23 Minuten von Rittern und Greifenreitern auf Tier 3 überrollt); Ziele per path_distance wählen und mit path() den Wegpunkten folgen.

micro_bot: wenn es zum Kampf kommt

def _fight(self, g, army, foes, home, now):
    ...
    visible = [e for e in foes if e.visible_to(me)]              # unsichtbare Ziele werden abgelehnt (1001)
    atk = [s for s in (g.stats(u) for u in fighters) if s]
    target = min(visible, key=lambda e: _ttk(g, atk, e))         # das Ziel, das am schnellsten fällt, nicht das nächste
    idle_or_other = [u for u in fighters if g.current_target(u) is None
                     or g.current_target(u).handle != target.handle]
    if idle_or_other:
        g.attack(idle_or_other, target)

Im Live-Spiel: 5 Minuten, 1497 Ticks, 3023 Befehle, 0 Fehler.

Referenz-Brain: eine vollständige KI

brains/xwar3/ ist eine vollständige KI, die expandiert, creept und angreift – aufgebaut in drei Schichten:

SchichtOrtTaktAufgabe
Strategie-Schichtstrategy/SekundenWahl und Wechsel zwischen mehreren Strategien im AMAI-Stil, Baupläne, Konter-Einheiten, Heldenwahl; optional ein LLM-Strategie-Coach
Reflex-Schichtreflex/ (4 eigenständige Prozesse)~100 msÜberleben, Zaubern, Fokusfeuer, Gegenstände aufsammeln
Siegmodellworldmodel/—Können wir den Kampf gewinnen? (Inferenz-Teilmenge)

Mehrere Prozesse teilen sich Einheiten über eine Claim-Tabelle; die Priorität entscheidet, wer das Sagen hat: Mensch 95 > Überleben 90 > Ausweichen 85 > Zaubern 80 > Gegenstände aufsammeln 70 > … > Strategie 50 > Arbeitsverteilung 45. Dein eigener Bot steht in der Tabelle als bot, mit Standardpriorität 50.

Das Referenz-Brain nutzt direkt die Low-Level-Schicht des SDK (w3cmd / act) und stützt sich stark auf Informationen über die ganze Karte. Es taugt als Ideenquelle, sollte aber nicht 1:1 von einem LLM kopiert werden. Es braucht AMAI-Daten: start.bat holt sie bei der ersten Installation aus dem öffentlichen AMAI-Repo und generiert sie (AMAI steht unter einer eigenen Lizenz, die generierten Dateien kommen nicht ins Git; hat das nicht geklappt, mit start.bat setup erneut versuchen).

Am einfachsten startest du das Referenz-Brain über die Farsight-Konsole: Auf der Seite „Instanzen & Start“ die Instanznummer ankreuzen und auf „Test starten“ klicken.