diff --git a/ProgramWebService.cs b/ProgramWebService.cs
index a23562b..3b056f0 100644
--- a/ProgramWebService.cs
+++ b/ProgramWebService.cs
@@ -276,7 +276,7 @@ namespace PaperRacing.WebService
// Запускаем сервер
var port = Environment.GetEnvironmentVariable("PORT") ?? "5000";
Console.WriteLine("╔════════════════════════════════════════════════════════════╗");
- Console.WriteLine("║ Paper Racing A* Solver - Web Service ║");
+ Console.WriteLine("║ Paper Racing A* Solver - Web Service ║");
Console.WriteLine("╚════════════════════════════════════════════════════════════╝");
Console.WriteLine($"\n🚀 Server starting on http://localhost:{port}");
Console.WriteLine($"\nEndpoints:");
diff --git a/TEST-RESULTS.md b/TEST-RESULTS.md
index e446b8f..1e08653 100644
--- a/TEST-RESULTS.md
+++ b/TEST-RESULTS.md
@@ -1,10 +1,11 @@
-# Результаты тестирования A* алгоритма с новыми правилами
+# Результаты тестирования A* алгоритма
-## Новые правила
-1. **Препятствия**: Можно проезжать через камни, но нельзя на них останавливаться
-2. **Снег (тип 2)**: Ускорение ограничено диапазоном от -1 до +1
-3. **Лёд (тип 3)**: Ускорение нельзя менять (только сохранение текущей скорости)
-4. **Обычная дорога (тип 0)**: Ускорение от -2 до +2
+## Правила
+1. **Обычная дорога (0)**: Ускорение от -2 до +2
+2. **Препятствия (1)**: Можно проезжать через камни, но нельзя на них останавливаться
+3. **Снег (2)**: Ускорение ограничено диапазоном от -1 до +1
+4. **Лёд (3)**: Ускорение нельзя менять (только сохранение текущей скорости)
+5. **Чекпоинт (4)**: Ускорение от -2 до +2
## Тестовые карты
diff --git a/racing-tools/README.md b/racing-tools/README.md
index 9d30d01..07bb25a 100644
--- a/racing-tools/README.md
+++ b/racing-tools/README.md
@@ -292,3 +292,5 @@ racing-tools/
**Лицензия:** MIT
**Автор:** Racing Team
+
+
diff --git a/racing-tools/open-editor.sh b/racing-tools/open-editor.sh
index 1be44a9..a40ca0c 100755
--- a/racing-tools/open-editor.sh
+++ b/racing-tools/open-editor.sh
@@ -41,3 +41,5 @@ echo " • Нарисуйте карту, обязательно добавьт
echo " • Экспортируйте в JSON для использования в решателе"
echo " • Для визуализации решений откройте ./open-player.sh"
+
+
diff --git a/racing-tools/open-player.sh b/racing-tools/open-player.sh
index c2429c1..47acc3e 100755
--- a/racing-tools/open-player.sh
+++ b/racing-tools/open-player.sh
@@ -42,3 +42,5 @@ echo " • Затем загрузите решение (🎬 Загрузит
echo " • Используйте кнопки управления для анимации"
echo " • Демо-файлы: demo-with-start.json и demo-with-start-solution.json"
+
+
diff --git a/racing-tools/player.html b/racing-tools/player.html
index 5f1f1ea..b62d097 100644
--- a/racing-tools/player.html
+++ b/racing-tools/player.html
@@ -25,10 +25,12 @@
diff --git a/racing-tools/player.js b/racing-tools/player.js
index d6b9498..84f3dd4 100644
--- a/racing-tools/player.js
+++ b/racing-tools/player.js
@@ -287,6 +287,9 @@ function loadMap(event) {
resizeCanvas();
drawMap();
+ // Включаем кнопку "Найти решение" после загрузки карты
+ document.getElementById('solveBtn').disabled = false;
+
document.getElementById('loadMapBtn').textContent = '✓ Карта загружена';
setTimeout(() => {
document.getElementById('loadMapBtn').textContent = '📂 Загрузить карту';
@@ -505,6 +508,125 @@ function clearVisualization() {
drawMap();
}
+// Решение карты через API
+async function solveMap() {
+ const solveBtn = document.getElementById('solveBtn');
+ const statusDiv = document.getElementById('solverStatus');
+
+ // Проверяем, что карта загружена
+ if (!map || map.length === 0) {
+ alert('⚠️ Сначала загрузите карту!');
+ return;
+ }
+
+ // Находим стартовую позицию
+ startPosition = findStartPosition(map, width, height);
+ if (!startPosition) {
+ alert('⚠️ На карте не найдена точка старта (тип 5)!');
+ return;
+ }
+
+ // Проверяем наличие чекпоинтов
+ let hasCheckpoint = false;
+ for (let y = 0; y < height; y++) {
+ for (let x = 0; x < width; x++) {
+ if (map[y][x] === 4) {
+ hasCheckpoint = true;
+ break;
+ }
+ }
+ if (hasCheckpoint) break;
+ }
+
+ if (!hasCheckpoint) {
+ alert('⚠️ На карте нет чекпоинтов (тип 4)!');
+ return;
+ }
+
+ // Отключаем кнопку и показываем статус
+ solveBtn.disabled = true;
+ solveBtn.textContent = '⏳ Поиск решения...';
+ statusDiv.innerHTML = '
⏳ Отправка запроса на сервер...
';
+
+ try {
+ const requestData = {
+ map: map,
+ maxIterations: 5000000
+ };
+
+ const response = await fetch('http://localhost:5000/solve', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(requestData)
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const result = await response.json();
+
+ if (result.success) {
+ // Успешно найдено решение
+ const stats = result.statistics;
+ statusDiv.innerHTML = `
+
✅ Решение найдено!
+
+ 📊 Шагов: ${stats.steps}
+ 🎯 Чекпоинтов: ${stats.checkpoints}
+ ⚡ Макс. скорость: ${stats.maxSpeed}
+ ⏱️ Время: ${stats.computeTimeSeconds.toFixed(2)}s
+
+ `;
+
+ // Загружаем решение напрямую
+ solution = result.solution;
+ trajectory = simulateTrajectory(solution, startPosition);
+ currentStep = 0;
+
+ // Обновляем состояние кнопок и информацию
+ updateControlsState();
+ updateStepInfo();
+ drawMap();
+
+ // Автоматически начинаем воспроизведение
+ setTimeout(() => {
+ playVisualization();
+ }, 500);
+
+ } else {
+ // Решение не найдено
+ statusDiv.innerHTML = `
+
❌ Решение не найдено
+
${result.error || 'Неизвестная ошибка'}
+ `;
+ }
+ } catch (error) {
+ console.error('Ошибка при решении карты:', error);
+
+ if (error.message.includes('Failed to fetch') || error.message.includes('NetworkError')) {
+ statusDiv.innerHTML = `
+
❌ Сервер недоступен
+
+ Убедитесь, что сервер запущен:
+ ./run-webservice.sh
+
+ `;
+ } else {
+ statusDiv.innerHTML = `
+
❌ Ошибка
+
${error.message}
+ `;
+ }
+ } finally {
+ // Включаем кнопку обратно
+ solveBtn.disabled = false;
+ solveBtn.textContent = '🧠 Найти решение';
+ }
+}
+
canvas.addEventListener('mousedown', (e) => {
if (e.button === 2 || e.shiftKey) {
isPanning = true;