Практика: Робот
Робот
Введение
В этой работе вам предстоит управлять учебным графическим исполнителем "Робот".
Робот живёт на прямоугольном клеточном поле, по периметру огороженном стенами. Между клетками тоже могут встречаться стены.
Возможные состояния клетки:
- пустая;
- помечена для закрашивания;
- закрашена.
- клетка, отмеченная чёрной точкой, куда робот должен прийти после выполнения алгоритма.
Команды робота
Команда | Описание |
---|---|
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()
Просто последовательности команд
Задача №1: task_1_1
Дойти до конечной точки.
Задача №2: task_1_2
Дойти до конечной точки, закрасить одну клетку.
Условное исполнение
Задача №3: task_3_1
Дойти до стены. Расстояние до стены не известно.
Задача №4: task_3_3
С трёх сторон стены. Выйти в свободную сторону. Положение выхода не известно.
Циклы с условием
Задача №5: task_5_2
Дойти до конца стены. Расстояние не известно.
Задача №6: task_5_3
Дойти до конца стены. Расстояние не известно.
Задача №7: task_5_4
Обойти стену. Размеры стены и расстояние до неё неизвестны. Стена одна.
Задача №8: task_5_7
Выйти из коридора. Есть проёмы сверху или снизу.
Условные действия на каждой итерации цикла
Задача №9: task_8_2
Закрасить клетки. Расстояние до стены не известно.
Задача №10: task_8_3
Закрасить клетки. Расстояние до стены не известно.
Задача №11: task_8_4
Закрасить клетки. Расстояние до стены не известно.
Задача №12: task_8_6
Закрасить клетки. Расстояние до стены не известно.
Задача №13: task_8_10
Закрасить клетки. Расстояние до стены не известно.
Задача №14: task_8_11
Закрасить клетки. Расстояние до стены не известно.
Циклы, вложенные в условия
Задача №15: task_8_21
Перейти в противоположный угол. В начальный момент робот находится в углу, но не известно, в каком.
Задача №16: task_8_22
Дойти до конца тупика. Тупик имеет форму буквы Г (влево или вправо). Размеры тупика не известны.
Задача №17: task_8_27
Перейти на вторую закрашенную клетку. Клетка может быть как справа, так и слева.
Задача №18: task_8_28
Выйти из ловушки. Где находится выход, не известно.
Задача №19: task_8_29
Выйти из ловушки. Выход может находиться как справа, так и слева. Выхода может не быть, в этом случае остановиться в правом тупике.
Вложенные циклы
Задача №20: task_4_3
Закрасить отмеченные клетки.
Задача №21: task_4_11
Закрасить отмеченные клетки.
Задача №22: task_5_10
Закрасить всё поле. Размеры поля неизвестны.
Задача №23: task_6_6
Закрасить коридоры и вернуться. Количество и длины коридоров не известны.
Создание и использование подпрограмм
Задача №24: task_2_1
Закрасить клетки.
Задача №25: task_2_2
Закрасить клетки.
Задача №26: task_2_4
Закрасить клетки.
Использование переменных-флагов и переменных-счётчиков
Обратите внимание на то, что в этих задачах ситуативное поведение Робота не может решить задачу. В задачах требуется запомнить состояние или посчитать количество определённых клеток. Используйте для этого переменные.
Задача №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
записать количество клеток, которые были закрашены ещё до того, как робот начал двигаться. Количество и размеры коридоров не известны.