Лучшая модель для обработки команд между Player1 и Player2 - PullRequest
0 голосов
/ 23 января 2012

Мне трудно обернуть голову вокруг этого, и я прошу прощения, если этот вопрос не очень ясен. Но я попробую.

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

  1. Текущий игрок может разместить маркер.
  2. Любой игрок может запросить отмену. Другой игрок может разрешить или отклонить запрос.
  3. Любой игрок может уйти в отставку.

Я написал класс GameEngine, который отслеживает игровое поле, проверяет правильность размещения маркеров и условия победы. Я хотел бы написать классы Player, такие как TerminalPlayer (чтобы играть в игру из командной строки), NetworkPlayer (чтобы принимать ходы с сервера) и ArtificialPlayer (чтобы он играл в автономном режиме).

Моя проблема заключается в следующем: учитывая, что каждый игрок может отправлять команды в любое время (placeMarker, requestUndo, Resign), как мне структурировать эту игру?

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

В частности, вы можете ответить:

  1. Какой шаблон решает эту проблему? Существует ли он или это проще, чем я это делаю?
  2. Если библиотека Boost (или что-то в этом роде) изящно решило эту проблему, как называется эта библиотека?

Ответы [ 3 ]

0 голосов
/ 24 января 2012

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

Разные части ввода будут разрешены в разных состояниях игры,

Если возможны следующие состояния:

  • Игрок 1 Ход
  • Игрок 2 хода
  • Запрос игрока 1 ожидает рассмотрения
  • Запрос игрока 2 ожидает рассмотрения
  • Игра окончена

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

Игрок 1 делает ход:

Разрешенные состояния: 1 ход игрока

Новое состояние: ход игрока 2

Отмена запроса игрока 1:

Разрешенные состояния: 1 ход игрока

Новое состояние: запрос игрока 1 находится на рассмотрении

Запрос на отказ игрока 2:

Разрешенные состояния: запрос игрока 1 ожидает рассмотрения

Новое состояние: ход игрока 1

Игрок 2 подал в отставку:

Разрешенные состояния: ВСЕ

Новое состояние: игра окончена

Если игрок делает ход вне очереди, просто сбросьте его.

0 голосов
/ 24 января 2012

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

0 голосов
/ 23 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...