django: как смоделировать игру, в которой действия можно было узнать через некоторое время после их выполнения? - PullRequest
0 голосов
/ 05 ноября 2018

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


Давайте приведем пример: достаточно знать, что у каждого игрока есть денежный баланс, и если игрок A «убит» игроком B, то игрок B «украдет» все деньги у игрока A. Такие деньги могут быть использованы купить что-нибудь полезное в игре.

Предположим, что происходит следующее:

  • (15:00 - начальное состояние) A имеет 5 денег, B имеет 3 денег

  • (16:00 - Действие) B «убивает» A. Это действие вставляется на веб-сайт в 18:00

  • (17:00 - Действие) А покупает вещь за 4 деньги.

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

Вопрос : Есть ли у вас какие-либо предложения для такого дизайна?


Что я думал

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

class Event(models.Model):
    timestamp = models.DateTimeField()
    action = models.CharField(max_length=100)
    parameters = models.JSONField()

Что мне не нравится в таком подходе:

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

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

Я хотел бы иметь другие возможные варианты для такого варианта использования.


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

...