Практика: Робот
Робот
Введение
В этой работе вам предстоит управлять учебным графическим исполнителем "Робот".
Робот живёт на прямоугольном клеточном поле, по периметру огороженном стенами. Между клетками тоже могут встречаться стены.
Возможные состояния клетки:
- пустая;
- помечена для закрашивания;
- закрашена.
- клетка, отмеченная чёрной точкой, куда робот должен прийти после выполнения алгоритма.
Команды робота
Команда | Описание |
---|---|
move_left(n=1) | Пройти n клеток влево (по умолчанию n = 1) |
move_right(n=1) | Пройти n клеток вправо (по умолчанию n = 1) |
move_up(n=1) | Пройти n клеток вверх (по умолчанию n = 1) |
move_down(n=1) | Пройти n клеток вниз (по умолчанию n = 1) |
wall_is_above() | если сверху стена, возвращает True, иначе — False |
wall_is_beneath() | если снизу стена, возвращает True, иначе — False |
wall_is_on_the_left() | если слева стена, возвращает True, иначе — False |
wall_is_on_the_right() | если справа стена, возвращает True, иначе — False |
fill_cell() | Закрасить текущую клетку |
cell_is_filled() | Возвращает True, если текущая клетка закрашена |
mov(r, v) | Поместить значение v в регистр r |
Как запустить Робота
Скачайте и разархивируйте файлы Робота в любое место в своей домашней папке.
Увидеть условие первой задачи можно, запустив в этой папке из консоли
python3 task_1.py
Решение пишется прямо в файл task_1.py
, который можно открыть любым текстовым редактором (например, gedit или PyCharm).
Для быстрой самопроверки ваших решений в этой папке есть файл all_tasks.py
, который запустит все программы подряд и проверит их корректность.
Как решать задачи для Робота
Для решения каждой задачи, если больше ничего не сказано, требуется выполнить условия:
- закончить выполнение в клетке с чёрной точкой;
- закрасить все бирюзовые клетки;
- ни разу не врезаться в стену.
В итоге Робот может оказаться в одном из четырёх состояний.
Состояние №1: задача решена
#!/usr/bin/python3
from pyrob.api import *
@task
def example1():
for i in range(9):
move_right()
move_down()
if __name__ == '__main__':
run_tasks()

Состояние №2: задача не решена, завершение штатное
#!/usr/bin/python3
from pyrob.api import *
@task
def example1():
for i in range(4):
move_right()
move_down()
if __name__ == '__main__':
run_tasks()

Состояние №3: ошибка времени выполнения
#!/usr/bin/python3
from pyrob.api import *
@task
def example1():
for i in range(9):
move_right()
move_down()
if i == 6:
z = 1 / 0
if __name__ == '__main__':
run_tasks()

Состояние №4: робот врезался в стену
#!/usr/bin/python3
from pyrob.api import *
@task
def example1():
for i in range(10):
move_right()
move_down()
if __name__ == '__main__':
run_tasks()

Циклы, вложенные в условия
Задача №15: task_8_21
Перейти в противоположный угол. В начальный момент робот находится в углу, но не известно, в каком.

Задача №16: task_8_22
Дойти до конца тупика. Тупик имеет форму буквы Г (влево или вправо). Размеры тупика не известны.

Задача №17: task_8_27
Перейти на вторую закрашенную клетку. Клетка может быть как справа, так и слева.

Задача №19: task_8_29
Выйти из ловушки. Выход может находиться как справа, так и слева. Выхода может не быть, в этом случае остановиться в правом тупике.

Использование переменных-флагов и переменных-счётчиков
Обратите внимание на то, что в этих задачах ситуативное поведение Робота не может решить задачу. В задачах требуется запомнить состояние или посчитать количество определённых клеток. Используйте для этого переменные.
Задача №27: task_7_5
Закрасить клетки с увеличивающимся интервалом. Расстояние до стены не известно.

Задача №28: task_7_6
Остановится на пятой закрашенной клетке. Количество закрашенных клеток не известно, но точно больше пяти.

Задача №29: task_7_7
Остановится на третьей подряд закрашенной клетке. Если нет трёх подряд закрашенных клеток, то остановиться у правой стены. Расстояние до стены не известно.

Задача №30: task_9_3
Закрасить поле «треугольниками». Размер поля не известен, но поле всегда квадратное с нечётным количество клеток по каждой стороне.

Задача №31: task_8_30
Добраться до нижнего уровня. Количество уровней не известно. Расстояние между стенами не известно. В каждой стене точно есть ровно один проём.

Задача №32: task_8_18
Закрасить отмеченные клетки. В регистр ax
записать количество клеток, которые были закрашены ещё до того, как робот начал двигаться. Количество и размеры коридоров не известны.
