Add AI bot tests and update documentation

This commit is contained in:
sokol
2026-02-21 20:34:42 +03:00
parent a0f6276e5d
commit afebcbca1a
3 changed files with 1178 additions and 90 deletions

127
README.md
View File

@@ -1,6 +1,6 @@
# hexo
# HEXO
Учебный проект. Игра, клон https://www.gamedesign.jp/games/dicewars/
Учебный проект. Игра, клон [DiceWars](https://www.gamedesign.jp/games/dicewars/)
## Запуск игры
@@ -10,60 +10,119 @@ npm test # Запустить тесты
npm start # Консольная версия карты
```
## Настройки игры
## Экран запуска
При запуске можно выбрать:
- Количество игроков: 2-4
- Тип каждого игрока: Человек (Human) или AI бот
При запуске игры открывается экран настройки:
1. **Выберите количество игроков**: 2, 3 или 4
2. **Настройте тип каждого игрока**:
- **Human** — управление человеком (клики мышью)
- **AI Bot** — управление компьютером
3. Нажмите **Start Game** для начала игры
### Комбинации игроков
Можно создавать любые комбинации:
- Все игроки — люди (Hotseat)
- Все игроки — AI боты (наблюдение за игрой ИИ)
- Смешанный режим (например, P1-Human, P2-AI, P3-Human, P4-AI)
## Цвета игроков
| Игрок | Цвет | HEX |
|-------|------|-----|
| P1 | 🟢 Зелёный | `#4ecca3` |
| P2 | 🔴 Красный | `#e94560` |
| P3 | 🟡 Жёлтый | `#f9ed69` |
| P4 | 🔵 Бирюзовый | `#a8e6cf` |
## AI Bot
### Как работает
AI бот автоматически играет за выбранного игрока:
1. **Анализ поля** — бот оценивает все возможные ходы
2. **Приоритеты ходов**:
- 🎯 Атака слабого противника (высокий шанс победы)
- 📈 Захват пустых клеток (расширение территории)
- 💪 Укрепление позиций (перемещение к сильным клеткам)
3. **Задержка мышления** — 1000 мс перед каждым ходом для естественности геймплея
### Индикаторы AI
- В карточке игрока отображается метка **(AI)**
- Во время хода AI в панели действий показано: *"AI is thinking..."*
- Кнопки управления отключены во время хода AI
## Правила игры
### 1. Карта
- Гексагональная сетка 20×20 ячеек
- Каждая ячейка может быть:
- Проходима (пустая или принадлежит игроку)
- Непроходима (заблокирована)
- **Проходима** (пустая или принадлежит игроку)
- **Непроходима** (заблокирована, серый цвет)
### 2. Игровые единицы
- Кубик: 6-гранный, значения 1-6
- На поле может быть до 8 кубиков
- **Сила юнита**: `F = (cnt-1)*6 + current_dice`
- **Кубик**: 6-гранный, значения 1-6
- На поле может быть до **8 кубиков** на клетку
- **Сила юнита**: `F = (cnt-1) × 6 + current_dice`
- `cnt` — количество кубиков
- `current_dice` — значение верхнего кубика
### 3. Ход игры
#### Перемещение/Атака
- Можно ходить, если сила > 1
- На целевую клетку переходит `сила-1`, на исходной остаётся 1
- Можно ходить, если **сила > 1**
- На целевую клетку переходит `сила-1`, на исходной остаётся **1**
- При атаке оба игрока бросают кости:
- Атакующий: `attack_roll = rnd(1..сила-1)`
- Защищающийся: `defense_roll = rnd(1..сила)`
- **Атакующий**: `attack_roll = rnd(1..сила-1)`
- **Защищающийся**: `defense_roll = rnd(1..сила)`
#### Результат боя
- Если `attack_roll > defense_roll`:
- Атакующий побеждает, занимает клетку с `attack_roll-1`
- На исходной клетке остаётся 1
- Если `attack_roll <= defense_roll`:
- Атака отбита, атакующий уменьшается до 1
- Защитник остаётся с `defense_roll - attack_roll` (мин. 1)
| Условие | Результат |
|---------|-----------|
| `attack_roll > defense_roll` | Атакующий побеждает, занимает клетку с `attack_roll-1`. На исходной клетке остаётся **1** |
| `attack_roll <= defense_roll` | Атака отбита. Атакующий уменьшается до **1**. Защитник остаётся с `defense_roll - attack_roll` (мин. **1**) |
#### Снабжение
- После хода игрок получает снабжение
После хода игрок получает снабжение:
- **Снабжение = размер наибольшей непрерывной территории**
- Непрерывная территория — связанные между собой клетки игрока
- Если территория разорвана врагом — считается только largest кусок
- Снабжение распределяется по 1 единице случайным клеткам (не максимальным)
- Максимум на клетке: 48 (8 кубиков × 6)
- **Непрерывная территория** — связанные между собой клетки игрока
- Если территория разорвана врагом — считается только наибольший кусок
- Снабжение распределяется по **1 единице** случайным клеткам (не максимальным)
- **Максимум на клетке**: 48 (8 кубиков × 6)
### 4. Победа
- Последний игрок, оставшийся с клетками на карте
**Последний игрок**, оставшийся с клетками на карте, побеждает.
## Управление
- **Клик** на свою клетку → выбор
- **Клик** на соседнюю вражескую/пустую → атака
- **Cancel** → отмена выбора
- **End Turn** → завершить ход
| Действие | Управление |
|----------|------------|
| Выбрать клетку | Клик на свою клетку с кубиками |
| Атаковать | Клик на соседнюю вражескую/пустую клетку |
| Отменить выбор | Кнопка **Cancel** или клик на ту же клетку |
| Завершить ход | Кнопка **End Turn** |
| Вернуться в меню | Кнопка **Main Menu** |
### Индикаторы на экране
- **Выделенная клетка** — красная подсветка
- **Доступные цели** — зелёная подсветка соседних клеток
- **Лог боёв** — правая панель с историей действий
- **Инфо о клетке** — сила и количество кубиков выбранной клетки
## Настройки игры
Игра поддерживает:
- **2-4 игрока** (любая комбинация людей и AI)
- **Случайная генерация карты** при каждом запуске
- **Случайные стартовые позиции** для игроков