diff --git a/IMPLEMENTATION-SUMMARY.md b/IMPLEMENTATION-SUMMARY.md deleted file mode 100644 index 45cd022..0000000 --- a/IMPLEMENTATION-SUMMARY.md +++ /dev/null @@ -1,403 +0,0 @@ -# 🏁 Реализация новых правил - Итоговый отчет - -**Дата**: 19 октября 2025 -**Проект**: Paper Racing - A* Algorithm -**Статус**: ✅ **Полностью реализовано и протестировано** - ---- - -## 📋 Задача - -Адаптировать алгоритм A* для поддержки новых игровых правил: - -1. **Препятствия**: Можно проезжать через камни, но нельзя на них останавливаться -2. **Снег**: Ускорение ограничено диапазоном от -1 до +1 по каждой оси -3. **Лёд**: Ускорение нельзя менять (инерция - только сохранение текущей скорости) - ---- - -## ✅ Выполненные изменения - -### 1. Обновление структуры данных - -#### RaceTrack класс -```csharp -// БЫЛО: -public RaceTrack(int width, int height, Point start, - Dictionary checkpoints, - HashSet obstacles) - -// СТАЛО: -public RaceTrack(int width, int height, Point start, - Dictionary checkpoints, - HashSet obstacles, - Dictionary cellTypes) // +новое поле -``` - -#### Новые поля -```csharp -private readonly Dictionary _cellTypes; // Тип каждой клетки -``` - ---- - -### 2. Новая логика ускорений - -#### Метод GetAccelerationRange() -```csharp -private (int minAccel, int maxAccel) GetAccelerationRange(Point position) -{ - if (_cellTypes.TryGetValue(position, out int cellType)) - { - return cellType switch - { - 2 => (-1, 1), // Снег: ограниченное маневрирование - 3 => (0, 0), // Лёд: только инерция - _ => (-2, 2) // Обычная дорога - }; - } - return (-2, 2); // По умолчанию -} -``` - -#### Применение в алгоритме A* -```csharp -// БЫЛО: -for (int dx = -2; dx <= 2; dx++) - for (int dy = -2; dy <= 2; dy++) - -// СТАЛО: -var (minAccel, maxAccel) = GetAccelerationRange(currentState.Position); -for (int dx = minAccel; dx <= maxAccel; dx++) - for (int dy = minAccel; dy <= maxAccel; dy++) -``` - ---- - -### 3. Новая логика препятствий - -#### Проверка препятствий -```csharp -// БЫЛО: -if (IntersectsObstacle(currentState.Position, newPosition)) - continue; - -// СТАЛО: -// Можно проезжать через препятствия, но нельзя на них останавливаться -if (_obstacles.Contains(newPosition)) - continue; -``` - -#### Удалено -- Метод `IntersectsObstacle()` - больше не нужен -- Алгоритм Брезенхема для проверки пути - больше не используется - ---- - -### 4. Обновление MapLoader - -```csharp -// БЫЛО: -public static (int width, int height, Point start, - Dictionary checkpoints, - HashSet obstacles) LoadFromJson(string filePath) - -// СТАЛО: -public static (int width, int height, Point start, - Dictionary checkpoints, - HashSet obstacles, - Dictionary cellTypes) LoadFromJson(string filePath) -``` - -#### Добавлен подсчет -```csharp -int snowCount = 0; -int iceCount = 0; - -// ...обработка карты... - -Console.WriteLine($"Снег: {snowCount} клеток"); -Console.WriteLine($"Лёд: {iceCount} клеток"); -``` - ---- - -### 5. Улучшенная визуализация - -```csharp -// Добавлено отображение типов поверхностей -else if (_cellTypes.TryGetValue(point, out int cellType)) -{ - switch (cellType) - { - case 2: // Снег - Console.Write("~ "); - break; - case 3: // Лёд - Console.Write("= "); - break; - default: - Console.Write(" "); - break; - } -} -``` - -#### Обновлена легенда -``` -# - препятствия (можно проезжать, нельзя останавливаться) -~ - снег (ускорение ±1) -= - лёд (ускорение нельзя менять) -``` - ---- - -### 6. Обработка встроенной карты - -```csharp -// Для встроенной карты по умолчанию: -cellTypes = new Dictionary(); -for (int y = 0; y < height; y++) -{ - for (int x = 0; x < width; x++) - { - cellTypes[new Point(x, y)] = 0; // Обычная дорога - } -} -``` - ---- - -## 🧪 Созданные тестовые карты - -| Файл | Назначение | Размер | Особенности | -|------|------------|--------|-------------| -| `test-obstacles.json` | Проверка проезда через препятствия | 15×11 | 56 препятствий | -| `test-snow.json` | Проверка ограниченного маневрирования | 15×9 | 49 клеток снега | -| `test-ice.json` | Проверка инерции | 18×9 | 54 клетки льда | -| `test-combined.json` | Комплексная проверка | 20×15 | Все типы + 4 чекпоинта | - ---- - -## 📊 Результаты тестирования - -### Автоматические тесты - -```bash -./run-all-tests.sh -``` - -**Результат**: ✅ **7/7 тестов пройдено успешно (100%)** - -| # | Карта | Ходов | Итераций | Время | Статус | -|---|-------|-------|----------|-------|--------| -| 1 | test-obstacles.json | 4 | 24 | 0.04с | ✅ | -| 2 | test-snow.json | 3 | 42 | 0.04с | ✅ | -| 3 | test-ice.json | 3 | 34 | 0.04с | ✅ | -| 4 | test-combined.json | 9 | 21 | 0.04с | ✅ | -| 5 | simple-test.json | 5 | 23 | 0.04с | ✅ | -| 6 | easy-test.json | 3 | 4 | 0.04с | ✅ | -| 7 | open-field.json | 6 | 15 | 0.04с | ✅ | - -### Ключевые метрики -- **Среднее время**: 0.04 секунды -- **Средние итерации**: 23 итерации -- **Минимальное решение**: 3 хода -- **Максимальное решение**: 9 ходов -- **Успешность**: 100% - ---- - -## 🎯 Проверенные сценарии - -### ✅ Сценарий 1: Проезд через препятствия -**Карта**: test-obstacles.json -**Результат**: Машина успешно пролетела через зону из 56 препятствий -**Траектория**: (0,10) → (2,10) → (6,9) → (11,6) → (14,1) -**Вывод**: Препятствия больше не блокируют траектории - -### ✅ Сценарий 2: Маневрирование на снегу -**Карта**: test-snow.json -**Результат**: Все ускорения в пределах ±1 -**Ускорения**: (1,1), (-1,0) -**Вывод**: Ограничение работает корректно - -### ✅ Сценарий 3: Инерция на льду -**Карта**: test-ice.json -**Результат**: Алгоритм не планирует остановок на льду -**Стратегия**: Машина обошла ледяную зону -**Вывод**: Ограничение ускорения (0,0) применяется - -### ✅ Сценарий 4: Комбинация всех типов -**Карта**: test-combined.json -**Результат**: Все 4 чекпоинта собраны за 9 ходов -**Проверки**: -- Проезд через препятствия: шаги 3-4 ✅ -- Маневр на снегу: шаг 7 с ускорением (-1,1) ✅ -- Обход льда: шаги 8-9 ✅ - ---- - -## 📁 Созданные файлы - -### Тестовые карты -- `/maps/test-obstacles.json` - тест препятствий -- `/maps/test-snow.json` - тест снега -- `/maps/test-ice.json` - тест льда -- `/maps/test-combined.json` - комплексный тест - -### Документация -- `/TEST-RESULTS.md` - детальные результаты каждого теста -- `/TESTING-SUMMARY.md` - полная сводка тестирования -- `/maps/TEST-MAPS-README.md` - руководство по тестовым картам -- `/IMPLEMENTATION-SUMMARY.md` - этот файл - -### Скрипты -- `/run-all-tests.sh` - автоматический запуск всех тестов - ---- - -## 🔧 Изменения в коде - -### Файлы с изменениями -- `ProgramAStar.cs` - основная реализация - -### Статистика изменений -- **Добавлено**: - - Метод `GetAccelerationRange()` (15 строк) - - Поле `_cellTypes` (1 строка) - - Обработка типов клеток в `MapLoader` (20 строк) - - Визуализация снега и льда (10 строк) -- **Удалено**: - - Метод `IntersectsObstacle()` (34 строки) - - Вызов `IntersectsObstacle()` (2 строки) -- **Изменено**: - - Цикл генерации ускорений (4 строки) - - Конструктор `RaceTrack` (1 строка) - - Сигнатура `MapLoader.LoadFromJson()` (1 строка) - -### Чистый результат -- **+46 строк** (новый функционал) -- **-36 строк** (удаленный код) -- **Итого**: +10 строк чистого кода - ---- - -## 🚀 Использование - -### Компиляция -```bash -dotnet build racing-astar.csproj -``` - -### Запуск на карте -```bash -./bin/Debug/net8.0/racing-astar maps/test-combined.json -``` - -### Автоматическое тестирование -```bash -./run-all-tests.sh -``` - ---- - -## 💡 Преимущества реализации - -### 1. Чистый код -- Удален сложный метод `IntersectsObstacle()` -- Добавлен простой и понятный `GetAccelerationRange()` -- Код стал короче и проще - -### 2. Производительность -- Убрана проверка всего пути (алгоритм Брезенхема) -- Только одна проверка конечной позиции -- Меньше вычислений = быстрее работа - -### 3. Гибкость -- Легко добавить новые типы поверхностей -- Все правила в одном месте (`GetAccelerationRange()`) -- Просто менять ограничения ускорений - -### 4. Расширяемость -```csharp -// Легко добавить новые типы: -return cellType switch -{ - 2 => (-1, 1), // Снег - 3 => (0, 0), // Лёд - 5 => (-3, 3), // Новый тип: супер-дорога - 6 => (-1, 2), // Новый тип: асимметричная поверхность - _ => (-2, 2) -}; -``` - ---- - -## 🎯 Достигнутые цели - -### Функциональные требования -- ✅ Препятствия можно проезжать -- ✅ На препятствиях нельзя останавливаться -- ✅ Снег ограничивает ускорение до ±1 -- ✅ Лёд не позволяет менять ускорение -- ✅ Обычная дорога работает как раньше (±2) - -### Нефункциональные требования -- ✅ Высокая производительность (< 0.05 сек) -- ✅ Обратная совместимость с существующими картами -- ✅ Чистый и понятный код -- ✅ Полное тестовое покрытие -- ✅ Подробная документация - -### Качество -- ✅ 0 ошибок компиляции -- ✅ 0 предупреждений -- ✅ 100% тестов пройдено -- ✅ Все сценарии проверены - ---- - -## 📚 Дальнейшие возможности - -### Потенциальные улучшения -1. **Учет типов в эвристике** - - Снег = увеличение стоимости пути - - Лёд = планирование длинных инерционных участков - -2. **Новые типы поверхностей** - - Грязь: случайное ускорение - - Турбо-полоса: увеличенное ускорение ±3 - - Телепорты: мгновенное перемещение - -3. **Визуальные улучшения** - - Цветной вывод для разных поверхностей - - Анимация движения - - Экспорт в графический формат - -4. **Оптимизации** - - Кэширование эвристики для клеток - - Предрасчет зон типов поверхностей - - Параллельная обработка ветвей поиска - ---- - -## ✅ Заключение - -**Все новые правила успешно реализованы и протестированы.** - -Система полностью готова к использованию и показывает отличную производительность на картах любой сложности. Код стал чище, проще и быстрее. Все тесты проходят со 100% успешностью. - -### Итоговая оценка проекта -- **Функциональность**: ✅ 10/10 -- **Производительность**: ✅ 10/10 -- **Качество кода**: ✅ 10/10 -- **Тестирование**: ✅ 10/10 -- **Документация**: ✅ 10/10 - -**Общая оценка**: ⭐⭐⭐⭐⭐ **10/10** - ---- - -**Проект завершен успешно!** 🎉 - diff --git a/MAP-FORMAT.md b/MAP-FORMAT.md deleted file mode 100644 index ebcfc80..0000000 --- a/MAP-FORMAT.md +++ /dev/null @@ -1,126 +0,0 @@ -# Формат карт для Paper Racing A* - -## Обзор - -Программа поддерживает загрузку карт из JSON-файлов. Это позволяет создавать собственные треки любой сложности. - -## Использование - -### Запуск со встроенной картой -```bash -dotnet run --project racing-astar.csproj -``` - -### Запуск с картой из файла -```bash -dotnet run --project racing-astar.csproj maps/your-map.json -``` - -или через скомпилированный бинарник: -```bash -./bin/Debug/net8.0/racing-astar maps/your-map.json -``` - -## Формат JSON - -Карта представляет собой JSON-файл со следующей структурой: - -```json -{ - "map": [ - [0, 0, 0, 0, 0], - [0, 1, 4, 1, 0], - [0, 0, 0, 0, 0] - ] -} -``` - -### Типы ячеек - -| Код | Тип | Описание | Поведение | -|-----|-----|----------|-----------| -| `0` | Дорога | Обычная проходимая ячейка | Первая найденная становится стартом (если нет типа 5). Ускорение ±2 | -| `1` | Камень | Препятствие | Можно проезжать, нельзя останавливаться | -| `2` | Снег | Скользкая поверхность | Ограниченное маневрирование, ускорение ±1 | -| `3` | Лед | Очень скользкая поверхность | Инерция, ускорение нельзя менять | -| `4` | Чекпоинт | Контрольная точка | Должна быть посещена | -| `5` | Старт | Явная стартовая позиция | Приоритет над типом 0, ускорение ±2 | - -### Особенности - -1. **Стартовая позиция**: - - Если на карте есть ячейка типа `5` (Старт), она становится стартовой позицией - - Если нет типа `5`, то автоматически определяется как первая ячейка типа `0` (дорога), найденная при сканировании карты слева направо, сверху вниз - -2. **Чекпоинты**: Все ячейки с типом `4` автоматически становятся чекпоинтами. Нумерация чекпоинтов идет по порядку их обнаружения (слева направо, сверху вниз). - -3. **Система координат**: - - JSON-карта описывается сверху вниз (первая строка массива = верх карты) - - Визуализация отображает карту в правильной ориентации (Y растет вверх) - -4. **Физика движения**: Алгоритм учитывает инерцию - машинка не может мгновенно остановиться или изменить направление. Ускорение на каждом шаге ограничено диапазоном `[-2, +2]` по каждой оси. - -## Примеры карт - -### Простая открытая карта (3 чекпоинта) -Файл: `maps/open-field.json` - -```json -{ - "map": [ - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ] -} -``` - -### Сложная карта с препятствиями (59 чекпоинтов) -Файл: `maps/racing-map-42x42.json` - -Карта размером 42x42 с многочисленными препятствиями и 59 чекпоинтами. Требует значительно больше времени для поиска решения. - -## Советы по созданию карт - -1. **Начните с малого**: Создайте небольшую карту (10x10 - 20x20) для тестирования. - -2. **Учитывайте инерцию**: Оставляйте достаточно пространства для маневрирования. Машинка не может мгновенно остановиться. - -3. **Не переусердствуйте с чекпоинтами**: Сложность растет экспоненциально с количеством чекпоинтов. Начните с 2-5 чекпоинтов. - -4. **Открытые пространства**: Карты с большим количеством открытого пространства решаются быстрее. - -5. **Тестирование**: Используйте встроенные примеры для понимания того, какие карты решаются быстро: - ```bash - dotnet run --project racing-astar.csproj maps/open-field.json - ``` - -## Ограничения - -- **Максимум итераций**: По умолчанию алгоритм ограничен 5,000,000 итераций -- **Память**: Сложные карты с большим количеством чекпоинтов требуют значительной памяти -- **Время**: Карты с более чем 10 чекпоинтами могут требовать длительного времени решения - -## Технические детали - -### Алгоритм A* -Программа использует алгоритм A* с эвристикой на основе: -- Евклидова расстояния до чекпоинтов -- Текущей скорости движения -- Упрощенной модели физики ускорения - -### Ключ состояния -Каждое уникальное состояние определяется комбинацией: -- Позиция (X, Y) -- Скорость (VX, VY) -- Набор посещенных чекпоинтов - -Это позволяет алгоритму эффективно отслеживать уже исследованные состояния и избегать повторной обработки. - diff --git a/QUICKSTART-WEB.md b/QUICKSTART-WEB.md deleted file mode 100644 index a0ff85f..0000000 --- a/QUICKSTART-WEB.md +++ /dev/null @@ -1,133 +0,0 @@ -# 🚀 Быстрый старт - Веб-инструменты - -## Два независимых приложения - -### 🗺️ Редактор карт -```bash -cd map-editor -./open-editor.sh -``` -**Для чего:** Создание и редактирование карт - -### 🎬 Визуализатор решений -```bash -cd solution-player -./open-player.sh -``` -**Для чего:** Просмотр анимации решений - ---- - -## 📖 Полный цикл работы - -### Шаг 1: Создайте карту -```bash -cd map-editor -./open-editor.sh -``` -1. Нарисуйте трассу -2. Добавьте точку старта (S, тип 5) -3. Добавьте чекпоинты (C, тип 4) -4. Нажмите "📥 Экспорт JSON" -5. Сохраните как `my-map.json` - -### Шаг 2: Решите карту -```bash -cd .. -dotnet run --project racing-astar.csproj maps/my-map.json -``` -Решение сохранится в `solution.json` - -### Шаг 3: Визуализируйте -```bash -cd solution-player -./open-player.sh -``` -1. Нажмите "📂 Загрузить карту" → выберите `my-map.json` -2. Нажмите "🎬 Загрузить решение" → выберите `solution.json` -3. Нажмите "▶ Play" -4. Наслаждайтесь анимацией! - ---- - -## 🎯 Быстрый тест с примерами - -### Вариант 1: Простая карта -```bash -cd solution-player -./open-player.sh -``` -1. Загрузите карту: `simple-track.json` -2. Загрузите решение: `example-solution.json` -3. Play! - -### Вариант 2: Демо-карта -```bash -cd solution-player -./open-player.sh -``` -1. Загрузите карту: `demo-with-start.json` -2. Загрузите решение: `demo-solution.json` -3. Play! - -### Вариант 3: Сложная траектория -```bash -cd solution-player -./open-player.sh -``` -1. Загрузите карту: `demo-with-start.json` -2. Загрузите решение: `complex-solution.json` -3. Play! - ---- - -## 🎮 Управление визуализатором - -- **▶ Play** - автоматическое воспроизведение -- **⏸ Pause** - пауза -- **⏮ Reset** - вернуться к началу -- **⏪ Back** - шаг назад -- **⏩ Forward** - шаг вперед -- **Слайдер** - скорость 1x-10x - ---- - -## 📚 Дополнительная информация - -- **WEB-TOOLS.md** - подробное описание инструментов -- **map-editor/README.md** - документация редактора -- **solution-player/README.md** - документация визуализатора -- **SEPARATION-SUMMARY.md** - детали разделения проектов - ---- - -## 💡 Полезные советы - -### Для редактора: -- Используйте ЛКМ для рисования -- Удерживайте кнопку мыши для быстрого рисования -- Проверяйте JSON в консоли (F12) - -### Для визуализатора: -- Начните с малых скоростей (1x-3x) -- Используйте пошаговый режим для анализа -- Следите за красной стрелкой (вектор скорости) -- Смотрите информацию о каждом шаге внизу - ---- - -## 🔧 Troubleshooting - -**Проблема:** Визуализатор не показывает траекторию -**Решение:** Убедитесь, что на карте есть точка старта (тип 5) - -**Проблема:** Траектория выходит за пределы карты -**Решение:** Проверьте, что решение создано для правильной карты - -**Проблема:** Браузер не открывается -**Решение:** Откройте `index.html` вручную - ---- - -Приятного использования! 🎉 - diff --git a/RACING-TOOLS-INFO.md b/RACING-TOOLS-INFO.md deleted file mode 100644 index 5696067..0000000 --- a/RACING-TOOLS-INFO.md +++ /dev/null @@ -1,81 +0,0 @@ -# 🏁 Racing Tools - Новый объединенный проект - -## 🎉 Что нового? - -Проекты `map-editor/` и `solution-player/` объединены в один: **`racing-tools/`** - -## 🚀 Быстрый старт - -```bash -cd racing-tools - -# Редактор карт -./open-editor.sh -# или -firefox editor.html - -# Визуализатор решений -./open-player.sh -# или -firefox player.html -``` - -## 📦 Что внутри? - -### Два веб-приложения -- **🏁 Редактор карт** (`editor.html`) - создание и редактирование карт -- **🎬 Визуализатор решений** (`player.html`) - анимация траекторий - -### Общие файлы -- `styles.css` - единый стиль для обоих приложений -- `common.js` - общие функции и константы -- `README.md` - полная документация - -## 🔑 Ключевые улучшения - -✅ **Единый стиль** - общий CSS файл -✅ **Навигация** - кнопки переключения между страницами -✅ **Меньше дублирования** - общие функции в отдельном файле -✅ **Удобство** - все в одной папке -✅ **Единая документация** - один README - -## 📄 Документация - -- **[racing-tools/README.md](racing-tools/README.md)** - полная документация -- **[racing-tools/MIGRATION.md](racing-tools/MIGRATION.md)** - руководство по миграции - -## 🗂️ Структура проекта - -``` -racing-tools/ -├── editor.html # Редактор карт -├── player.html # Визуализатор решений -├── styles.css # Общие стили -├── common.js # Общий код -├── editor.js # Логика редактора -├── player.js # Логика визуализатора -├── open-editor.sh # Запуск редактора -├── open-player.sh # Запуск визуализатора -├── demo-with-start.json # Демо-карта -├── demo-with-start-solution.json # Демо-решение -├── README.md # Документация -└── MIGRATION.md # Руководство по миграции -``` - -## ⚡ Совместимость - -✅ Все форматы JSON остались прежними -✅ Старые карты и решения работают без изменений -✅ Можно использовать параллельно со старыми проектами - -## 🔗 Связанные файлы - -- [WEB-TOOLS.md](WEB-TOOLS.md) - общий обзор веб-инструментов -- [MAP-FORMAT.md](MAP-FORMAT.md) - формат карт -- [maps/](maps/) - коллекция карт - ---- - -**Создано:** 20 октября 2025 -**Версия:** 2.0 (Объединенная) - diff --git a/SEPARATION-SUMMARY.md b/SEPARATION-SUMMARY.md deleted file mode 100644 index 8bff5b3..0000000 --- a/SEPARATION-SUMMARY.md +++ /dev/null @@ -1,190 +0,0 @@ -# 📊 Итоги разделения проектов - -## ✅ Выполненные изменения - -### Создано два независимых проекта: - -#### 1. 🗺️ Редактор карт (`map-editor/`) -- **Назначение:** Создание и редактирование карт -- **Функции:** - - Рисование карт - - Экспорт/импорт JSON - - 6 типов ячеек - - Валидация данных - -#### 2. 🎬 Визуализатор решений (`solution-player/`) -- **Назначение:** Визуализация и анимация решений -- **Функции:** - - Загрузка карт и решений - - Пошаговое воспроизведение - - Регулировка скорости - - Отображение векторов - - Детальная информация - ---- - -## 📂 Структура файлов - -### map-editor/ -``` -map-editor/ -├── index.html ✅ Обновлен (удалена визуализация) -├── editor.js ✅ Обновлен (только редактирование) -├── README.md ✅ Обновлен -├── open-editor.sh ✅ Существующий скрипт -├── *.json ✅ Карты и примеры -└── документация... -``` - -### solution-player/ -``` -solution-player/ -├── index.html ✅ Создан (только визуализация) -├── player.js ✅ Создан (только плеер) -├── README.md ✅ Создан -├── open-player.sh ✅ Создан -├── demo-with-start.json ✅ Скопирован -├── simple-track.json ✅ Скопирован -├── easy-test.json ✅ Скопирован -├── example-solution.json ✅ Скопирован -├── complex-solution.json ✅ Скопирован -└── demo-solution.json ✅ Скопирован -``` - -### Корневая документация -``` -racing/ -├── WEB-TOOLS.md ✅ Создан (обзор обоих проектов) -└── SEPARATION-SUMMARY.md ✅ Этот файл -``` - ---- - -## 🔄 Основные изменения - -### map-editor/index.html -- ❌ Удалена секция "Визуализация решения" -- ❌ Удалена панель воспроизведения -- ❌ Удалены элементы управления плеером -- ❌ Удалена информация о шагах -- ❌ Удалены неиспользуемые CSS стили -- ✅ Добавлена ссылка на визуализатор решений - -### map-editor/editor.js -- ❌ Удалены функции визуализации траектории -- ❌ Удалены функции воспроизведения -- ❌ Удалены переменные состояния плеера -- ❌ Удалены функции симуляции -- ✅ Оставлен только редактор карт - -### solution-player/ (новый проект) -- ✅ Создан полностью новый HTML -- ✅ Создан player.js с функциями визуализации -- ✅ Добавлена возможность загрузки карты -- ✅ Добавлена возможность загрузки решения -- ✅ Добавлена навигация вперед/назад -- ✅ Улучшен UI/UX для просмотра - ---- - -## 🚀 Как использовать - -### Редактор карт -```bash -cd map-editor -./open-editor.sh -``` -- Создавайте карты -- Экспортируйте JSON -- Переходите к визуализатору через ссылку - -### Визуализатор решений -```bash -cd solution-player -./open-player.sh -``` -- Загрузите карту -- Загрузите решение -- Наслаждайтесь анимацией - ---- - -## 📋 Workflow - -``` -1. Создание карты - ↓ - map-editor → export map.json - -2. Генерация решения - ↓ - dotnet run → solution.json - -3. Визуализация - ↓ - solution-player → load map + solution - ↓ - Просмотр анимации -``` - ---- - -## 🎯 Преимущества разделения - -### ✅ Разделение ответственности -- Редактор занимается только картами -- Плеер занимается только визуализацией - -### ✅ Независимость -- Каждый проект можно использовать отдельно -- Упрощенный код -- Легче поддерживать - -### ✅ Улучшенный UX -- Четкое назначение каждого инструмента -- Упрощенный интерфейс -- Меньше путаницы - -### ✅ Масштабируемость -- Легко добавлять новые функции -- Проще тестировать -- Модульная архитектура - ---- - -## 📚 Документация - -- **WEB-TOOLS.md** - Обзор обоих инструментов -- **map-editor/README.md** - Документация редактора -- **solution-player/README.md** - Документация визуализатора - ---- - -## 🔗 Связи между проектами - -1. **map-editor** создает JSON карты -2. **C# solver** генерирует решения -3. **solution-player** визуализирует результаты - -Все проекты полностью независимы и связаны только через JSON файлы. - ---- - -## ✨ Итого - -Проект успешно разделен на два независимых веб-приложения: -- ✅ Редактор карт (map-editor) -- ✅ Визуализатор решений (solution-player) - -Оба приложения: -- ✅ Полностью функциональны -- ✅ Имеют свою документацию -- ✅ Имеют скрипты запуска -- ✅ Включают примеры файлов -- ✅ Работают без сервера -- ✅ Современный UI/UX - ---- - -Дата разделения: 2025-10-20 - diff --git a/map-editor/README.md b/map-editor/README.md deleted file mode 100644 index bc98e89..0000000 --- a/map-editor/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# 🗺️ Редактор карт для "Гонки на бумаге" - -Веб-приложение для создания и редактирования карт. Работает без сервера, просто откройте в браузере. - -> **Примечание:** Для визуализации решений используйте [Визуализатор решений](../solution-player/). - -## 🚀 Быстрый старт - -```bash -# Запуск редактора -./open-editor.sh -# или -firefox index.html -``` - -**Три простых шага:** -1. Установите размеры (5-100), выберите тип ячейки из палитры -2. Рисуйте мышью на карте (обязательно добавьте точку старта) -3. Нажмите "Экспорт JSON" - файл скачается автоматически - -## 🎨 Типы ячеек - -| Код | Тип | Описание | Цвет | Маркер | -|-----|-----|----------|------|--------| -| 0 | Дорога | Обычная дорога | Светло-серый | - | -| 1 | Камень | Препятствие (непроходимо) | Тёмно-серый | - | -| 2 | Снег | Замедление движения | Голубой | - | -| 3 | Лёд | Скользкая поверхность | Светло-голубой | - | -| 4 | Чекпоинт | Контрольная точка | Жёлтый | C | -| 5 | Старт | Точка старта | Зелёный | S | - -## 📖 Использование - -**Рисование:** -- Выберите тип ячейки из палитры -- Кликните на ячейку или удерживайте мышь для быстрого рисования - -**Экспорт/Импорт:** -- Экспорт: нажмите "Экспорт JSON" (также выводится в консоль F12) -- Импорт: нажмите "Импорт JSON" и выберите файл - -**Изменение размеров:** -- Укажите ширину и высоту (5-100), нажмите "Применить" -- Существующие данные сохранятся при изменении размера - -## 📄 Формат JSON - -```json -{ - "map": [ - [0, 0, 0, 1, 0], - [5, 1, 0, 1, 0], - [0, 0, 2, 2, 4], - [1, 0, 3, 3, 0], - [0, 0, 0, 0, 0] - ] -} -``` - -**Структура:** -- `map` - двумерный массив целых чисел (int[][]) -- Первая строка = верхняя строка карты -- Первый элемент в строке = левая ячейка -- Значения: 0-5 (типы ячеек) - -## 🔗 Интеграция с C# - -```csharp -using System.Text.Json; - -var json = File.ReadAllText("racing-map-15x15.json"); -var mapData = JsonSerializer.Deserialize(json); -int[][] map = mapData.map; - -public class MapData -{ - public int[][] map { get; set; } -} -``` - -## 🎯 Файлы проекта - -| Файл | Описание | -|------|----------| -| `index.html` | Главная страница редактора | -| `editor.js` | Логика редактора и визуализация | -| `open-editor.sh` | Скрипт для быстрого запуска | -| `demo-with-start.json` | Демонстрационная карта 15×15 | - -## 🎨 Особенности - -- ✅ Современный интерфейс, работает без сервера -- ✅ Интуитивное рисование мышью -- ✅ Валидация данных при импорте -- ✅ Автоматическое сохранение с именем по размеру -- ✅ HTML5 Canvas, Vanilla JavaScript (ES6+) - -## 🔗 Связанные проекты - -- [Визуализатор решений](../solution-player/) - анимация решений -- [Основной проект](../README.md) - C# решатель на основе A* - ---- - -**Технологии:** HTML5, CSS3, JavaScript ES6+, Canvas API diff --git a/map-editor/demo-with-start.json b/map-editor/demo-with-start.json deleted file mode 100644 index fd7f4ad..0000000 --- a/map-editor/demo-with-start.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "map": [ - [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 2, 4, 2, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 1, 1, 0], - [0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 2, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 2, 0], - [0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 2, 2, 2, 0], - [0, 0, 0, 0, 0, 3, 1, 3, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 4], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ] -} - - diff --git a/map-editor/editor.js b/map-editor/editor.js deleted file mode 100644 index 741331b..0000000 --- a/map-editor/editor.js +++ /dev/null @@ -1,290 +0,0 @@ -// Конфигурация редактора -const CELL_SIZE = 30; -const GRID_COLOR = '#dee2e6'; -const COLORS = { - 0: '#f8f9fa', // Дорога - 1: '#6c757d', // Камень - 2: '#e3f2fd', // Снег - 3: '#b3e5fc', // Лёд - 4: '#fff3cd', // Чекпоинт - 5: '#d4edda' // Старт -}; - -// Состояние редактора -let width = 15; -let height = 15; -let map = []; -let selectedType = 0; -let isDrawing = false; - -// Canvas элементы -const canvas = document.getElementById('mapCanvas'); -const ctx = canvas.getContext('2d'); - -// Инициализация -function init() { - width = parseInt(document.getElementById('width').value); - height = parseInt(document.getElementById('height').value); - initMap(); - resizeCanvas(); - drawMap(); -} - -// Инициализация карты -function initMap() { - map = Array(height).fill(null).map(() => Array(width).fill(0)); -} - -// Изменение размера canvas -function resizeCanvas() { - canvas.width = width * CELL_SIZE; - canvas.height = height * CELL_SIZE; -} - -// Отрисовка карты -function drawMap() { - ctx.clearRect(0, 0, canvas.width, canvas.height); - - // Рисуем ячейки - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - const cellType = map[y][x]; - ctx.fillStyle = COLORS[cellType]; - ctx.fillRect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE); - } - } - - // Рисуем сетку - ctx.strokeStyle = GRID_COLOR; - ctx.lineWidth = 1; - - // Вертикальные линии - for (let x = 0; x <= width; x++) { - ctx.beginPath(); - ctx.moveTo(x * CELL_SIZE, 0); - ctx.lineTo(x * CELL_SIZE, height * CELL_SIZE); - ctx.stroke(); - } - - // Горизонтальные линии - for (let y = 0; y <= height; y++) { - ctx.beginPath(); - ctx.moveTo(0, y * CELL_SIZE); - ctx.lineTo(width * CELL_SIZE, y * CELL_SIZE); - ctx.stroke(); - } - - // Рисуем маркеры для чекпоинтов и старта - ctx.font = 'bold 16px Arial'; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - if (map[y][x] === 4) { - ctx.fillStyle = '#856404'; - ctx.fillText('C', x * CELL_SIZE + CELL_SIZE / 2, y * CELL_SIZE + CELL_SIZE / 2); - } else if (map[y][x] === 5) { - ctx.fillStyle = '#155724'; - ctx.fillText('S', x * CELL_SIZE + CELL_SIZE / 2, y * CELL_SIZE + CELL_SIZE / 2); - } - } - } -} - -// Выбор типа ячейки -function selectCellType(type) { - selectedType = type; - - // Обновляем UI - document.querySelectorAll('.cell-type').forEach(el => { - el.classList.remove('active'); - }); - document.querySelector(`[data-type="${type}"]`).classList.add('active'); -} - -// Получение координат ячейки по клику -function getCellCoords(event) { - const rect = canvas.getBoundingClientRect(); - const x = Math.floor((event.clientX - rect.left) / CELL_SIZE); - const y = Math.floor((event.clientY - rect.top) / CELL_SIZE); - - if (x >= 0 && x < width && y >= 0 && y < height) { - return { x, y }; - } - return null; -} - -// Установка типа ячейки -function setCellType(x, y) { - if (x >= 0 && x < width && y >= 0 && y < height) { - map[y][x] = selectedType; - drawMap(); - } -} - -// Обработчики событий мыши -canvas.addEventListener('mousedown', (e) => { - isDrawing = true; - const coords = getCellCoords(e); - if (coords) { - setCellType(coords.x, coords.y); - } -}); - -canvas.addEventListener('mousemove', (e) => { - if (isDrawing) { - const coords = getCellCoords(e); - if (coords) { - setCellType(coords.x, coords.y); - } - } -}); - -canvas.addEventListener('mouseup', () => { - isDrawing = false; -}); - -canvas.addEventListener('mouseleave', () => { - isDrawing = false; -}); - -// Изменение размера карты -function resizeMap() { - const newWidth = parseInt(document.getElementById('width').value); - const newHeight = parseInt(document.getElementById('height').value); - - if (newWidth < 5 || newWidth > 100 || newHeight < 5 || newHeight > 100) { - alert('Размеры должны быть от 5 до 100'); - return; - } - - const newMap = Array(newHeight).fill(null).map(() => Array(newWidth).fill(0)); - - // Копируем существующие данные - const minHeight = Math.min(height, newHeight); - const minWidth = Math.min(width, newWidth); - - for (let y = 0; y < minHeight; y++) { - for (let x = 0; x < minWidth; x++) { - newMap[y][x] = map[y][x]; - } - } - - width = newWidth; - height = newHeight; - map = newMap; - - resizeCanvas(); - drawMap(); -} - -// Очистка карты -function clearMap() { - if (confirm('Вы уверены, что хотите очистить всю карту?')) { - initMap(); - drawMap(); - } -} - -// Экспорт карты в JSON -function exportMap() { - const data = { - map: map - }; - - const json = JSON.stringify(data, null, 2); - const blob = new Blob([json], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - - const a = document.createElement('a'); - a.href = url; - a.download = `racing-map-${width}x${height}.json`; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); - - // Также выводим в консоль для быстрого копирования - console.log('Экспортированная карта:', json); - alert('Карта экспортирована! JSON также выведен в консоль браузера (F12)'); -} - -// Импорт карты из JSON -function importMap(event) { - const file = event.target.files[0]; - if (!file) return; - - const reader = new FileReader(); - reader.onload = (e) => { - try { - const data = JSON.parse(e.target.result); - - if (!data.map || !Array.isArray(data.map)) { - throw new Error('Неверный формат: отсутствует массив map'); - } - - const newMap = data.map; - - // Валидация - if (!newMap.every(row => Array.isArray(row))) { - throw new Error('Неверный формат: map должен быть двумерным массивом'); - } - - const newHeight = newMap.length; - const newWidth = newMap[0].length; - - if (newHeight < 5 || newHeight > 100 || newWidth < 5 || newWidth > 100) { - throw new Error('Размеры карты должны быть от 5 до 100'); - } - - if (!newMap.every(row => row.length === newWidth)) { - throw new Error('Все строки должны иметь одинаковую длину'); - } - - // Проверка значений ячеек - const validValues = [0, 1, 2, 3, 4, 5]; - for (let y = 0; y < newHeight; y++) { - for (let x = 0; x < newWidth; x++) { - if (!validValues.includes(newMap[y][x])) { - throw new Error(`Недопустимое значение ячейки: ${newMap[y][x]} на позиции [${y}][${x}]`); - } - } - } - - // Импортируем карту - height = newHeight; - width = newWidth; - map = newMap; - - // Обновляем UI - document.getElementById('width').value = width; - document.getElementById('height').value = height; - - resizeCanvas(); - drawMap(); - - alert('Карта успешно импортирована!'); - } catch (error) { - alert('Ошибка при импорте: ' + error.message); - console.error('Ошибка импорта:', error); - } - }; - - reader.readAsText(file); - - // Сброс input для возможности повторного импорта того же файла - event.target.value = ''; -} - -// Обработчики изменения размеров -document.getElementById('width').addEventListener('keypress', (e) => { - if (e.key === 'Enter') resizeMap(); -}); - -document.getElementById('height').addEventListener('keypress', (e) => { - if (e.key === 'Enter') resizeMap(); -}); - -// Инициализация при загрузке страницы -init(); diff --git a/map-editor/index.html b/map-editor/index.html deleted file mode 100644 index 00903ff..0000000 --- a/map-editor/index.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - Редактор карт - Гонки на бумаге - - - -
-

🏁 Редактор карт

-

Гонки на бумаге / Paper Racing

- -
-
-

📐 Размеры карты

-
-
- - -
-
- - -
-
-
- - -
-
- -
-

🎨 Тип ячейки

-
-
- Дорога - (0) -
-
- Камень - (1) -
-
- Снег - (2) -
-
- Лёд - (3) -
-
- Чекпоинт - (4) -
-
- Старт - (5) -
-
-
- -
-

💾 Импорт / Экспорт

-
- - -
- -
-
- -
- -
- -
- 💡 Подсказки: - • Кликайте по ячейкам для изменения типа
- • Удерживайте кнопку мыши для рисования
- • Экспортируйте карту в JSON для использования в игре
- • Для визуализации решений используйте отдельный Визуализатор решений -
- -
-

📖 Легенда цветов

-
-
-
- Дорога (0) -
-
-
- Камень (1) -
-
-
- Снег (2) -
-
-
- Лёд (3) -
-
-
- Чекпоинт (4) -
-
-
- Старт (5) -
-
-
-
- - - - - diff --git a/map-editor/open-editor.sh b/map-editor/open-editor.sh deleted file mode 100755 index 8910052..0000000 --- a/map-editor/open-editor.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# Скрипт для открытия редактора карт в браузере - -echo "🗺️ Редактор карт - Гонки на бумаге" -echo "==================================" -echo "" - -# Определяем путь к редактору -EDITOR_PATH="$(cd "$(dirname "$0")" && pwd)/index.html" - -# Пытаемся открыть в браузере -if command -v xdg-open > /dev/null; then - echo "Открываю редактор в браузере по умолчанию..." - xdg-open "$EDITOR_PATH" -elif command -v firefox > /dev/null; then - echo "Открываю редактор в Firefox..." - firefox "$EDITOR_PATH" -elif command -v google-chrome > /dev/null; then - echo "Открываю редактор в Chrome..." - google-chrome "$EDITOR_PATH" -elif command -v chromium > /dev/null; then - echo "Открываю редактор в Chromium..." - chromium "$EDITOR_PATH" -else - echo "❌ Не найден браузер для автоматического открытия" - echo "" - echo "Откройте файл вручную:" - echo " $EDITOR_PATH" -fi - -echo "" -echo "✅ Редактор готов к использованию!" -echo "" -echo "💡 Подсказки:" -echo " • Кликайте по ячейкам для изменения типа" -echo " • Удерживайте кнопку мыши для рисования" -echo " • Экспортируйте карту в JSON для использования в игре" -echo "" -echo "📖 Документация: README.md" - - diff --git a/racing-tools/demo-with-start-solution.json b/racing-tools/demo-with-start-solution.json index 404ef99..329f733 100644 --- a/racing-tools/demo-with-start-solution.json +++ b/racing-tools/demo-with-start-solution.json @@ -24,6 +24,10 @@ 0, 2 ], + [ + 0, + -1 + ], [ 0, -1 diff --git a/racing-tools/editor.html b/racing-tools/editor.html index bc7ec66..ba5843d 100644 --- a/racing-tools/editor.html +++ b/racing-tools/editor.html @@ -8,75 +8,80 @@
-

🏁 Редактор карт

-

Гонки на бумаге / Paper Racing

- - - -
-
-

📐 Размеры карты

-
-
- - -
-
- - -
-
-
- - -
+
+
+

🏁 Гонки на бумаге

+

Редактор карт

- -
-

🎨 Тип ячейки

-
-
- Дорога - (0) -
-
- Камень - (1) -
-
- Снег - (2) -
-
- Лёд - (3) -
-
- Чекпоинт - (4) -
-
- Старт - (5) -
-
-
- -
-

💾 Импорт / Экспорт

-
- - -
- +
-
- +
+ + +
+ +
@@ -86,36 +91,6 @@ • Экспортируйте карту в JSON для использования в игре
• Для визуализации решений используйте Визуализатор решений
- -
-

📖 Легенда цветов

-
-
-
- Дорога (0) -
-
-
- Камень (1) -
-
-
- Снег (2) -
-
-
- Лёд (3) -
-
-
- Чекпоинт (4) -
-
-
- Старт (5) -
-
-
diff --git a/racing-tools/player.html b/racing-tools/player.html index 45b991b..5f1f1ea 100644 --- a/racing-tools/player.html +++ b/racing-tools/player.html @@ -8,64 +8,105 @@
-

🎬 Визуализатор решений

-

Гонки на бумаге / Paper Racing

- - - -
-
-

📂 Загрузка файлов

-
- - -
- - +
+
+

🎬 Гонки на бумаге

+

Визуализатор решений

+
+
-
- -
+
+