Лучший способ сохранить игровые состояния доски 2048 при использовании игрового дерева в python

У меня есть минимаксная функция, которая может предсказать, является ли ход в 2048 году хорошим ходом или нет, и дать ему оценку. Однако единственное, чего не хватает, - это запоминания каждого состояния в игре.

Например, если вы сдвинете доску вверх (что эквивалентно нажатию на клавиатуре), как я в конечном итоге смогу вернуться в это игровое состояние, когда мне нужно вернуться вглубь и сдвинуть исходное состояние вправо? Какой лучший способ сделать это?

Сама доска хранится в виде 2d массива fyi.

2 ответа

Решение

Каждый переход состояния на 2048 год целиком содержится в двух событиях:

1- предыдущий ход
2- расположение и стоимость новой плитки

Если вы знаете начальную доску (первые две плитки сгенерированы случайным образом) и последовательность переходов, вы можете восстановить состояние доски на любом этапе игры.

Структура данных для хранения этого начального состояния и последовательность событий могут быть такими же простыми, как список кортежей.

Другими словами, способ приблизиться к "возвращению во времени" больше похож на "перезапуск времени вперед, пока вы не достигнете состояния, которое хотите наблюдать". Это называется источником событий, и в некоторой степени это то, что делает граф Git, что делает регистр криптовалют, и, вероятно, то, что бухгалтерское программное обеспечение будет делать в будущем.

вот хорошее видео, представляющее источник событий

В вашем конкретном случае, если вы действительно хотите отменить или откатить последние несколько ходов, лучше всего подойдет шаблон сувенира:
Простой способ - сохранить каждое последовательное состояние в списке / массиве и извлечь состояние на каждом шаге из индекса состояния в последовательности; Вы также можете легко ограничить количество шагов, чтобы сохранить последние n ходов, если хотите.

На доске 2048 есть 16 квадратов, каждый из которых содержит степень 2 от 2^1 до 2^11. В общем, для сохранения числа от 1 до 11 требуется 4 бита, поэтому для сохранения состояния игры в виде 16 чисел от 1 до 11 требуется всего 16*4 = 64 бита.

64 бита - это не много, поэтому вы можете хранить каждое игровое состояние напрямую, вместо того, чтобы использовать что-то более косвенное и сложное. Вы можете закодировать его в bytes 8 байт, 16-символьный гекс stringили длинное целое число. Длинное целое число (long в питоне 2 или int в Python 3), вероятно, станет самым компактным и простым в работе.

Другие вопросы по тегам