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:
| Beispiel | Was du lernst | Ausführen |
|---|---|---|
hello_bot.py | Abbauen (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ölkern | python tools/play.py --bot brains/examples/hello_bot.py |
rush_bot.py | Kaserne 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.py | Bauplan + 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:
| Schicht | Ort | Takt | Aufgabe |
|---|---|---|---|
| Strategie-Schicht | strategy/ | Sekunden | Wahl und Wechsel zwischen mehreren Strategien im AMAI-Stil, Baupläne, Konter-Einheiten, Heldenwahl; optional ein LLM-Strategie-Coach |
| Reflex-Schicht | reflex/ (4 eigenständige Prozesse) | ~100 ms | Überleben, Zaubern, Fokusfeuer, Gegenstände aufsammeln |
| Siegmodell | worldmodel/ | — | 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.