私はゲーム開発に比較的慣れていないので、経験と娯楽の両方のために趣味のプロジェクトを最初から作成したいと思いました。特定のゲームは、 ThreeCardBragとして知られるポーカーに似ています。ゲームは映画「ロック、ストック&トゥースモーキングバレルズ」でプレイされます。
私はゲーム開発に関するSOに関するいくつかのトピックを読んでいますが、ほとんどがこの質問です。これは、私がオブジェクトを作成していた元の方法を刷新するのに役立ちました。
私が抱えている特定の問題の1つは、ゲームの状態を定義することです。私の最初のアプローチはすべてを分離することでした(たとえば、クラス内にチップスタックを保持する)が、前述の質問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
。
基本的に、私の質問は次のとおりです。ゲームの状態を正確に表現しながら、特定のオブジェクト内のゲーム状態内のオブジェクトに特に関連するすべてのデータを同時に保持できるように、両方の長所を活用できますか?