Docs Grundlagen

Fair-Modus

Ein ins Spiel injizierter Client kann die ganze Karte lesen. Im Fair-Modus sieht dein Bot nur, was in seiner Sicht liegt – wie ein menschlicher Spieler und wie nach den Regeln der Arena.

Die Beobachtungsfähigkeit dieses Projekts beruht darauf, dass „der Client den Zustand aller Spieler hält“: Der Snapshot enthält alle Einheiten der ganzen Karte, auch Gegner im Nebel. Fürs Debugging ist das praktisch, für Wettkämpfe unfair.

Der Fair-Modus lässt das SDK nach deiner Sicht filtern:

python tools/play.py --bot my_bot.py --fair
python -m openwar3 run my_bot.py --inst 5 --fair
from openwar3 import Game, run
g = Game(inst=5, fair=True)            # Game direkt verwenden
run(MyBot, inst=5, fair=True)          # oder dem Runner überlassen

Was gefiltert wird

InhaltIm Fair-Modus
EinheitenAlle eigenen + Gegner und neutrale Einheiten, die du gerade siehst
Gegenstände am BodenNur in Sichtweite eigener Einheiten (Sichtweite bei Tag / Nacht getrennt laut Datentabelle)
ProduktionstabelleNur sichtbare Gebäude (du siehst nicht, was der Gegner ausbildet)
EventsDeine eigenen; sichtbare (oder innerhalb der letzten Sekunde sichtbare); Schaden, den deine Seite verursacht

Woher die Sicht kommt

  • Jede Einheit im Snapshot trägt eine Sichtbarkeitsmaske: Bit p = Spieler p sieht sie gerade (nur Spieler 0–11 mit Einheiten auf dem Feld; eigene Einheiten sind für dich immer sichtbar). u.visible_to(g.me()) liest sie direkt, ohne Wartezeit.
  • Für beliebige Punkte fragt g.visible(x, y) die Engine (sichtbar / Nebel / unerforscht) – über die Schnellspur, etwa ein Frame pro Aufruf. Musst du in einem Tick viele Einheiten prüfen, nimm u.visible_to() aus dem Snapshot statt g.visible() einzeln aufzurufen.

Das Gedächtnis für Gegner: last_seen

Ein menschlicher Spieler merkt sich „eben habe ich dort drüben eine Gruppe Wolfsreiter gesehen“. Das SDK merkt es sich auch: Bei jeder Snapshot-Aktualisierung werden gegnerische Einheiten und Creeps, die du gerade siehst, festgehalten (letzte Position, HP, Zeit); siehst du eine sterben, wird sie gelöscht, bei einem neuen Spiel wird alles geleert.

for u, t, age in g.last_seen(max_age=60):         # Gegner, die in den letzten 60 Spielsekunden gesehen wurden
    print(u.type, u.x, u.y, f"vor {age:.0f}s")

heroes = [r for r in g.last_seen() if r[0].is_hero]   # wo die gegnerischen Helden zuletzt waren
camps  = g.last_seen(owner="creep")                   # bereits gesehene Creeps

Im Fair-Modus ist das deine einzige „Informationsquelle über den Gegner“ – genau wie bei menschlichen Spielern. Auch im normalen Modus wird nach Sicht gespeichert, du kannst also denselben Code verwenden.

Als welcher Spieler befehligen

python tools/play.py --bot my_bot.py --player 1 --attach

--player N (oder Game(player=N)) lässt den Bot als Spieler N befehligen – er kann nur Einheiten von Spieler N steuern. Für zwei KIs gegeneinander öffnest du im selben Spiel zwei solche Kanäle.

Lokal ist Fairness eine Absprache, keine Sicherheitsgrenze

Auf deinem eigenen Rechner kann nichts ein Programm daran hindern, die ganze Karte zu lesen. --fair ist eine Selbstverpflichtung; echte Wettkämpfe sichert der Schiedsrichterprozess der Arena: Bots kommen nie an den Shared Memory, erhalten nur vom Schiedsrichter nach Sicht gefilterte Beobachtungen, können nur Aktionen einreichen, und bei jeder Aktion wird zuerst geprüft, ob die Einheit dem Bot gehört.

Warum du ihn schon jetzt einschalten solltest

  • Auf der Arena gelten genau diese Regeln – schreibst du jetzt für den Fair-Modus, musst du später keine Zeile ändern;
  • erst ohne Informationen über die ganze Karte zeigt sich, wie gut dein Bot wirklich ist (das Referenz-Brain stützt sich derzeit stark darauf, etwa auf den Zielpunkt des Anführers der Computer-KI – ein guter Test);
  • Aufklärung, Gedächtnis und Lageeinschätzung, die du im Fair-Modus entwickelst, sind die KI-Fähigkeiten, die wirklich zählen.