Войти Создать аккаунт

Войдите, чтобы продолжить.

Игра «Сокобан» · Шаг 4 из 6

Отмена хода

В «Сокобане» ошибаются постоянно: толкнул не туда — и ящик в углу. Нужна отмена. Писать её внутри хода не хочется — ход и так непрост. Её можно навесить снаружи декоратором: обёртка зовёт настоящий ход и запоминает, как было до него.

Что сделать

Навесьте на ход отмену снаружи — декоратором, не трогая сам ход.

Что приходит

  • hod — функция хода из шага 2: (igrok, yashchiki, steny, kuda) → пара

Что вернуть

Обёртку, которая ходит как hod; перед ходом, что-то поменявшим, дописывает в istoriya пару «как было»; otmenit() снимает её с конца, история пуста — None.

Допишите функцию s_otmenoy в редакторе справа. Результат верните через return — то, что напечатано, на проверку не влияет.

В игре

Игра заворачивает ход второго шага в ваш декоратор, а пробел зовёт otmenit() и возвращает поле как было. Решите шаг — и ошибочный толчок можно будет отменить, хоть до самого начала уровня.

Без этого шага: отмены нет — пробел ничего не делает.

Пример

В проверке вместо настоящего хода — подмена vpravo, которая умеет ходить только вправо. Обёрнутый ход вправо переводит кладовщика из (1, 1) в (1, 2) — что-то поменялось, и в истории появляется ((1, 1), [(5, 5)]). Ход влево подмена не делает — ничего не поменялось, в историю он не идёт. Первая otmenit() возвращает ((1, 1), [(5, 5)]), вторая — None: история пуста.

Готовая игра →

Ctrl+Enter — проверить

Обсуждение

Вопросов пока нет.

Войдите, чтобы спросить.