カードゲームクラスのためのOOPデザイン

デザインパターンを適用する次のクラスを設計する際には、どのような方法が最適でしょうか?

  • Deck - addCard, deal, shuffle, getTopCard, removeTopCard, removeAllCards
  • Hand - addCard, removeCard, getCard,removeAllCards
  • DiscardPile - addCard, getTopCard, removeTopCard, removeAllCards
  • MeldPile - addCard, removeAllCards

(MeldPileはテーブル内のすべてのメルトを保持します。)

私にとって、 getTopCard removeTopCard はちょうどget getCard removeCard のラッパーであるカードの一番上の位置を getCard または removeCard に渡します。

私は構成を使うべきですか?戦略パターン? CardPile という別のクラスを作成し、それを上記クラスの基本クラスとして使用するだけですか?これについてサンプルコードを提供できるかどうか本当に感謝します。

5
宿題やインタビューの質問ですか?
追加された 著者 gonzobrains,
最善の方法は、ゲームのルールを書き始めるだけで、あなたのデザインを自然に進化させることです。たとえば特定の質問がある場合「プレイヤーがカードをプレイすると、他のプレイは捨てなければならないが、ここでどのようなパターンを使うべきか」というルールを実装しようとしている。答えることができます。
追加された 著者 Garrett Hall,
+1は "あなたのデザインを自然に進化させる"
追加された 著者 radarbob,
「天然に存在する」クラスを亜原子ベースの基底クラスに引き継ぐことに注意してください。クラス階層はあまりにも深刻になり、不必要に一般的で無償な処理が続けられます。 自然なデザインの進化で新しい機能を引き出すためのより一般的な拠点が必要な場合は、後でいつでもリファクタリングすることができます。
追加された 著者 radarbob,

1 答え

基本的に Stack 、なぜ同じデッキ/パイル/ハンドが同じメソッドのすべてではないにしても欲しいとは思えません。

class Deck {
    private Stack cards = new Stack();

    public Deck() { }

    public Deck(int numberOfCards) {
        for (int i=0; i

私が見る唯一の本当の問題は、 deal()メソッドとこれがデッキの責任であるべきかどうかです。個人的にはそうは思わないでしょうが、これはPlayerクラスとPlayerを拡張し、デッキを扱うロジックを実装するDealerクラスを持っていると考えるようになります

class Player() {
    protected String name;
    protected Deck hand = new Deck();

    public void addCard(Card c) {
        this.hand.addCard(c);
    }

   //.....
}

class Dealer() extends Player {
    private Deck deck;

    public Dealer(int deckSize) {
        this.deck = new Deck(deckSize);
    }

    public void deal(Player[] players, int numberOfCards) {
        for (player in players) {
            for (int i=0; i
6
追加された
私は実際にメルトパイルが何だったのか、それともMtGがプレイヤーに属しているのか分かりませんでしたか?たとえば、MtGスタイルのゲーム(私の短い経験からそれを演奏している)は、デッキ、手、要素のパワーカードのビット、モンスターのプレイされた部分があります。 shuffle()のようなメソッドを実装しない 'Deck'の基本クラスを作成し、それを 'less stacks of cards'
追加された 著者 T I,
私は最初からCardPileの基本クラスを使ってカードの追加と削除をカプセル化することをお勧めします。そこからシャッフルして魔法のように作成できるデッキを持つ可能性のある場所を継承することができます。 MeldPile には、それが含むことができるカードのための独自のルールがあり、許可されるカードの最大数と廃棄するルールを設定するがあります。もっと重要なのは、何かを始めて、 patternitis を避け、必要に応じてコードをリファクタリング/最適化する方が良いと思います。
追加された 著者 T I,
私はディールの方法に関してあなたに同意します、ディーラーの行動としてディールの一部ではありません。メッドパイルは、テーブルに掲示されたプレイヤーに属しているカード(3種類のカード、4種類のカード、ストレート)があります。オープンソースのカードゲームでは、デッキ、手札、破棄杭にそれぞれ異なるクラスを使用し、もう一方はCardPileを作成して基本クラスとして使用しています。
追加された 著者 Zack,