# Искусственный интеллект OpenCiv3

## Слои принятия решений

В изученной реализации различаются стратегические приоритеты игрока, выбор производства города, назначения юнитов и поиск пути. Это обычный игровой AI на правилах и эвристиках; LLM или внешнего сервиса здесь не требуется.

[PlayTurn](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/PlayerAI.cs) проверяет старые договоры, пересматривает приоритеты, выбирает исследование, иногда пытается торговать, выполняет действия юнитов и корректирует бюджеты. Проверка торговли происходит с вероятностью **25% на ход**, а не по строгому расписанию раз в четыре хода.

## Стратегия и производство

Пересмотр стратегии задаёт таймер `15 + rng.Next(10)`, то есть значение от 15 до 24, затем таймер уменьшается. Это не точная гарантия одинакового интервала между решениями: важен порядок проверки нуля.

[C7Engine/AI/StrategicPriorityArbitrator.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/StrategicPriorityArbitrator.cs) оценивает веса возможных приоритетов и выбирает несколько. В дереве есть экспансия, исследование мира и война. Код допускает от двух до четырёх приоритетов, но фактический максимум также ограничен числом доступных вариантов.

[C7Engine/AI/ChooseProducible.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/ChooseProducible.cs) оценивает предметы по силе, сроку постройки, цене населения, обороне города, эскорту, экономике и доступным местам поселений. Выбирается максимальная оценка с небольшим случайным множителем. Производство юнитов и зданий использует общий список допустимости.

## Роли юнитов

В коде есть `SettlerAI`, `WorkerAI`, `ExplorerAI`, `DefenderAI`, `CombatAI`, `EscortAI`. Текущая задача может продолжаться несколько ходов; число повторных попыток за один проход ограничено, чтобы избежать зацикливания. Для разведчиков существуют зарезервированные цели, позволяющие уменьшить дублирование.

Поселенец выбирает место и работает с эскортом; рабочий ищет полезное улучшение. Бой и оборона получают свои цели. Источники: [C7Engine/AI/UnitAI/SettlerAI.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/UnitAI/SettlerAI.cs), [C7Engine/AI/UnitAI/SettlerLocationAI.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/UnitAI/SettlerLocationAI.cs), [C7Engine/AI/UnitAI/WorkerAI.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/UnitAI/WorkerAI.cs), [C7Engine/AI/UnitAI/CombatAI.cs](https://github.com/C7-Game/OpenCiv3/blob/c1370e2f63a6042a3c4206f0043543d7da0d5cc5/C7Engine/AI/UnitAI/CombatAI.cs).

## Ограничения

Назначение ролей местами проверяет имена `Settler`, `Worker`, `Catapult`. Исследование выбирается как первая доступная технология. При выборе кораблей код прямо говорит, что транспортные операции и морская война AI пока не обслуживаются; осадные юниты также ограничены.

[Notes on AI](https://github.com/C7-Game/OpenCiv3/wiki/Notes-on-AI) полезна как история замысла, но содержит описания 2022 года. Например, заявления о ещё не действующих приоритетах и отсутствии атак на лагеря нельзя автоматически переносить на нынешнюю ветку.

## Для нашей игры

Начать с ролей и одинаковых для человека и AI команд; сохранять цель и причину выбора для отладки. Убирать привязку к названиям в пользу способностей. До добавления сложной стратегии проверить, что AI завершает ход, не зацикливается, сохраняет хотя бы защитника и не тратит всю экономику на недоступную цель.

