Игра «Пятнашки» · Шаг 4 из 5
Перемешать ходами
Случайная раскладка — это часто сто ходов до сборки, а для разминки хочется попроще. Есть честный способ: взять собранное поле и сделать двадцать случайных ходов. Такая раскладка решаема наверняка — назад её ведут те же двадцать ходов. Только ход «туда-обратно» тратить нельзя: он ничего не мешает.
Что сделать
Выберите цепочку случайных ходов для перемешивания: каждый раз — из возможных стрелок, но не ту, что отменяет прошлый ход.
Что приходит
pole— поле списком рядов,0— пустая клетка; его не меняйтеhodov— сколько ходов выбратьsluchay— генератор случайностей, какrandom.Random
Что вернуть
Список стрелок длиной hodov — по порядку, как их нажимать.
Допишите функцию sluchaynye_hody в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Игра зовёт sluchaynye_hody на пробел: двадцать ходов от собранного поля — лёгкая партия для разминки, а плитки по этим ходам двигает ваш шаг 1. Решите шаг — и пробел начнёт перемешивать.
Без этого шага: пробел не перемешивает лёгкую партию.
У собранной «восьмёрки» пустая клетка в правом нижнем углу: возможны только «вниз» и «вправо» — плитки сверху и слева. Генератор выбирает из ["vniz", "vpravo"], пустая клетка сдвигается, и выбор повторяется — уже без стрелки, которая вернула бы плитку назад.
import random
sluchaynye_hody([[1, 2, 3], [4, 5, 6], [7, 8, 0]], 5, random.Random(7))
['vpravo', 'vniz', 'vlevo', 'vverh', 'vpravo']
Стрелка двигает плитку в пустую клетку, как в шаге 1: при "vverh" поднимается плитка под пустой — и пустая клетка уходит на ряд вниз; при "vniz" пустая уходит вверх, при "vlevo" — вправо, при "vpravo" — влево. Стрелка возможна, если плитка с нужной стороны есть.
На каждом ходе соберите список возможных стрелок в порядке "vverh", "vniz", "vlevo", "vpravo", уберите из него стрелку, отменяющую прошлый выбранный ход ("vverh" ↔ "vniz", "vlevo" ↔ "vpravo"), и выберите одну через sluchay.choice(список). Потом сдвиньте пустую клетку и переходите к следующему ходу.
Двигать плитки не нужно — достаточно следить, где пустая клетка. Поле не меньше 2×2: хоть одна стрелка всегда остаётся.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.