Сетевое общение для пошаговой настольной игры - PullRequest
1 голос
/ 03 июня 2010

мой первый вопрос здесь, поэтому, пожалуйста, не будьте резкими, если что-то пошло не так:)

В настоящее время я учусь на CS (из Германии, если эта информация имеет какое-либо применение;)), и мы получили бесплатное выбираемое задание по программированию, которое мы должны написать в приложении C ++ / CLI для Windows Forms.
Моя команда, двое других и я решили пойти на совместимый с сетью порт настольной игры Risk.

Мы разделили работу на 3 части, а именно: пользовательский интерфейс, игровая логика и сеть. Теперь мы находимся в той части, где нам нужно, чтобы все работало вместе, и главный вопрос в том, как синхронизировать клиентов друг с другом?

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

Это стандартный сценарий нашего подхода:

  1. игрок выполняет действие, действие действует и выполняется на клиенте игрока
  2. действие отправлено по сети
  3. действие выполняется на других клиентах

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


Gui, Controller и Network реализуют все возможные действия (то есть все действия, которые изменяют данные) как методы из интерфейса. Таким образом, каждая часть может реализовать метод таким образом, чтобы выполнить свою работу.

Пример с действием ():

На стороне клиента:

Player-->Gui.Action()
Gui-->Controller.Action()
Controller-->Logic.Action
    (Logic.Action() == NoError)? 
    Controller-->Network.Action()
Network-->Parser.ParseAction()
Network.Send(msg)

На всех остальных клиентах:

Network.Recv(msg)
Network-->Parser.Deparse(msg)
Parser-->Logic.Action()
Logic-->Gui.Action()

Вопросы:

Это жизнеспособный подход к нашей задаче?
Есть ли лучший / более простой способ для этого?
Рекомендации, критика?

Наши знания (чтобы вы могли лучше нацелить свой ответ):

Мы находимся на стороне новичка в том, что касается программирования более крупных проектов с небольшой командой. У всех нас есть некоторый общий опыт программирования и базовое понимание библиотек .Net и Windows Forms.

Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.

Ответы [ 2 ]

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

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

Так как игра, которую вы хотите построить, основана на пошаговом режиме - вам нужна гарантированная доставка по сети. Для упрощения передачи данных вы можете использовать proto buff library

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

Все, что я знаю, это то, что я бы не сказал, что C ++ - это язык для начинающих! Я никогда не использовал это, но мои друзья, которые описывают это как «мужской язык». Я полагаю, это наносит волоски на твою грудь.

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

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

Откуда вы знаете, какие еще клиенты существуют, чтобы вы могли поиграть с ними? Решения для телеконференций, похоже, используют централизованную систему: вы набираете конкретный номер, и он говорит, что вы первый, кто присоединился к конференции. Если кто-то уходит, все остальные еще там. Это может быть больше того, что вам нужно - пусть центральная система опосредует данные. Что произойдет, если два клиента отправят конфликтующие действия?

С центральной системой вы сможете создавать простые правила для управления игрой, и им будет легче управлять. Вы можете обернуть обработку актинов в транзакции, чтобы избежать конфликтов. единственная проблема в том, чтобы синхронизировать все клиенты; все, что им нужно сделать, это получить обновление с центрального сервера - но когда они это делают? они просто опрашивают его или им «сообщает» центральный сервер, когда произошли изменения? Последнее, вероятно, намного лучше, но я не знаю, как бы вы сделали это, используя технологию, которую вы предлагаете.

Надеюсь, это поможет.

...