Files
football/docs/plans/2026-05-09-players-ai.md
2026-05-12 10:54:09 +03:00

101 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# План: Автономные игроки и ИИ (M3)
**Цель:** Реализовать автономных игроков с ролевым и зональным ИИ, которые двигаются плавно и соблюдают тактические позиции.
**Архитектура:** Разделение данных игрока (`Player` entity) и логики поведения. Использование steering-подхода для плавного движения.
**Стек:** Go, Ebitengine.
**Спека:** [docs/specs/2026-05-09-players-ai-design.md](../specs/2026-05-09-players-ai-design.md)
---
## Файловая структура
- `internal/entities/player.go` — новая сущность игрока, типы `Team` и `Role`.
- `internal/game/world.go` — интеграция игроков в мир, логика AI, физика движения.
- `internal/game/world_test.go` — тесты поведения AI.
---
## Задачи
### Задача 1: Сущность Игрока
**Файлы:**
- Создать: `internal/entities/player.go`
- [ ] **Шаг 1: Определить типы и структуру**
- Создать `Team` (Red, Blue) и `Role` (Striker, Defender).
- Создать структуру `Player` с полями: `Position`, `Velocity`, `Radius`, `Team`, `Role`, `HomePosition`, `MaxSpeed`, `Acceleration`.
- [ ] **Шаг 2: Коммит**
`git add internal/entities/player.go && git commit -m "feat(entities): add player entity"`
### Задача 2: Интеграция игроков в World
**Файлы:**
- Изменить: `internal/game/world.go`
- [ ] **Шаг 1: Добавить константы ворот и список игроков**
- Добавить `GoalLeft` и `GoalRight` (точки в центре левого и правого краев).
- Добавить `Players []*Player` в структуру `World`.
- [ ] **Шаг 2: Инициализация игроков**
- В `NewWorld` создать по 2 игрока для каждой команды (1 защитник, 1 нападающий) и расставить их по начальным позициям.
- [ ] **Шаг 3: Коммит**
`git add internal/game/world.go && git commit -m "feat(game): integrate players into world"`
### Задача 3: Реализация AI и Steering
**Файлы:**
- Изменить: `internal/game/world.go`
- [ ] **Шаг 1: Реализовать расчет Target Point**
- Создать метод `calculateTarget(p *Player, puckPos Vector2D) Vector2D`.
- Логика для Защитника: если шайба на чужой половине -> `HomePosition`, иначе -> точка между шайбой и воротами.
- Логика для Нападающего: если шайба в зоне -> позиция шайбы, иначе -> центр/позиция между центром и чужими воротами.
- [ ] **Шаг 2: Реализовать Steering-физику**
- В `World.Update` для каждого игрока:
1. Вычислить `Target Point`.
2. Вычислить `Desired Velocity` (нормализованный вектор к цели * `MaxSpeed`).
3. Применить ускорение: `Velocity += (DesiredVelocity - Velocity) * factor`, ограничив по `Acceleration`.
4. Обновить `Position += Velocity`.
5. Добавить clamping по границам экрана.
- [ ] **Шаг 3: Добавить Anti-Clumping и Dead Zone**
- Добавить небольшое отталкивание между игроками одной команды.
- Добавить порог остановки, чтобы избежать дрожания.
- [ ] **Шаг 4: Коммит**
`git add internal/game/world.go && git commit -m "feat(game): implement player AI and steering physics"`
### Задача 4: Рендеринг игроков
**Файлы:**
- Изменить: `internal/game/world.go` (или там, где происходит отрисовка)
- [ ] **Шаг 1: Отрисовка игроков**
- В методе отрисовки добавить цикл по `World.Players`.
- Рисовать круг: Красный для `TeamRed`, Синий для `TeamBlue`.
- [ ] **Шаг 2: Коммит**
`git add internal/game/world.go && git commit -m "feat(game): render players"`
### Задача 5: Тестирование и Полировка
**Файлы:**
- Изменить: `internal/game/world_test.go`
- [ ] **Шаг 1: Написать тесты на AI**
- Проверить, что защитник возвращается к воротам при удалении шайбы.
- Проверить, что нападающий движется к шайбе.
- [ ] **Шаг 2: Запустить тесты и убедиться, что проходят**
`go test ./internal/game/... -v`
- [ ] **Шаг 3: Коммит**
`git add internal/game/world_test.go && git commit -m "test(game): add AI behavior tests"`