Files
paper-racing-gpi/README.md
2025-10-20 19:35:38 +05:00

162 lines
6.3 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.
# Гонки на бумаге (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 ×× 2^C), где:
- W, H - размеры поля
- V - максимальная скорость
- C - количество чекпоинтов
### A*
- **Время**: O(b^d) худший случай, но на практике значительно лучше
- **Память**: Меньше благодаря направленному поиску
- **Эффективность**: Зависит от качества эвристики