Docs Guides

Bots d’exemple

Quatre exemples, du plus simple au plus complet, tous exécutables tels quels ; chaque bloc de logique correspond à une capacité du SDK. S’y ajoute un cerveau de référence complet.

Les exemples se trouvent dans brains/examples/ ; chacun hérite du précédent et n’ajoute que les nouveautés. Lisez-les dans l’ordre :

ExempleCe que vous apprenezLancer
hello_bot.pyRécolte (5 ouvriers par mine, bois une fois la mine pleine), production de paysans (1 seul en file), bâtiments de nourriture, reprise des chantiers à l’arrêt ; fonctionne avec les quatre racespython tools/play.py --bot brains/examples/hello_bot.py
rush_bot.pyCaserne et autel (construits avec build_near s’il n’y en a pas), héros en premier (ressuscité s’il meurt), compétences apprises dès qu’un point est disponible, attaque-déplacement dès qu’une vague est prête… --bot brains/examples/rush_bot.py
macro_bot.pyOrdre de construction + retour à la mine une fois le bâtiment terminé (Shift), bâtiment de nourriture dès que la nourriture bloque, 1 seule unité en file à la caserne, améliorations d’attaque et d’armure, montée de tier et unités avancées, choix de la cible selon la vraie distance au sol et déplacement le long du chemin… --bot brains/examples/macro_bot.py --speed 200
micro_bot.pyPrend en main les combats par-dessus la macro : focus sur l’ennemi le plus vite tuable, retrait des unités blessées, protection du héros, de nuit les camps de creeps à sa portée, défense quand l’ennemi arrive à la base ; les commandes d’un tick partent en un seul lot… --bot brains/examples/micro_bot.py --fair

Les commentaires de hello_bot et rush_bot consignent les pièges rencontrés en jeu, par exemple « on prenait toujours le premier ouvrier pour construire, résultat : 3 fermes restées à l’état de fondations » ou « les coordonnées de caserne codées en dur tombaient en pleine forêt : en 3 minutes, pas une seule caserne construite ». Les commentaires en apprennent plus que le code.

hello_bot : l’économie

# race -> (ouvrier, bâtiments principaux, bâtiment de nourriture)
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            # 5 paysans max par mine (au-delà, le revenu n'augmente plus)
LUMBER_CREW = 5         # nombre de bûcherons : 5 à l'or par mine + ce nombre au bois = objectif d'ouvriers

Trois choses : les ouvriers inactifs vont à l’or (le Bot compte lui-même les ouvriers de chaque mine et envoie le surplus au bois quand la mine est pleine) ; s’il manque des ouvriers, il en produit (1 seul en file) ; quand la nourriture approche du maximum, il prend un ouvrier qui n’est pas déjà en train de construire et bâtit un bâtiment de nourriture près du bâtiment principal (chez les Humains et les Orcs, il renvoie aussi quelqu’un terminer les fondations laissées à l’arrêt).

rush_bot : produire et attaquer

Trois ajouts par rapport à hello_bot : construire caserne et autel s’ils manquent ; produire le héros à l’autel (le ressusciter d’abord s’il est mort, un héros est unique) et apprendre une compétence dès qu’un point est disponible ; une fois 8 soldats réunis, attaque-déplacement de toute l’armée vers le bâtiment principal ennemi, puis retour à la base pour reconstituer une vague quand l’armée est décimée. Seules les unités inactives reçoivent des ordres, pour ne pas interrompre le combat à chaque tick.

macro_bot : les bases de la macro

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"]),
    ...
}

Ce que les joueurs pro font à chaque partie, chaque point correspondant à une capacité du SDK : une table d’ordre de construction + gather(..., queue="after") pour retourner à la mine une fois le bâtiment terminé ; production().blocked pour repérer un blocage de nourriture ; g.queue pour ne garder qu’une unité en file à la caserne ; can_do pour demander au moteur si le niveau suivant d’attaque ou d’armure peut être recherché ; montée de tier et unités avancées (leçon tirée d’une vraie partie : resté au tier 1, le Bot s’est fait raser en 23 minutes par des chevaliers et des chevaucheurs de griffon de tier 3) ; choix de la cible avec path_distance et déplacement par les points de passage de path().

micro_bot : une fois le combat engagé

def _fight(self, g, army, foes, home, now):
    ...
    visible = [e for e in foes if e.visible_to(me)]              # une cible invisible est rejetée (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))         # la plus vite tuable, pas la plus proche
    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)

En jeu : 5 minutes, 1497 ticks, 3023 commandes, 0 erreur.

Le cerveau de référence : une IA complète

brains/xwar3/ est une IA complète qui prend des expansions, fait du creeping et attaque. Elle est organisée en trois couches :

CoucheEmplacementRythmeRôle
Couche stratégiquestrategy/De l’ordre de la secondeChoix et changement de stratégie à la manière d’AMAI, tables de construction, unités de contre, choix des héros ; coach stratégique LLM en option
Couche réflexereflex/ (4 processus indépendants)De l’ordre de 100 msSurvie, sorts, focus, ramassage d’objets
Modèle de victoireworldmodel/—Ce combat est-il gagnable (sous-ensemble d’inférence)

Plusieurs processus partagent les unités via une table d’arbitrage, où la priorité décide qui a le dernier mot : ordre manuel 95 > survie 90 > esquive des sorts 85 > sorts 80 > ramassage d’objets 70 > … > stratégie 50 > affectation des ouvriers 45. Votre propre Bot figure dans la table sous l’identité bot, avec une priorité par défaut de 50.

Le cerveau de référence utilise directement les couches bas niveau du SDK (w3cmd / act) et s’appuie beaucoup sur l’information de toute la carte. Il est utile comme source d’« idées », mais il n’est pas conseillé de le faire recopier tel quel par un LLM. Il a besoin des données AMAI : lors du premier déploiement, start.bat les récupère depuis le dépôt public d’AMAI et les génère (AMAI est sous licence personnalisée ; les fichiers générés ne sont pas versionnés dans git ; en cas d’échec, relancez avec start.bat setup).

Le plus simple pour lancer le cerveau de référence est la console Farsight : sur la page « Instances et lancement », cochez les numéros d’instance, puis cliquez sur « Lancer le test ».