Сохранение состояния игры в стиле roguelike?

11

Я работаю над простым языком, используя HTML5 и jQuery, и столкнулся с проблемой.

В нынешнем состоянии игры система сохраняет состояние игры только каждый раз, когда пользователь перемещается между этажами, чтобы минимизировать накладные расходы. Опасность заключается в том, что, если пользователь попадает в беду, он может просто закрыть окно и вернуться к своей игре в начале текущего этажа. Это резко снижает сложность игры (и почти полностью лишает цели «мошенничества»), но нецелесообразно сохранять игровое состояние при каждом движении или атаке одного игрока.

Я исследовал способы сохранения состояния игры при закрытии окна браузера, но я не доволен ими. У меня такой вопрос: если предположить, что «сохранение игрового состояния» означает умеренно тяжелый запрос ajax / post, как мне помешать этому обману? Существует ли известная методология количественного определения пошаговых / процедурных изменений в 2D-карте, в отличие от сохранения всего состояния карты? Обратите внимание, я не прошу «самый эффективный способ» - я ищу существующие методологии, чтобы исправить мою неопытность.

CodeMoose
источник
Очень общий и общий вопрос программирования на JavaScript. Я проголосовал вниз, но потом переосмыслил, так как это довольно интересно, если вы подумаете, как бы вы это сделали, если бы не могли вызвать событие при выгрузке.
Тим Холт
Может быть, я перефразирую это, чтобы решить эту проблему напрямую =)
CodeMoose,
@TimHolt - отредактировано по вашему предложению
CodeMoose,

Ответы:

8

Очевидное решение состоит в том, чтобы отправить каждую команду игрока на сервер, когда она сделана, и сервер регистрирует их; таким образом, если игра прервана по какой-либо причине, зарегистрированные команды могут быть воспроизведены, чтобы восстановить игру до точки, в которой она была остановлена.

Конечно, при правильном сохранении старый журнал команд можно выбросить (хотя вы также можете сохранить его, чтобы разрешить повторы старых игр; если вы это сделаете, вы можете включить временные метки в журнал для воспроизведения в реальном времени). ). Вы также можете автоматически выполнить полное сохранение после того , как после последнего сохранения было выполнено n команд (где, скажем, n = 1000), чтобы избежать чрезмерно длинных повторов, если игрок остается на одном уровне слишком долго до закрытия или сбоя игры. ,

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

Обратите внимание, что все эти методы могут быть использованы путем вмешательства в клиент, но это действительно неизбежно, когда у вас есть игровая логика на клиенте. В качестве надежной альтернативы вы можете запустить саму игру на сервере и просто заставить клиента отправлять все команды игрока на сервер и получать обновления дисплея обратно. Для мошенников это вполне возможно. Очевидно, это также решило бы проблему сохранения состояния (хотя вы все равно могли бы реализовать какую-либо форму регистрации команд на сервере, как для функции воспроизведения, так и для восстановления после сбоев сервера). Недостатком является то, что выполнение этого сделает невозможным автономное воспроизведение (если, конечно, вы также не сделаете серверный код доступным для игроков, чтобы они могли работать локально, если они этого хотят).

Илмари Каронен
источник
1
AFAIK все RGN являются псевдослучайными ... вам нужно специализированное оборудование, чтобы получить действительно (не заданные) случайные значения.
Бобобобо
1
@bobobobo есть псевдослучайные (сеяные) и криптографически безопасные случайные числа (не заданные) в .Net Platform. Это может / не может быть аппаратно случайным, но это достаточно близко, чтобы не иметь возможности просто хранить начальное число.
Rangoric
2

См. Https://stackoverflow.com/questions/3888902/javascript-detect-browser-close-tab-close-browser для более общего вопроса о том же вопросе.

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

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

Тим Холт
источник
Спасибо, Тим, - как только я вхожу в образ мышления разработчика игры, очень легко объединить все, что касается его, с разработчиком игры. Реквизит для предоставления ответа в любом случае.
CodeMoose,
Не беспокойтесь - смотрите мой исправленный комментарий к вопросу :)
Тим Холт
Я бы сказал, добавочные дельты на каждом ходу тоже.
Бобобобо
2

Подходы к не постепенному сохранению, а поиску времени для полного сохранения:

  • onunload, как упоминалось ранее. Я нашел это, чтобы быть надежным (но используя localStorage, а не сеть, которая может изменить ситуацию).
  • Сохранить, когда ваше окно теряет фокус.
  • Периодически сохраняйте: когда последнее сохранение не было в течение n минут, и пользователь не сделал никакого ввода в m секундах.
Кевин Рид
источник