Я относительно новичок в разработке игр, поэтому я решил, что хочу создать хобби-проект с нуля, как для опыта, так и для развлечений. Эта игра похожа на покер, известный как Трехкарточный брэг . В игру играют в фильме Запирание, сток и две дымящиеся бочки .
Я читал некоторые темы по SO, касающиеся разработки игр, хотя в основном этот вопрос . Это помогло обновить первоначальный способ создания объектов.
Одна конкретная проблема, с которой я сталкиваюсь, - это определение состояния игры. Мой первоначальный подход состоял в том, чтобы разделить все (например, хранить стеки в классе Player
), но после прочтения ответов на вопрос , о котором я упоминал ранее, кажется, что все возможные состояния игры должны быть сохранены. внутри объекта 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
.
По сути, мой вопрос таков: могу ли я получить лучшее из обоих миров, чтобы иметь точное представление о состоянии игры, одновременно сохраняя все данные, относящиеся конкретно к объекту, в состоянии игры внутри данного объекта?