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