From b3597473c764cea020f2144352cdd98bfdf6c083 Mon Sep 17 00:00:00 2001 From: tactile Date: Fri, 9 Jan 2026 21:57:55 +0500 Subject: [PATCH] On main: temporary stash before history cleanup --- ProgramWebService.cs | 2 +- TEST-RESULTS.md | 13 ++-- racing-tools/README.md | 2 + racing-tools/open-editor.sh | 2 + racing-tools/open-player.sh | 2 + racing-tools/player.html | 2 + racing-tools/player.js | 122 ++++++++++++++++++++++++++++++++++++ 7 files changed, 138 insertions(+), 7 deletions(-) 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;