Игра «2048» · Шаг 3 из 5
Сдвиг в любую сторону
Сжимать умеем только влево, поворачивать — только по часовой. Этого хватает на все четыре стрелки: повернуть поле так, чтобы нужная сторона оказалась слева, сжать каждый ряд и повернуть обратно. Обе умелки приходят аргументами — шаг сам их не пишет.
Что сделать
Сдвиньте всё поле в нужную сторону — поворотами и сжатием влево, без четырёх отдельных сдвигов.
Что приходит
pole— поле, список рядов; менять его нельзяkuda— направление:"vlevo","vniz","vpravo"или"vverh"szhat_ryad— ваш шаг 1, приходит аргументомpovernut— ваш шаг 2, приходит аргументом
Что вернуть
Пару (новое поле, очки): поле повёрнуто так, чтобы сторона оказалась слева, каждый ряд сжат, поле повёрнуто обратно; очки — сумма по рядам.
Допишите функцию sdvig в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Игра зовёт sdvig на каждую стрелку. Если поле не изменилось, ход не считается. Решите шаг — и плитки поедут во все четыре стороны.
Без этого шага: работает только «влево».
Поле 4×4, стрелка «влево». Поворачивать для неё не нужно, остаётся сжать каждый ряд: [0, 2, 0, 4] становится [2, 4, 0, 0], нижний ряд [0, 0, 2, 2] — [2, 2, 0, 0]. Функция возвращает новое поле и 0 очков.
В проверке вместо ваших первых шагов стоят подмены: szhat только прижимает плитки влево, без слияний и без очков, а povernut падает, если его позвали, — для «влево» поворот не нужен.
Функция принимает поле, направление («vlevo», «vniz», «vpravo», «vverh») и две функции: szhat_ryad (как в шаге 1: ряд → пара «новый ряд, очки») и povernut (как в шаге 2: поворот по часовой).
- Поле поворачивается k раз: «vlevo» — 0, «vniz» — 1, «vpravo» — 2, «vverh» — 3.
- Каждый ряд сжимается
szhat_ryad. - Поле поворачивается ещё
(4 − k) % 4раз — на место.
Возвращает пару: новое поле и очки — сумму очков всех рядов. Переданное поле не меняется.
Образцовый тест целиком
def szhat(ryad):
chisla = [x for x in ryad if x]
return chisla + [0] * (len(ryad) - len(chisla)), 0
def povernut(pole):
raise AssertionError("для «влево» поворачивать не нужно")
sdvig([[0, 2, 0, 4], [8, 0, 0, 0], [0, 0, 0, 0], [0, 0, 2, 2]], "vlevo", szhat, povernut)
([[2, 4, 0, 0], [8, 0, 0, 0], [0, 0, 0, 0], [2, 2, 0, 0]], 0)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.