Лучший способ сохранить игровые состояния доски 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), вероятно, станет самым компактным и простым в работе.