Docs La IA escribe tu Bot

Escribe un Bot con un LLM

Puedes hacerlo sin saber programar: tú explicas bien cómo quieres que juegue y el LLM escribe el código. Copia la plantilla de prompt, describe tu estrategia, ejecútalo y pídele cambios.

Pensado para quien sabe jugar a Warcraft pero no sabe programar, y también para desarrolladores que quieren ahorrar tiempo. Todo el proceso es una conversación: tú describes la estrategia → el modelo escribe el código → juegas una partida → le cuentas al modelo lo que pasó → lo corrige.

Primero prepara el entorno siguiendo el Inicio rápido y haz funcionar hello_bot (verás a los campesinos ir a la mina). Así, cuando algo falle, sabrás distinguir si es un problema del entorno o del Bot.

1. Prepara el material para el modelo

Lo bien que escriba el modelo depende en un ochenta por ciento de que haya leído el material correcto. Elige una opción según la herramienta que uses:

Lo que usasCómo darle el material
Un Coding Agent que lee el repositorio (Claude Code, Cursor, Codex, etc.)Ábrelo en el directorio del repositorio y pídele que lea primero docs/BOT_HANDBOOK_ZH.md, docs/api.json y un ejemplo (para economía, brains/examples/macro_bot.py; para combate, micro_bot.py)
Un modelo de chat con acceso a internetPídele que lea primero https://war3ai.com/llms-full.txt: toda la documentación del sitio está en ese único archivo
Chat web sin acceso a internetPega el manual, api.json y un archivo de ejemplo después del prompt
Un modelo local (LM Studio, Ollama)Igual que el anterior. Se recomienda una ventana de contexto de más de 32K tokens; si no, el manual y el catálogo de la API no caben

Si quieres una jugada profesional concreta, pega además la receta correspondiente del Recetario de jugadas profesionales.

2. Copia este prompt

Sustituye «La estrategia que quiero» del final por tus propias palabras; cuanto más concreto, mejor:

Vas a escribir una IA (en Python) para Warcraft III 1.27. Usa solo los métodos de Game que aparecen en api.json;
no inventes métodos que no existen. Sigue el estilo de rush_bot.py: hereda de openwar3.Bot e implementa on_start(g) y on_tick(g).

Reglas:
- on_tick se llama unas 5 veces por segundo; tiene que ser rápido (no uses sleep dentro).
- Un valor que no se puede leer es None, no 0: compruébalo antes de usarlo.
- Cada comando devuelve un recibo (Receipt); `if r:` significa "el motor lo aceptó"; si no lo aceptó, `r.reason` indica el motivo
  (falta comida, falta oro, el objetivo no es visible, ese héroe ya existe…); vuelve a intentarlo en el siguiente tick o prueba otra cosa.
- Para atacar a un enemigo concreto usa g.attack(unidades, enemigo); el enemigo tiene que estar a la vista: si no se ve, se rechaza.
- Si un héroe muere, revívelo con g.revive(altar); no se puede entrenar otro.
- Para construir usa g.build_near(trabajador, código_edificio, x, y): busca solo un sitio donde quepa, sigue el resultado y no hace nada si falta dinero.
- Para saber "qué acaba de pasar" (quién murió, quién perdió vida, un héroe subió de nivel, cayó un objeto) implementa on_event(g, ev).
- No repitas la misma orden a la misma unidad en cada tick (interrumpe lo que está haciendo); da órdenes a las unidades "ociosas".
- Manda a recolectar solo a los trabajadores de idle_workers(). Como máximo 5 trabajadores por mina de oro.
- Pon solo 1 unidad en la cola de entrenamiento (encola otra cuando g.queue(edificio) esté vacía); si la comida se atasca, mira g.production(edificio).blocked.
- Si en un tick tienes que dar muchos comandos, envuélvelos en with g.batch(): (se espera una sola vez al hilo del juego).
- Para elegir a quién atacar usa g.time_to_kill(mi_grupo, enemigo) (tiene en cuenta counters y armadura); para elegir adónde ir usa g.path_distance (devuelve None si no se puede llegar).
- En modo justo solo se ve lo que está en tu campo de visión; para los enemigos vistos antes usa g.last_seen().
- Las unidades se identifican con códigos de cuatro caracteres (campesino humano hpea, soldado hfoo, cuartel hbar…); los hechizos, con nombres de orden (thunderbolt Martillo de tormenta,
  blizzard Ventisca, holybolt Luz sagrada…; la lista completa está en data/order-ids.txt); para aprender habilidades se usan códigos de cuatro caracteres (AHtb, AHbz…).

La estrategia que quiero:
<Escríbela aquí con palabras sencillas, por ejemplo:
  "Humanos. Al empezar, 5 campesinos al oro y 1 a la madera; primero sale el Archimago; dos cuarteles sacando soldados y fusileros;
   al llegar a 12 unidades, ir con el héroe a atacar la expansión rival; si la vida del héroe baja del 30 %, volver a casa;
   al creepear, atacar primero los campamentos más cercanos a la base.">

Cómo explicar bien la estrategia

Lo que peor lleva el modelo son los requisitos vagos. En lugar de «juega más agresivo», esta información es mucho más útil:

  • Raza y héroes: qué héroe sale primero y en qué orden sube habilidades (por ejemplo, Archimago: Elemental de agua, Ventisca, Elemental de agua…).
  • Orden de construcción: con cuántos campesinos se levanta el cuartel, cuándo subir de tier, cuántos cuarteles.
  • Composición del ejército: ¿soldados + fusileros? ¿Con cuántos sale a atacar?
  • Condiciones para avanzar y retirarse: con cuántas unidades ataca, con cuánta vida se retira el héroe, volver a casa a reagruparse si el ejército queda destrozado.
  • Creeping: si creepea o no, cuándo (¿al anochecer?), ¿solo los campamentos que puede ganar?
  • Justo o no: si en el futuro quieres competir en la Arena, dilo: «usa solo los enemigos que se ven en el campo de visión».

3. Ejecútalo

Guarda el código que te dé el modelo como brains/my_bot.py y luego:

python tools/play.py --bot brains/my_bot.py --race 1 --difficulty 2

Para ver el resultado antes, añade --speed 200 (velocidad 2×).

4. Pídele cambios

  • Da un error: pega el error completo, tal cual, y dile al modelo «corrígelo».
  • Juega mal: describe lo que ves en el juego, no la causa que supones. Por ejemplo: «el héroe se queda quieto en casa», «las unidades llegan de una en una y mueren», «los campesinos se amontonan en una sola mina».
  • Quieres añadir una estrategia nueva: añade una sola cosa cada vez, juega una partida para confirmar que nada se ha roto y pasa a la siguiente.

Un Coding Agent que puede ejecutar comandos puede encargarse también de los pasos 3 y 4: jugar una partida, leer los logs y los recibos, cambiar el código y volver a jugar. Cómo darle suficiente información: consulta Iteración autónoma del Agent.

5. Problemas frecuentes

SíntomaCasi siempre es
No se mueve nadaNúmero de instancia incorrecto (--inst), o el juego todavía no ha entrado en la partida
Los campesinos no minanDas órdenes a campesinos que ya están trabajando; manda solo a los de idle_workers()
Nunca termina de construir casasUsa build_near en vez de coordenadas fijas; mira si el reason del recibo es falta de dinero
No sale el héroeMira el recibo de train: ¿falta comida? ¿O el héroe murió (hace falta revive)?
El héroe no lanza hechizosNo los ha aprendido (learn) o no tiene maná; tras lanzar, mira si cooldown() entró en enfriamiento
Las unidades tiemblan tick a tickSe les vuelve a dar la orden en cada tick; da órdenes solo a las unidades ociosas
No salen unidades y el dinero no para de subirLa comida está atascada: mira g.production(cuartel).blocked
El modelo usa métodos que no existenInsiste en el prompt en «usa solo los métodos de api.json» y pega api.json completo

Siguientes pasos

  • Todas las interfaces y el mecanismo subyacente de cada una: catálogo de la API;
  • El cerebro de referencia (brains/xwar3/strategy) es una IA completa que se expande, creepea y ataca. Puedes pedirle al modelo que lea sus ideas, pero usa interfaces de más bajo nivel, así que no se recomienda copiarlo tal cual;
  • Cuando compitas en la Arena, solo verás a los enemigos que estén en tu campo de visión: añade ya --fair para imponerte esa restricción y no tener que cambiar nada después.