Какие-либо шаблоны для моделирования настольных игр? [закрытый]

Бесплатная, открытая версия с открытым исходным кодом Howard Hinnant, переносная библиотека даты / времени - это современный способ сделать это, не трафик через старый API C, и не требует, чтобы вы отбрасываете всю свою второстепенную информацию. Эта библиотека также предлагается для стандартизации .

В форматировании существует большая гибкость. Самый простой способ - просто выпустить:

#include "date.h"
#include 

int
main()
{
    using namespace date;
    std::cout << std::chrono::system_clock::now() << '\n';
}

Это просто для меня:

2017-09-15 13:11:34.356648

Требуется using namespace date;, чтобы найти оператор потоковой передачи для system_clock::time_point (для моей библиотеки не разрешено вставлять ее в namespace std::chrono). Никакая информация не будет потеряна в этом формате: будет выведена полная точность вашего system_clock::time_point (microseconds, где я запустил это на macOS).

Полный набор strftime флаги форматирования доступны для других форматов, с небольшими расширениями для обработки таких вещей, как дробные секунды. Вот еще один пример, который выводит с миллисекундной точностью:

#include "date.h"
#include 

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << format("%D %T %Z\n", floor(system_clock::now()));
}

, который только что выводит для меня:

09/15/17 13:17:40.466 UTC

91
задан Jay Bazuzi 17 February 2009 в 06:43
поделиться

7 ответов

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

Ваша игра может, вероятно, быть в (близко к) бесконечной сумме состояний из-за перестановок вещей как то, сколько имеет денежный игрок A, сколько имеет денежный игрок B, и и т.д. Поэтому я вполне уверен, Вы хотите избегать конечных автоматов.

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

Мы использовали Шаблон "команда" для представления всех допустимых игровых действий, которые мог сделать плеер. Вот было бы действие в качестве примера:

class RollDice : public Action
{
  public:
  RollDice(int player);

  virtual void Apply(GameState& gameState) const; // Apply the action to the gamestate, modifying the gamestate
  virtual bool IsLegal(const GameState& gameState) const; // Returns true if this is a legal action
};

, Таким образом, Вы видите, что, чтобы решить, допустимо ли перемещение, можно создать то действие и затем вызвать его функцию IsLegal, передающую в текущем игровом состоянии. Если это допустимо, и плеер подтверждает действие, можно вызвать Применять функцию для фактического изменения игрового состояния. Путем обеспечения, что код геймплея может только изменить игровое состояние путем создания и представления судебных исков (так, другими словами, Действие:: Подайте заявку семейство методов единственная вещь, которая непосредственно изменяет игровое состояние), затем Вы удостоверяетесь, что Ваше игровое состояние никогда не будет недопустимо. Кроме того, при помощи шаблона "команда", Вы позволяете сериализировать желаемые перемещения своего игрока и отправить их по сети, которая будет выполняться на игровых состояниях другого игрока.

закончил тем, что был один глюк с этой системой, которая, оказалось, имела довольно изящное решение. Иногда действия имели бы две или больше фазы. Например, плеер может приземлиться на свойство в Монополии и должен теперь принять новое решение. Каково игровое состояние между тем, когда плеер кидал кости, и прежде чем они решат купить свойство или нет? Мы управляли такими ситуациями путем показа "члена" Контекста Действия нашего игрового состояния. Контекст действия обычно был бы пустым, указав, что игра в настоящее время не находится ни в каком специальном состоянии. Когда плеер кидает кости, и действие прокрутки игры в кости применяется к игровому состоянию, оно поймет, что плеер приземлился на ненаходящееся в собственности свойство и может создать новый контекст действия "PlayerDecideToPurchaseProperty", который содержит индекс плеера, от которого мы ожидаем решения. К тому времени, когда действие RollDice завершилось, наше игровое состояние представляет это, оно в настоящее время ожидает указанного плеера, чтобы решить, купить ли недвижимость, не. Для метода IsLegal всех других действий теперь легко возвратить false, за исключением "BuyProperty" и исков "PassPropertyPurchaseOpportunity", которые только судебны, когда игровое состояние имеет контекст действия "PlayerDecideToPurchaseProperty".

С помощью контекстов действия, никогда нет единственной точки во время жизни настольной игры, где игровая структура состояния не полностью представляет ТОЧНО, что происходит в игре в то время. Это - очень желательное свойство Вашей системы настольной игры. Это будет он намного легче для Вас написать код, когда можно будет найти все, что Вы когда-либо хотите знать о том, что происходит в игре путем исследования только одной структуры.

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

я надеюсь, что это было кратко и полезно.

111
ответ дан Andrew Top 5 November 2019 в 14:03
поделиться

Базовая структура Вашего игрового механизма использует Шаблон состояния . Объекты Вашего игрового поля одиночные элементы из различных классов. Структура каждого состояния может использовать Стратегическая модель или Шаблонный Метод .

А Фабрика используется для создания плееров, которые введены в список плееров, другого одиночного элемента. GUI будет наблюдать на Игровом Механизме при помощи Шаблон "наблюдатель" и взаимодействовать с этим при помощи одного из нескольких Объектов команды, созданных с помощью Шаблон "команда" . Использование Наблюдателя и Команда могут использоваться с в контексте Пассивное Представление , Но примерно любой шаблон MVP/MVC мог использоваться в зависимости от Ваших предпочтений. При сохранении игры, необходимо захватить сувенир из, его - текущее состояние

я рекомендующий просматривающий некоторые шаблоны на этом сайт , и посмотрите, захватывает ли какой-либо из них Вас как начальную точку. Снова основа Вашей игровой доски будет конечным автоматом. Большинство игр будет представленный двумя состояниями pre-game/setup и фактической игрой. Но Вы можете, имел больше состояний, если игра, которую Вы моделируете, имеет несколько отличных режимов игры. Состояния не должны быть последовательными, например, wargame Ось & Сражения имеют плату сражения, которую игроки могут использовать для разрешения сражений. Таким образом, существует три предварительных игры состояний, системная плата, плата сражения с игрой, постоянно переключающейся между платой сражения и системной платой. Конечно, последовательность поворота может также быть представлена конечным автоматом.

18
ответ дан RS Conley 5 November 2019 в 14:03
поделиться

Конечно, существуют многие, многие, многие, многие, многие, многие, многие, ресурсы об этой теме. Но я думаю, что Вы находитесь на правильном пути, делящем объекты, и позволяете им обработать его собственные события/данные и так далее.

, Когда выполнение разместило базирующиеся настольные игры рядом, Вы найдете хорошим иметь стандартные программы для отображения между массивом платы и строкой/седлом и назад вдоль других функций. Я помню свою первую настольную игру (долго давно), когда я struggeled с тем, как получить строку/седло от boardarray 5.

1  2  3  
4 (5) 6  BoardArray 5 = row 2, col 2
7  8  9  

Nostalgy.;)

Так или иначе, http://www.gamedev.net/ является хорошим местом для получения информации. http://www.gamedev.net/reference/

8
ответ дан Stefan 5 November 2019 в 14:03
поделиться

Большая часть материалов, которые я могу найти онлайн, является списками опубликованных ссылок. Раздел публикаций Шаблоны Игрового дизайна имеет ссылки на версии PDF статей и тезисов. Многие из них похожи на научные работы как Шаблоны разработки для Игр . Существует, также по крайней мере один заказывает доступный из Amazon, Шаблоны в Игровом дизайне .

5
ответ дан Eric Weilnau 5 November 2019 в 14:03
поделиться

Три Кольца библиотеки LGPL'd Java предложений. Nenya и Vilya являются библиотеками для связанного с игрой материала.

, Конечно, помогло бы, упомянул ли Ваш вопрос платформу и/или ограничения языка, Вы могли бы иметь.

3
ответ дан jmucchiello 5 November 2019 в 14:03
поделиться

Я только что закончил разрабатывать и реализовывать основанную на состоянии игру с помощью полиморфизма.

Используя основной названный абстрактный класс GamePhase это имеет один важный метод

abstract public GamePhase turn();

То, что это означает, является каждым GamePhase объект содержит текущее состояние игры и вызов к turn() взгляды на его текущее состояние и возвраты следующее GamePhase.

Каждый бетон GamePhase имеет конструкторов, которые держат все игровое состояние. Каждый turn() метод имеет определенные игровые правила в них. В то время как это распространяет правила вокруг, это сохраняет связанные правила близко друг к другу. Конечный результат каждого turn() просто создает следующее GamePhase и передача в полном состоянии в следующую фазу.

Это позволяет turn() быть очень гибким. В зависимости от Вашей игры данное состояние может перейти ко многим различным типам фаз. Это формирует график всех игровых фаз.

На высшем уровне код для управления им очень прост:

GamePhase state = ...initial phase
while(true) {
    // read the state, do some ui work
    state = state.turn();
}

Это чрезвычайно полезно, поскольку я могу теперь легко создать любое состояние/фазу игры для тестирования

Теперь для ответа на вторую часть вопроса, как это работает в многопользовательском? В определенном GamePhases, которые требуют ввода данных пользователем, вызова от turn() спросил бы ток Player их Strategy учитывая текущее состояние / фаза. Strategy просто интерфейс всех возможных решений a Player может сделать. Эта установка также позволяет Strategy быть реализованным с AI!

Также Andrew Top сказал:

Ваша игра может, вероятно, быть в (близко к) бесконечной сумме состояний из-за перестановок вещей как то, сколько имеет денежный игрок A, сколько имеет денежный игрок B, и и т.д. Поэтому я вполне уверен, Вы хотите избегать конечных автоматов.

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

Монополия

Пример некоторых GamePhases был бы:

  • GameStarts
  • PlayerRolls
  • PlayerLandsOnProperty (FreeParking, GoToJail, Идут, и т.д.),
  • PlayerTrades
  • PlayerPurchasesProperty
  • PlayerPurchasesHouses
  • PlayerPurchasesHotels
  • PlayerPaysRent
  • PlayerBankrupts
  • (Все карты Шанса и Объединенного благотворительного фонда)

И некоторые состояния в основе GamePhase :

  • Список плееров
  • Текущий Плеер (кто поворот),
  • Деньги/Свойство игрока
  • Здания/Отели на Свойствах
  • Положение плеера

И затем некоторые фазы записали бы свое собственное состояние по мере необходимости, например, PlayerRolls запишет количество раз, у плеера есть последовательный список, удваивается. После того как мы оставляем фазу PlayerRolls, мы больше не заботимся о последовательных списках.

Много фаз может быть снова использовано и соединено. Например, GamePhase CommunityChestAdvanceToGo создал бы следующую фазу PlayerLandsOnGo с текущим состоянием и возвратом это. В конструкторе PlayerLandsOnGo текущий плеер был бы перемещен для Движения, и их деньги будут увеличены на 200$.

15
ответ дан Pyrolistical 24 November 2019 в 06:48
поделиться

Могу ли я воспользоваться каким-либо предшествующим уровнем техники?

Если ваш вопрос не зависит от языка или платформы. тогда я бы порекомендовал вам рассмотреть шаблоны AOP для состояния, Memento, Command и т. д.

Каков ответ .NET на AOP ???

Также попробуйте найти несколько интересных веб-сайтов, таких как http: // www.chessbin.com

1
ответ дан 24 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: