Я работаю над простым языком, используя HTML5 и jQuery, и столкнулся с проблемой.
В нынешнем состоянии игры система сохраняет состояние игры только каждый раз, когда пользователь перемещается между этажами, чтобы минимизировать накладные расходы. Опасность заключается в том, что, если пользователь попадает в беду, он может просто закрыть окно и вернуться к своей игре в начале текущего этажа. Это резко снижает сложность игры (и почти полностью лишает цели «мошенничества»), но нецелесообразно сохранять игровое состояние при каждом движении или атаке одного игрока.
Я исследовал способы сохранения состояния игры при закрытии окна браузера, но я не доволен ими. У меня такой вопрос: если предположить, что «сохранение игрового состояния» означает умеренно тяжелый запрос ajax / post, как мне помешать этому обману? Существует ли известная методология количественного определения пошаговых / процедурных изменений в 2D-карте, в отличие от сохранения всего состояния карты? Обратите внимание, я не прошу «самый эффективный способ» - я ищу существующие методологии, чтобы исправить мою неопытность.
источник
Ответы:
Очевидное решение состоит в том, чтобы отправить каждую команду игрока на сервер, когда она сделана, и сервер регистрирует их; таким образом, если игра прервана по какой-либо причине, зарегистрированные команды могут быть воспроизведены, чтобы восстановить игру до точки, в которой она была остановлена.
Конечно, при правильном сохранении старый журнал команд можно выбросить (хотя вы также можете сохранить его, чтобы разрешить повторы старых игр; если вы это сделаете, вы можете включить временные метки в журнал для воспроизведения в реальном времени). ). Вы также можете автоматически выполнить полное сохранение после того , как после последнего сохранения было выполнено n команд (где, скажем, n = 1000), чтобы избежать чрезмерно длинных повторов, если игрок остается на одном уровне слишком долго до закрытия или сбоя игры. ,
Если в вашей игре используются случайные числа (и, возможно, они похожи на мошенников), вам также необходимо убедиться, что они могут быть воссозданы правильно во время воспроизведения. Одним из решений является включение каждого случайного числа в журнал воспроизведения; Другой способ - использовать детерминированный генератор псевдослучайных чисел и сохранить начальное число при сохранении игры.
Обратите внимание, что все эти методы могут быть использованы путем вмешательства в клиент, но это действительно неизбежно, когда у вас есть игровая логика на клиенте. В качестве надежной альтернативы вы можете запустить саму игру на сервере и просто заставить клиента отправлять все команды игрока на сервер и получать обновления дисплея обратно. Для мошенников это вполне возможно. Очевидно, это также решило бы проблему сохранения состояния (хотя вы все равно могли бы реализовать какую-либо форму регистрации команд на сервере, как для функции воспроизведения, так и для восстановления после сбоев сервера). Недостатком является то, что выполнение этого сделает невозможным автономное воспроизведение (если, конечно, вы также не сделаете серверный код доступным для игроков, чтобы они могли работать локально, если они этого хотят).
источник
См. Https://stackoverflow.com/questions/3888902/javascript-detect-browser-close-tab-close-browser для более общего вопроса о том же вопросе.
Также подумайте о сохранении полной игры при смене пола и добавочных дельт при каждом движении. Затем вы можете переиграть игру до момента последнего хода.
Предполагая, что в некоторой степени используются генераторы случайных чисел, вы можете сгенерировать и повторно запустить генератор случайных чисел в начале каждого нового этажа, а затем сохранить его вместе с этажом. Затем вы можете перезаряжать при загрузке и должны быть в состоянии воспроизвести ходы с той же последовательностью вплоть до последнего выполненного.
источник
Подходы к не постепенному сохранению, а поиску времени для полного сохранения:
onunload
, как упоминалось ранее. Я нашел это, чтобы быть надежным (но используяlocalStorage
, а не сеть, которая может изменить ситуацию).источник