Итоговое тестирование в скриптах
作者
##################################
# Наша логика обозначений на карте
##################################
стена = true; проезд = false;
не_посещали = 1; посетили = 2;
не_знаю = 1; здесь_стена = 2; можно_ехать = 3;
#####################################
# Функция перемещения робота по карте
#####################################
function шагаем( положение, направление, маршрут, изученная_карта, пройденная_карта, вся_карта )
конец_процедуры = false # Пока мы едем
пройденная_карта[ положение ] = посетили # Мы только приехали в эту точку
сенсоры = [положение + направление, положение + направление + поворот( направление, 90 ), положение + направление + поворот( направление, -90 )]
изученная_карта[ сенсоры ] = map( сенсор -> (вся_карта[сенсор] == стена ? здесь_стена : можно_ехать ), сенсоры )
# Если маршрут пуст, вычислим его
if length(маршрут) == 0
маршрут = get_path( положение, направление, изученная_карта, пройденная_карта )
# Если процедура ничего не вернула, значит достижимых неоткрытых точек больше нет
if length(маршрут) == 0 конец_процедуры = true;
else маршрут = маршрут[1:end-1]; end # А если маршрут есть, то он минимум в 2 точки длиной и первая -- координата робота
end;
if конец_процедуры == false
следующая_точка = маршрут[end];
точка_впереди = положение + направление
if точка_впереди != следующая_точка
# Проверим одно направление поворота. Если следующая точка там, то повернемся туда. Иначе повернемся в другом направлении
if положение + поворот( направление, 90 ) == следующая_точка направление = поворот( направление, 90 );
else направление = поворот( направление, -90 ); end;
else
if вся_карта[ точка_впереди ] == проезд
положение = точка_впереди;
if length(маршрут) > 0 pop!( маршрут ); end; # Если мы успешно двинулись вперед, удалим последнюю точку из маршрута
else
# Если маршрут нас привел в стену и мы "изучили" эту точку, то устраним ее из маршрута
if length(маршрут) > 0 pop!( маршрут ); end;
end
end
end
return положение, направление, маршрут, изученная_карта, пройденная_карта, конец_процедуры
end;