質問

ゲーム開発は比較的新しいので、経験とエンターテイメントの両方のために、趣味のプロジェクトをゼロから作成したいと決めました。特定のゲームは、 3つのカードブラッグとして知られるポーカーに似ています。ゲームは映画の中でロック、ストック、2つの喫煙バレルで再生されます。

主にこの質問。これは、オブジェクトを作成していた元の方法を刷新するのに役立ちました。

私が抱えている特定の問題の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 オブジェクト。

一方、プレーヤーがベットをレイズする場合、 IAction を実装する RaiseAction を作成しますが、 IAction インターフェースは現在のゲーム状態のみを受け入れます。これは、チップスタックが Player クラス内に格納されている場合には理想的ではないと思います。

基本的に、私の質問は次のとおりです。特定のオブジェクト内のゲーム状態内のオブジェクトに関連するすべてのデータを同時に保持しながら、ゲーム状態を正確に表現できるように両方の長所を使用できますか?

役に立ちましたか?

解決

コマンドパターン(IAction)を使用するオンラインゲームが標準です。実証済みの方法。プレーヤーの意味ではオブジェクト指向ではありませんが、アクションはオブジェクト指向です。したがって、純粋に理論的な観点から見ると、堅実なデザインパターンです。そして実際には、私が見たすべての成功したオンラインゲームがそれを実装する方法ですが、アクションゲームは通常、非常に小さな控えめなアクション/パケットを使用することに注意してください。

編集:

これに答えて久しぶりにここに戻って、この問題の別の解決策がを持つ IState クラスから派生したGameStateのプレーヤー、デッキなどを実装することであることに気付きました。 strong> Apply(IActionアクション)メンバー。このように、オブジェクトにアクションを適用させるのではなく、オブジェクトにアクションを適用させるのではなく、アクションと状態を

他のヒント

オブジェクト指向のためにオブジェクト指向になっているようです...

Bob Martinの古典的なボウリングゲームの問題のようです。

編集:-概要-
長い間読みましたが、基本的に、TDDとリファクタリングを通じて、ボウリングスコアリングアプリケーションは、多数のクラスと多態性を持つ巨大なクラスターから20〜30行のエレガントなコード行になりました。どうして?そもそも実際にそこにいる必要はなかったからです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top