# Пишем бота с помощью LLM

> Можно и без навыков программирования: вы объясняете, как бот должен играть, а LLM пишет код. Скопируйте шаблон промпта, опишите стратегию, запустите — и просите доработать.

Источник: https://war3ai.com/ru/docs/ai-bot/

Подходит тем, кто играет в Warcraft III, но не умеет программировать, а также разработчикам, которые хотят сэкономить время. Весь процесс — это диалог: **вы описываете стратегию → модель пишет код → вы играете партию → рассказываете модели, что увидели → она исправляет**.

> **Совет**
>
> Сначала настройте окружение по [Быстрому старту](https://war3ai.com/ru/docs/quickstart/) и добейтесь, чтобы `hello_bot` заработал (крестьяне пошли добывать золото). Тогда при проблемах вы сможете отличить ошибку окружения от ошибки в боте.

## 1. Подготовьте материалы для модели

Насколько хорошо модель напишет код, на восемьдесят процентов зависит от того, прочитала ли она правильные материалы. Выберите вариант под свой инструмент:

| Что вы используете | Как передать материалы |
|---|---|
| **Coding Agent с доступом к репозиторию** (Claude Code, Cursor, Codex и т. п.) | Откройте его в папке репозитория и попросите сначала прочитать `docs/BOT_HANDBOOK_ZH.md`, `docs/api.json` и один пример (для экономики — `brains/examples/macro_bot.py`, для боя — `micro_bot.py`) |
| **Чат-модель с доступом в интернет** | Попросите её сначала прочитать [`https://war3ai.com/llms-full.txt`](https://war3ai.com/ru/llms-full.txt) — вся документация сайта собрана в этом одном файле |
| **Веб-чат без доступа в интернет** | Вставьте руководство, [`api.json`](https://war3ai.com/ru/api.json) и один файл-пример после промпта |
| **Локальная модель** (LM Studio, Ollama) | То же самое. Контекстное окно лучше от 32K токенов, иначе руководство и каталог API не поместятся |

Если нужен какой-то приём профи, добавьте ещё соответствующий рецепт из [Книги рецептов](https://war3ai.com/ru/docs/cookbook/).

## 2. Скопируйте этот промпт

Замените последний блок «Стратегия, которую я хочу» своими словами — чем конкретнее, тем лучше:

```text
Напиши AI (на Python) для Warcraft III 1.27. Используй только методы Game, перечисленные в api.json,
не выдумывай несуществующие методы. Пиши по образцу rush_bot.py: наследуйся от openwar3.Bot, реализуй on_start(g) и on_tick(g).

Правила:
- on_tick вызывается примерно 5 раз в секунду и должен быть быстрым (никаких sleep внутри).
- Значение, которое не удалось прочитать, — это None, а не 0; сначала проверяй, потом используй.
- Команда возвращает квитанцию (Receipt): `if r:` означает «движок принял»; если не принял, в `r.reason` указана причина
  (не хватает пищи, не хватает золота, цель не видна, такой герой уже есть…) — попробуй снова в следующий тик или иначе.
- Атаковать конкретного врага — g.attack(юниты, враг); враг должен быть в зоне обзора, невидимого отклонят.
- Погибшего героя воскрешают через g.revive(алтарь), нанять второго такого же нельзя.
- Здания строй через g.build_near(рабочий, код_здания, x, y): он сам найдёт место, куда здание влезет, и отследит результат; если не хватает денег, ничего не делает.
- Чтобы знать, «что только что произошло» (кто погиб, кто получил урон, герой получил уровень, выпал предмет), реализуй on_event(g, ev).
- Не отдавай одному и тому же юниту одну и ту же команду каждый тик (это прерывает то, что он делает); приказывай «бездельникам».
- На добычу отправляй только рабочих из idle_workers(). На одном золотом руднике не больше 5 рабочих.
- В очереди найма держи только 1 юнит (следующего ставь, когда g.queue(здание) пуста); упёрлись ли в пищу — смотри g.production(здание).blocked.
- Если за один тик нужно отдать много команд, оберни их в with g.batch(): (игровой поток ждём только один раз).
- Кого бить, выбирай через g.time_to_kill(моя_группа, враг) (учитывает контры и броню); куда идти — через g.path_distance (если не дойти, вернёт None).
- В честном режиме видно только то, что в зоне обзора; врагов, которых видели раньше, бери из g.last_seen().
- Юниты обозначаются четырёхсимвольными кодами (крестьянин Людей hpea, пехотинец hfoo, казарма hbar…), заклинания — строками приказов (thunderbolt — Молот бурь,
  blizzard — Снежная буря, holybolt — Свет небес…, полный список в data/order-ids.txt), изучение способностей — четырёхсимвольными кодами (AHtb, AHbz…).

Стратегия, которую я хочу:
<напиши здесь простыми словами, например:
  "Люди, в начале 5 крестьян на золото и 1 на лес; первый герой — Архимаг; две казармы, пехотинцы и стрелки;
   набрав 12 юнитов, идём с героем на экспансию противника; если здоровье героя ниже 30% — отступаем домой;
   на крипинге сначала лагеря поближе к базе.">
```

### Как понятно описать стратегию

Больше всего модель боится расплывчатых требований. Вместо «играй агрессивнее» полезнее такие сведения:

- **Раса и герой**: какого героя брать первым, порядок прокачки (например, Архимаг: Элементаль воды, Снежная буря, Элементаль воды…).
- **Порядок постройки**: на каком крестьянине ставить казарму, когда улучшать ратушу, сколько нужно казарм.
- **Состав армии**: пехотинцы + стрелки? С какого количества выходить?
- **Условия атаки и отступления**: с какой армией нападать, при каком здоровье героя отступать, если армию потрепали — домой, собирать заново.
- **Крипинг**: крипить ли, когда (после наступления темноты?), только лагеря, которые по силам?
- **Честность**: если потом собираетесь на Арену, укажите «использовать только врагов, которых видно в зоне обзора».

## 3. Запустите

Сохраните код от модели как `brains/my_bot.py`, затем:

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

Чтобы увидеть результат быстрее, добавьте `--speed 200` (скорость игры 2×).

## 4. Просите исправить

- **Ошибка**: вставьте модели **весь текст ошибки** как есть и попросите «исправь».
- **Играет плохо**: описывайте, **что вы видите в игре**, а не свои догадки о причине. Например: «герой всё время стоит на базе», «войска идут в бой по одному», «все крестьяне столпились на одном руднике».
- **Хотите новый приём**: добавляйте по одной вещи за раз, сыграйте партию, убедитесь, что ничего не сломалось, и только потом добавляйте следующую.

> **Примечание**
>
> Coding Agent, который умеет сам запускать команды, может взять на себя и шаги 3 и 4: сыграть партию, прочитать логи и квитанции, поправить код, запустить снова. Как дать ему достаточно информации, см. в разделе [Автономные итерации агента](https://war3ai.com/ru/docs/agent-loop/).

## 5. Частые проблемы

| Симптом | Скорее всего |
|---|---|
| Ничего не двигается | Неверный номер экземпляра (`--inst`) или игра ещё не вошла в партию |
| Крестьяне не добывают золото | Приказ отдан уже занятым крестьянам; отправляйте только `idle_workers()` |
| Здания никак не строятся | Используйте `build_near`, не прописывайте координаты жёстко; проверьте `reason` в квитанции — может, не хватает денег |
| Герой не появляется | Смотрите квитанцию `train`: не хватает пищи? Или герой погиб (нужен `revive`)? |
| Герой не применяет заклинания | Способность не изучена (`learn`) или нет маны; после применения проверьте через `cooldown()`, ушла ли она на перезарядку |
| Войска дёргаются каждый тик | Команды отдаются заново каждый тик; приказывайте только бездельничающим юнитам |
| Войска не нанимаются, деньги копятся | Упёрлись в лимит пищи: смотрите `g.production(казарма).blocked` |
| Модель использует несуществующие методы | Ещё раз подчеркните в промпте «только методы из api.json» и вставьте api.json целиком |

## Что дальше

- Все интерфейсы и механизм каждого из них: [каталог API](https://war3ai.com/ru/api/);
- эталонный мозг (`brains/xwar3/strategy`) — это полноценный AI, который занимает экспансии, крипует и атакует; можно дать модели изучить его подход, но он использует более низкоуровневые интерфейсы, поэтому копировать его напрямую не советуем;
- на [Арене](https://war3ai.com/ru/arena/) будут видны только враги в зоне обзора — добавьте `--fair` уже сейчас, чтобы потом ничего не переделывать.
