This commit is contained in:
2025-10-20 19:35:38 +05:00
commit 023ccd03d8
42 changed files with 10007 additions and 0 deletions

161
README.md Normal file
View File

@@ -0,0 +1,161 @@
# Гонки на бумаге (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) худший случай, но на практике значительно лучше
- **Память**: Меньше благодаря направленному поиску
- **Эффективность**: Зависит от качества эвристики