checker
This commit is contained in:
@@ -17,6 +17,83 @@ let isPanning = false;
|
|||||||
let startPanX = 0;
|
let startPanX = 0;
|
||||||
let startPanY = 0;
|
let startPanY = 0;
|
||||||
|
|
||||||
|
// Функция обработки ошибок во время воспроизведения
|
||||||
|
function handlePlaybackError(message) {
|
||||||
|
alert(`❌ Ошибка воспроизведения: ${message}`);
|
||||||
|
pauseVisualization();
|
||||||
|
// Сбрасываем счёт, но не очищаем визуализацию
|
||||||
|
if (trajectory && trajectory.length > 0) {
|
||||||
|
trajectory.forEach(step => {
|
||||||
|
step.score = 0;
|
||||||
|
step.passedCheckpoints = 0;
|
||||||
|
});
|
||||||
|
updateStepInfo();
|
||||||
|
drawMap();
|
||||||
|
}
|
||||||
|
console.error('Ошибка воспроизведения:', message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция проверки корректности ускорения
|
||||||
|
function validateAcceleration(ax, ay, x, y, vx, vy) {
|
||||||
|
// Проверка выезда за границы карты
|
||||||
|
if (x < 0 || x >= width || y < 0 || y >= height) {
|
||||||
|
return `Выезд за границы карты на позиции (${x.toFixed(1)}, ${y.toFixed(1)})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получаем тип текущей ячейки
|
||||||
|
const cellX = Math.floor(x);
|
||||||
|
const cellY = Math.floor(y);
|
||||||
|
const cellType = map[cellY] ? map[cellY][cellX] : -1;
|
||||||
|
|
||||||
|
// Проверка правил для разных типов ячеек
|
||||||
|
switch (cellType) {
|
||||||
|
case 0: // Обычная дорога
|
||||||
|
if (ax < -2 || ax > 2 || ay < -2 || ay > 2) {
|
||||||
|
return `На дороге ускорение должно быть от -2 до +2, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // Камень
|
||||||
|
// Можно проезжать через камни, но нельзя на них останавливаться
|
||||||
|
if (vx === 0 && vy === 0 && ax === 0 && ay === 0) {
|
||||||
|
return `Нельзя останавливаться на камне на позиции (${cellX}, ${cellY})`;
|
||||||
|
}
|
||||||
|
if (ax < -2 || ax > 2 || ay < -2 || ay > 2) {
|
||||||
|
return `На камне ускорение должно быть от -2 до +2, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // Снег
|
||||||
|
if (ax < -1 || ax > 1 || ay < -1 || ay > 1) {
|
||||||
|
return `На снегу ускорение должно быть от -1 до +1, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // Лёд
|
||||||
|
if (ax !== 0 || ay !== 0) {
|
||||||
|
return `На льду нельзя менять ускорение, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // Чекпоинт
|
||||||
|
if (ax < -2 || ax > 2 || ay < -2 || ay > 2) {
|
||||||
|
return `На чекпоинте ускорение должно быть от -2 до +2, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // Старт
|
||||||
|
if (ax < -2 || ax > 2 || ay < -2 || ay > 2) {
|
||||||
|
return `На старте ускорение должно быть от -2 до +2, получено (${ax}, ${ay})`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return `Неизвестный тип ячейки ${cellType} на позиции (${cellX}, ${cellY})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null; // Нет ошибок
|
||||||
|
}
|
||||||
|
|
||||||
// Canvas элементы
|
// Canvas элементы
|
||||||
const canvas = document.getElementById('mapCanvas');
|
const canvas = document.getElementById('mapCanvas');
|
||||||
const ctx = canvas.getContext('2d');
|
const ctx = canvas.getContext('2d');
|
||||||
@@ -317,7 +394,25 @@ function playVisualization() {
|
|||||||
|
|
||||||
playbackInterval = setInterval(() => {
|
playbackInterval = setInterval(() => {
|
||||||
if (currentStep < trajectory.length - 1) {
|
if (currentStep < trajectory.length - 1) {
|
||||||
currentStep++;
|
const nextStep = currentStep + 1;
|
||||||
|
const current = trajectory[currentStep];
|
||||||
|
const next = trajectory[nextStep];
|
||||||
|
|
||||||
|
// Проверяем корректность ускорения для следующего шага
|
||||||
|
const error = validateAcceleration(next.ax, next.ay, current.x, current.y, current.vx, current.vy);
|
||||||
|
if (error) {
|
||||||
|
handlePlaybackError(`Шаг ${nextStep + 1}: ${error}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем корректность новой позиции
|
||||||
|
const positionError = validateAcceleration(0, 0, next.x, next.y, next.vx, next.vy);
|
||||||
|
if (positionError && positionError.includes('Выезд за границы')) {
|
||||||
|
handlePlaybackError(`Шаг ${nextStep + 1}: ${positionError}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentStep = nextStep;
|
||||||
updateStepInfo();
|
updateStepInfo();
|
||||||
drawMap();
|
drawMap();
|
||||||
} else {
|
} else {
|
||||||
@@ -350,7 +445,25 @@ function stepForward() {
|
|||||||
if (!trajectory || trajectory.length === 0) return;
|
if (!trajectory || trajectory.length === 0) return;
|
||||||
|
|
||||||
if (currentStep < trajectory.length - 1) {
|
if (currentStep < trajectory.length - 1) {
|
||||||
currentStep++;
|
const nextStep = currentStep + 1;
|
||||||
|
const current = trajectory[currentStep];
|
||||||
|
const next = trajectory[nextStep];
|
||||||
|
|
||||||
|
// Проверяем корректность ускорения для следующего шага
|
||||||
|
const error = validateAcceleration(next.ax, next.ay, current.x, current.y, current.vx, current.vy);
|
||||||
|
if (error) {
|
||||||
|
handlePlaybackError(`Шаг ${nextStep + 1}: ${error}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем корректность новой позиции
|
||||||
|
const positionError = validateAcceleration(0, 0, next.x, next.y, next.vx, next.vy);
|
||||||
|
if (positionError && positionError.includes('Выезд за границы')) {
|
||||||
|
handlePlaybackError(`Шаг ${nextStep + 1}: ${positionError}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentStep = nextStep;
|
||||||
updateStepInfo();
|
updateStepInfo();
|
||||||
drawMap();
|
drawMap();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user