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