162 lines
6.3 KiB
Markdown
162 lines
6.3 KiB
Markdown
# Гонки на бумаге (Paper Racing / Vector Racing)
|
||
|
||
## 🏁 Описание задачи
|
||
|
||
Классическая игра "гонки на бумаге" - это задача поиска оптимального пути на декартовом поле.
|
||
|
||
## 🚀 Две реализации
|
||
|
||
Проект содержит две версии алгоритма решения:
|
||
|
||
1. **BFS** (`Program.cs`) - Поиск в ширину, гарантирует оптимальное решение
|
||
2. **A*** (`ProgramAStar.cs`) - Эвристический поиск, в 5-10 раз быстрее на больших картах
|
||
|
||
### Правила:
|
||
1. **Поле**: Квадратное декартово поле с координатами
|
||
2. **Цель**: Пройти через все чекпоинты за минимальное количество ходов (в любом порядке)
|
||
3. **Движение**: На каждом шаге указывается вектор ускорения (целочисленный)
|
||
- Можно изменить скорость на -1, 0 или +1 по каждой оси (X и Y)
|
||
- Новая позиция = текущая позиция + скорость
|
||
4. **Препятствия**: Есть препятствия, через которые нельзя проезжать
|
||
5. **Физика**: Автомобиль имеет инерцию - скорость сохраняется между ходами
|
||
|
||
### Пример физики движения:
|
||
|
||
```
|
||
Шаг 0: Позиция=(1,1), Скорость=(0,0), Ускорение=(0,0)
|
||
Шаг 1: Позиция=(2,2), Скорость=(1,1), Ускорение=(1,1)
|
||
Шаг 2: Позиция=(4,4), Скорость=(2,2), Ускорение=(1,1)
|
||
Шаг 3: Позиция=(6,5), Скорость=(2,1), Ускорение=(0,-1)
|
||
```
|
||
|
||
## Реализация
|
||
|
||
Программа использует алгоритм **BFS (Breadth-First Search)** для поиска оптимального решения.
|
||
|
||
### Ключевые компоненты:
|
||
|
||
1. **Point** - представляет координаты на поле
|
||
2. **GameState** - состояние игры (позиция, скорость, посещенные чекпоинты)
|
||
3. **RaceTrack** - игровое поле с логикой поиска решения
|
||
4. **Алгоритм Брезенхема** - для проверки пересечения с препятствиями
|
||
|
||
## 📦 Быстрый старт
|
||
|
||
### Использование интерактивного скрипта:
|
||
```bash
|
||
./run.sh
|
||
```
|
||
|
||
### Или напрямую:
|
||
|
||
**BFS версия:**
|
||
```bash
|
||
dotnet run --project racing.csproj
|
||
```
|
||
|
||
**A* версия (рекомендуется для больших карт):**
|
||
```bash
|
||
dotnet run --project racing-astar.csproj
|
||
```
|
||
|
||
## 🗺️ Редактор карт
|
||
|
||
Для создания своих карт используйте веб-редактор в папке `map-editor/`:
|
||
|
||
```bash
|
||
cd map-editor
|
||
./open-editor.sh # или просто откройте index.html в браузере
|
||
```
|
||
|
||
### Возможности редактора:
|
||
- ✅ Визуально создавать карты любого размера (5×5 до 100×100)
|
||
- ✅ 6 типов ячеек: дорога, камень, снег, лёд, чекпоинт, старт
|
||
- ✅ Экспортировать/импортировать карты в формате JSON
|
||
- ✅ **Пошаговая визуализация решений**
|
||
- ✅ Анимация движения с векторами скорости
|
||
- ✅ Регулируемая скорость воспроизведения (1x - 10x)
|
||
- ✅ Управление: Play, Pause, Reset, Step
|
||
|
||
### Формат решения для визуализации:
|
||
```json
|
||
{
|
||
"solution": [
|
||
[1, 1], // векторы ускорения [ax, ay]
|
||
[1, 0],
|
||
[0, 1]
|
||
]
|
||
}
|
||
```
|
||
|
||
Подробнее: [map-editor/README.md](map-editor/README.md) | Быстрый старт: [map-editor/QUICKSTART.md](map-editor/QUICKSTART.md)
|
||
|
||
## Модификация задачи
|
||
|
||
Вы можете изменить параметры в `Program.cs`:
|
||
|
||
```csharp
|
||
// Размер поля
|
||
int width = 15;
|
||
int height = 15;
|
||
|
||
// Стартовая позиция
|
||
var start = new Point(1, 1);
|
||
|
||
// Чекпоинты
|
||
var checkpoints = new Dictionary<int, Point>
|
||
{
|
||
{ 1, new Point(5, 5) },
|
||
{ 2, new Point(10, 10) },
|
||
{ 3, new Point(12, 3) }
|
||
};
|
||
|
||
// Добавить препятствия
|
||
obstacles.Add(new Point(x, y));
|
||
```
|
||
|
||
## Визуализация
|
||
|
||
```
|
||
S - старт
|
||
1, 2, 3 - чекпоинты
|
||
# - препятствия
|
||
. - пройденный путь
|
||
```
|
||
|
||
## ⚡ Сравнение производительности
|
||
|
||
| Характеристика | BFS | A* |
|
||
|---------------|-----|-----|
|
||
| Скорость | Базовая | 5-10x быстрее |
|
||
| Память | Высокая | Оптимизированная |
|
||
| Оптимальность | Гарантирована | Гарантирована* |
|
||
| Карты 15×15 | Быстро | Очень быстро |
|
||
| Карты 42×42 | Медленно | Быстро |
|
||
| 5+ чекпоинтов | Очень медленно | Приемлемо |
|
||
|
||
*При допустимой эвристике
|
||
|
||
**Рекомендации:**
|
||
- Для карт ≤20×20 и ≤3 чекпоинтов: любой алгоритм
|
||
- Для карт >20×20 или >3 чекпоинтов: используйте A*
|
||
- Для экспериментов и обучения: BFS проще для понимания
|
||
|
||
Подробнее см. [ASTAR-README.md](ASTAR-README.md)
|
||
|
||
## 🧮 Сложность
|
||
|
||
### BFS
|
||
- **Время**: O(b^d), где b - коэффициент ветвления (~9 направлений), d - глубина
|
||
- **Память**: O(b^d)
|
||
- **Пространство состояний**: O(W × H × V² × 2^C), где:
|
||
- W, H - размеры поля
|
||
- V - максимальная скорость
|
||
- C - количество чекпоинтов
|
||
|
||
### A*
|
||
- **Время**: O(b^d) худший случай, но на практике значительно лучше
|
||
- **Память**: Меньше благодаря направленному поиску
|
||
- **Эффективность**: Зависит от качества эвристики
|
||
|
||
|