Einen Bot mit einem LLM schreiben
Geht auch ohne Programmierkenntnisse: Du beschreibst, wie gespielt werden soll, das LLM schreibt den Code. Prompt-Vorlage kopieren, Spielweise beschreiben, laufen lassen und nachbessern lassen.
Für alle, die Warcraft III spielen, aber nicht programmieren – und für Entwickler, die Zeit sparen wollen. Der ganze Ablauf ist ein Dialog: Du beschreibst die Spielweise → das Modell schreibt Code → du spielst eine Partie → du erzählst dem Modell, was passiert ist → es bessert nach.
Richte zuerst die Umgebung nach dem Schnellstart ein und bring hello_bot zum Laufen (die Bauern gehen Gold sammeln). So kannst du bei Problemen unterscheiden, ob es an der Umgebung oder am Bot liegt.
1. Material für das Modell vorbereiten
Wie gut das Modell schreibt, hängt zu achtzig Prozent davon ab, ob es das richtige Material gelesen hat. Wähle je nach Werkzeug eine Variante:
| Du nutzt | So gibst du das Material |
|---|---|
| Coding Agent mit Repository-Zugriff (Claude Code, Cursor, Codex usw.) | Im Repository-Verzeichnis öffnen und zuerst docs/BOT_HANDBOOK_ZH.md, docs/api.json und ein Beispiel lesen lassen (Wirtschaft: brains/examples/macro_bot.py, Kampf: micro_bot.py) |
| Chatmodell mit Internetzugang | Zuerst https://war3ai.com/llms-full.txt lesen lassen – die gesamte Dokumentation steckt in dieser einen Datei |
| Web-Chat ohne Internetzugang | Handbuch, api.json und eine Beispieldatei hinter den Prompt einfügen |
| Lokales Modell (LM Studio, Ollama) | Wie oben. Empfohlen ist ein Kontextfenster ab 32K Token, sonst passen Handbuch und API-Referenz nicht hinein |
Willst du eine bestimmte Profi-Technik, füge zusätzlich das passende Rezept aus dem Profi-Kochbuch ein.
2. Diesen Prompt kopieren
Ersetze am Ende „Meine Spielweise“ durch deine eigenen Worte – je konkreter, desto besser:
Du schreibst eine KI (Python) für Warcraft III 1.27. Verwende nur die Game-Methoden aus api.json,
erfinde keine Methoden, die es nicht gibt. Orientiere dich an rush_bot.py: von openwar3.Bot erben, on_start(g) und on_tick(g) implementieren.
Regeln:
- on_tick wird etwa 5-mal pro Sekunde aufgerufen und muss schnell sein (kein sleep darin).
- Nicht lesbare Werte sind None, nicht 0 – vor der Verwendung prüfen.
- Jeder Befehl liefert eine Quittung (Receipt); `if r:` heißt "die Engine hat angenommen"; wenn nicht, steht in `r.reason` der Grund
(nicht genug Nahrung, nicht genug Gold, Ziel nicht sichtbar, diesen Helden gibt es schon …) – im nächsten Tick erneut versuchen oder anders vorgehen.
- Einen bestimmten Gegner greifst du mit g.attack(truppen, gegner) an; der Gegner muss in Sicht sein, Unsichtbares wird abgelehnt.
- Tote Helden werden mit g.revive(altar) wiederbelebt, nicht neu trainiert.
- Gebäude baust du mit g.build_near(arbeiter, gebäudecode, x, y): Es sucht selbst einen freien Platz, verfolgt das Ergebnis und tut nichts, wenn das Geld nicht reicht.
- Um zu erfahren, "was gerade passiert ist" (wer gestorben ist, wer Schaden nimmt, Heldenstufe gestiegen, Gegenstand fallen gelassen), implementiere on_event(g, ev).
- Gib derselben Einheit nicht jeden Tick denselben Befehl erneut (das unterbricht, was sie gerade tut); gib nur "untätigen" Einheiten Befehle.
- Zum Sammeln nur Arbeiter aus idle_workers() einteilen. Höchstens 5 Arbeiter pro Goldmine.
- In die Trainingswarteschlange nur 1 Eintrag (erst nachlegen, wenn g.queue(gebäude) leer ist); ob die Nahrung blockiert, zeigt g.production(gebäude).blocked.
- Viele Befehle in einem Tick in with g.batch(): packen (nur einmal auf den Spiel-Thread warten).
- Wen du angreifst, entscheidest du mit g.time_to_kill(meine_gruppe, gegner) (berücksichtigt Konter und Rüstung); wohin du gehst, mit g.path_distance (unerreichbar = None).
- Im Fair-Modus ist nur sichtbar, was in Sichtweite ist; früher gesehene Gegner liefert g.last_seen().
- Einheiten werden als Vier-Zeichen-Codes angegeben (Bauer der Menschen hpea, Fußsoldat hfoo, Kaserne hbar …), Zauber über Order-Strings (thunderbolt Sturmblitz,
blizzard Blizzard, holybolt Heiliges Licht …, vollständige Liste in data/order-ids.txt), das Erlernen von Fähigkeiten über Vier-Zeichen-Codes (AHtb, AHbz …).
Meine Spielweise:
<Hier in Alltagssprache beschreiben, zum Beispiel:
"Menschen, zu Beginn 5 Bauern auf Gold und 1 auf Holz; zuerst der Erzmagier; zwei Kasernen für Fußsoldaten und Büchsenschützen;
bei 12 Einheiten mit dem Helden die gegnerische Expansion angreifen; fällt der Held unter 30 % TP, zurück zur Basis;
beim Creepen zuerst die Lager nahe der Basis.">
So beschreibst du die Spielweise klar
Vage Anforderungen sind für das Modell das größte Problem. Statt „spiel aggressiver“ helfen diese Angaben viel mehr:
- Volk und Helden: welcher Held zuerst, in welcher Reihenfolge er Fähigkeiten lernt (z. B. Erzmagier: Wasserelementar, Blizzard, Wasserelementar …).
- Bauabfolge: beim wievielten Bauern die Kaserne, wann der Tier-up, wie viele Kasernen.
- Armeezusammensetzung: Fußsoldaten + Büchsenschützen? Ab welcher Anzahl geht es los?
- Angriff und Rückzug: ab wie vielen Einheiten angreifen, unter wie viel TP sich der Held zurückzieht, nach schweren Verlusten zurück zur Basis und neu sammeln.
- Creepen: überhaupt ja oder nein, wann (nach Einbruch der Nacht?), nur Lager, die man sicher schafft?
- Fair oder nicht: Wenn du später in die Arena willst, sag „nur Gegner verwenden, die in Sichtweite sind“.
3. Laufen lassen
Speichere den Code des Modells als brains/my_bot.py und führe dann aus:
python tools/play.py --bot brains/my_bot.py --race 1 --difficulty 2
Für schnellere Ergebnisse --speed 200 (doppelte Geschwindigkeit) ergänzen.
4. Nachbessern lassen
- Es gibt einen Fehler: Füge die komplette Fehlermeldung unverändert beim Modell ein und sag „bitte korrigieren“.
- Es spielt schlecht: Beschreibe, was du im Spiel siehst, nicht deine Vermutung über die Ursache. Zum Beispiel „der Held steht die ganze Zeit in der Basis“, „die Einheiten laufen einzeln in den Gegner“, „die Bauern drängen sich an einer Mine“.
- Neue Spielweise hinzufügen: Immer nur eine Sache auf einmal, eine Partie spielen, prüfen, dass nichts kaputt ist, dann die nächste.
Ein Coding Agent, der selbst Befehle ausführen kann, übernimmt auch die Schritte 3 und 4: eine Partie spielen, Logs und Quittungen lesen, Code ändern, erneut spielen. Wie er genug Informationen bekommt, steht unter Agent-Selbstiteration.
5. Häufige Probleme
| Symptom | Meistens liegt es daran |
|---|---|
| Nichts bewegt sich | Falsche Instanznummer (--inst) oder das Spiel ist noch nicht in einer Partie |
| Bauern sammeln nicht | Befehle an bereits beschäftigte Bauern; nur idle_workers() einteilen |
| Es wird nie ein Gebäude fertig | build_near verwenden, keine festen Koordinaten; in der Quittung prüfen, ob reason „nicht genug Gold“ sagt |
| Kein Held erscheint | Quittung von train prüfen: zu wenig Nahrung? Oder ist der Held tot (dann revive)? |
| Held wirkt keine Zauber | Nicht erlernt (learn) oder kein Mana; nach dem Wirken prüfen, ob cooldown() eine Abklingzeit zeigt |
| Einheiten zucken Tick für Tick | Jeder Tick erteilt die Befehle neu; nur untätigen Einheiten Befehle geben |
| Keine Einheiten, das Gold steigt und steigt | Die Nahrung blockiert: g.production(kaserne).blocked prüfen |
| Das Modell nutzt Methoden, die es nicht gibt | Im Prompt noch einmal betonen: „nur Methoden aus api.json verwenden“, und api.json vollständig einfügen |
Fortgeschritten
- Alle Schnittstellen und der jeweils zugrunde liegende Mechanismus: API-Referenz;
- Das Referenz-Brain (
brains/xwar3/strategy) ist eine vollständige KI, die expandiert, creept und angreift. Das Modell kann seine Ideen lesen, es nutzt aber tiefer liegende Schnittstellen – direkt abschreiben ist nicht empfehlenswert; - In der Arena siehst du später nur Gegner in Sichtweite – verwende schon jetzt
--fairals Selbstbeschränkung, dann musst du später nichts ändern.