# 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.

Quelle: https://war3ai.com/de/docs/examples/

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` |

> **Info**
>
> 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

```python
# 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

```python
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

```python
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](https://war3ai.com/de/docs/llm-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.

> **Achtung**
>
> 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](https://war3ai.com/de/docs/console/): Auf der Seite „Instanzen & Start“ die Instanznummer ankreuzen und auf „Test starten“ klicken.
