Проверки обстановки: стены, закрашенность, измерители

Чтобы Робот не врезался в стену, он должен «видеть» обстановку. Разбираем все его проверки.

Условия Робота — это логические выражения вида «слева стена» или «клетка закрашена». Они дают да или нет и управляют ветвлениями и циклами.

Проверки стен

Робот умеет проверять, есть ли стена с каждой из четырёх сторон. Для каждой стороны есть две парные проверки — «стена» и «свободно»:

Есть стенаСвободно (стены нет)
слева стенаслева свободно
справа стенасправа свободно
сверху стенасверху свободно
снизу стенаснизу свободно

Каждая проверка возвращает логическое значение. справа свободно равно да, когда Робот может шагнуть вправо. По сути справа свободно — это то же самое, что не справа стена.

Проверки клетки

  • клетка закрашенада, если текущая клетка уже закрашена.
  • клетка чистаяда, если текущая клетка не закрашена.

Функции-измерители

В некоторых обстановках клетки имеют числовые характеристики, и Робот их измеряет:

  • температура — число (температура текущей клетки).
  • радиация — число (уровень радиации).

Эти функции возвращают вещ-значение, его можно сравнивать: температура > 0. На 15.1 ОГЭ они встречаются реже, чем проверки стен, но знать их полезно.

Логические операции: и, или, не

Проверки можно комбинировать. В КуМире логические операции — русские слова:

ОперацияСмыслПример
иоба условия вернысправа стена и снизу стена
илихотя бы одно вернослева стена или справа стена
неотрицаниене сверху стена

Например, условие «Робот в тупике-кармане, открытом только снизу» можно записать так:

слева стена и справа стена и сверху стена

Зачем это нужно: безопасный шаг

Главный смысл проверок — не дать Роботу разбиться. Перед движением проверяем, свободно ли:

использовать Робот
алг
нач
  если справа свободно
    то вправо
  всё
кон

Робот шагнёт вправо, только если справа нет стены. Это основа всех «умных» алгоритмов.

Имитация проверок на Python

Смоделируем поле и проверку «справа стена». Стену между клетками изобразим как границу поля: если Робот в крайнем правом столбце, справа — стена (край мира):

cols = 4
c = 3                       # Робот в крайнем правом столбце (индексы 0..3)

def sprava_stena():
    return c == cols - 1     # справа край поля = стена

def sprava_svobodno():
    return not sprava_stena()

print("справа стена:", sprava_stena())
print("справа свободно:", sprava_svobodno())

c = 1                       # переставим Робота в середину
print("теперь справа свободно:", not (c == cols - 1))

Вывод:

справа стена: True
справа свободно: False
теперь справа свободно: True

В крайнем правом столбце «справа стена» истинно, «справа свободно» ложно — ровно так же ведёт себя Робот у стены КуМира.

Попробуй сам

Запишите словами условие «вокруг Робота стены со всех сторон, кроме верха» через проверки и операции и/не. Ответ: слева стена и справа стена и снизу стена и не сверху стена (или … и сверху свободно).

Частые ошибки

  • Перепутать «стена» и «свободно» — и Робот пойдёт прямо в стену.
  • Забыть, что справа свободно = не справа стена — и написать двойное отрицание.
  • Сравнивать измеритель неправильным типом (температура — число, а не логическое значение).

Итог

  • Робот проверяет стены с четырёх сторон: … стена и … свободно.
  • Проверки клетки: клетка закрашена, клетка чистая.
  • Измерители: температура, радиация (числа).
  • Условия комбинируются операциями и, или, не.
Проверьте себя
1. Какое условие истинно, если Робот может сделать шаг вправо?
Aсправа стена
Bсправа свободно
Cклетка чистая
Dвправо да
2. Как записать «слева и справа стена одновременно»?
Aслева стена или справа стена
Bслева стена и справа стена
Cне слева стена и справа стена
Dслева справа стена
3. Что возвращает проверка «клетка закрашена»?
AЧисло закрашенных клеток
BЛогическое значение да/нет
CКоординаты клетки
DЦвет клетки
Поддержать проект