Я относительно новичок в разработке игр, поэтому решил, что хочу создать проект для хобби с нуля для развлечения и развлечений. Конкретная игра похожа на покер, известный как Three Card Brag. Игра воспроизводится в фильме Замок, сток и два ствола для курения.Игровая архитектура и стратегия дизайна для многопользовательской карточной игры
Я читал некоторые из тем, касающихся SO относительно разработки игр, хотя в основном this question. Это помогло обновить оригинальный способ создания объектов.
Одна конкретная проблема, с которой я сталкиваюсь, определяет состояние игры. Мой первоначальный подход состоял в том, чтобы отделить все (например, сохранить чипы в классе Player
), но после прочтения ответов на question, о которых я упоминал ранее, кажется, что все возможные состояния игры должны поддерживаться в пределах объекта GameState
. То, что я придумал, по существу, это:
abstract class CardGameState
{
protected List<Player> _Players;
protected Player _CurrentPlayer;
protected Dictionary<Player, int> _Chips;
protected Dictionary<Player, Hand> _CurrentHand;
protected Dictionary<Player, PlayerStatuses> _PlayerStatus; // PlayerStatuses.InHand, PlayerStatuses.Folded, PlayerStatuses.SittingOut, etc.
/* etc. */
где каждый CardGameState
модифицируется какое-то действие:
public interface IAction
{
string Name { get; }
CardGameState Apply(CardGameState state);
bool IsLegal(CardGameState state);
}
Теперь я чувствую себя очень сильно, что это поражение цели объектно-ориентированного программирования , поскольку данные, конкретно связанные с игроком (в данном случае его стек фишек, рука и текущий статус), не инкапсулируются объектом Player
.
С другой стороны, если игрок поднять ставку, я бы создать RaiseAction
, который реализует IAction
, но интерфейс IAction
принимает только текущее состояние игры, что я не верю, было бы идеально, если чипы были сохранены в классе Player
.
В основном, мой вопрос: могу ли я иметь лучшее из обоих миров, чтобы я мог точно представлять состояние игры, одновременно сохраняя все данные, относящиеся конкретно к объекту внутри игрового состояния внутри его заданного объекта?
Эй, Джон, я просто рассматривал этот вопрос и понял, что вы также можете получить лучшее из обоих миров, заменив IAction.Apply на IState.Apply, используя шаблон посетителя. Вероятно, слишком поздно, но в любом случае это может быть сервер в качестве будущей ссылки. –