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

127 lines
6.6 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 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)
- Набор посещенных чекпоинтов
Это позволяет алгоритму эффективно отслеживать уже исследованные состояния и избегать повторной обработки.