Использование шаблона Observer по сети для настольной игры - PullRequest
2 голосов
/ 27 ноября 2009

Я хочу создать сетевую настольную игру на основе Risk в C ++. Моя идея состояла в том, чтобы иметь центральный сервер, на котором размещено игровое лобби, где пользователи могут подключаться и создавать / присоединяться к играм. Шаблон Observer в этом случае кажется привлекательным, поскольку я мог бы разместить всю игровую модель / логику на сервере, а клиенты просто наблюдали бы за этим и отображали текущее состояние игры, используя представление.

Мой первый вопрос: возможен ли такой подход? Большинство из того, что я слышал / думал, - это то, что у клиентов есть свои модели игр. Однако я думаю, что для игры, которая не требует больших вычислительных ресурсов, у одной модели, размещенной на сервере, есть свои преимущества (нет проблем с синхронизацией, предотвращает мошенничество и т.

Мой второй вопрос: как мне поступить с реализацией шаблона Observer по сети? Поскольку я не могу сделать прямой вызов метода по сети, мне понадобится какой-то простой способ симулировать это с использованием данных. Будет ли больше преимуществ в использовании подхода «вытягивать» (наблюдатель запрашивает обновления игровых данных) или «выталкивать» (сервер передает новые обновленные данные всем клиентам)?

Ответы [ 4 ]

4 голосов
/ 28 июля 2010

Судя по формулировке проблемы, вам необходимо реализовать шаблон Distributed Observer или распределенную публикацию / подписку. PubSub является парадигмой обмена сообщениями и может быть легко реализован с помощью MOM (Message-Oriented Middleware) - (см. RabbitMQ, ActiveMQ, OpenMQ), где MOM выполняет тяжелую работу.

XMPP также может служить вашей цели (см. XEP-0060 ). Все, что вам нужно, это сервер Jabber и библиотека CMP XMPP (gloox хорош и поддерживает XEP-0600).

Вас также может заинтересовать pubsubhubbub .

3 голосов
/ 27 ноября 2009

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

Поскольку вы имеете дело с асинхронными данными, вам может потребоваться поискать вариант наблюдателя под названием «публикация / подписка». Наблюдения в этом сделаны конкретными наблюдателями, слушающими события, и затем поднимающими события, когда они должны общаться. Например, получение данных может вызвать событие.

Вы также можете посмотреть на удаленное взаимодействие, что-то вроде того, что вы пытаетесь сделать здесь. Хотя это может быть слишком тяжелым для того, что вы пытаетесь сделать.

0 голосов
/ 30 июня 2010

По первому вопросу: да, это модель, используемая всеми клиент-серверными играми.

По вашему второму вопросу: «push» подход лучше с точки зрения синхронизации по времени и переключения каналов. Используйте библиотеку RPC (удаленный вызов процедур) для имитации вызовов функций. Если вы используете C ++, я рекомендую Raknet. Если вы используете Java, я рекомендую Jnag или протобуферы.

0 голосов
/ 27 ноября 2009

Похоже, вы используете шаблон Observer для двойной цели. Ваши игровые клиенты будут «наблюдать» за сервером, но это еще не все. они также будут передавать информацию об игроке обратно на сервер. Так что они действительно делают больше, чем просто наблюдают. Может быть, просто используйте базовую парадигму клиент / сервер и не беспокойтесь о «шаблоне проектирования». Или, если вы хотите использовать шаблонный подход, возможно, посмотрите на шаблон посредника, где сервер является посредником. Лично я бы придерживался подхода клиент / сервер.

Извините, я знаю, что это не ответит на ваши конкретные вопросы, но просто примите это как пищу для размышлений.

...