9

私はゲーム開発に比較的慣れていないので、経験と娯楽の両方のために趣味のプロジェクトを最初から作成したいと思いました。特定のゲームは、 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

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

4

2 に答える 2

6

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

編集:

これに答えてから長い時間が経ち、ここに戻ってきて、この問題の別の解決策は、 Apply(IAction アクション)メンバーを持つIStateクラスから派生した GameState のプレーヤー、デッキなどを実装することであることに気付きました。このように、アプリケーションがオブジェクトにアクションを適用する代わりに、オブジェクトはそれ自体にアクションを適用します。これにより、アクションと状態がコマンド パターンではなくビジター パターンにマップされます。どちらのソリューションも機能します。ビジターのオーバーヘッドが大きく、カプセル化が多い場合、コマンドはカプセル化が少ない簡単なソリューションです。

于 2009-03-03T04:20:45.097 に答える
1

オブジェクト指向のためにそれをオブジェクト指向化しているようです...

ボブ マーティンの古典的なボウリング ゲームの問題のようです。

編集: -まとめ -
長い読み物ですが、基本的に、TDD とリファクタリングによって、ボウリング スコアリング アプリケーションは、多くのクラスとポリモーフィズムを持つ巨大なクラスターから、20 行または 30 行のエレガントなコードになりました。なんで?そもそもそこにいる必要がなかったから

于 2009-03-03T04:08:55.700 に答える