2012-02-06 7 views
5

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

  • デッキからaddCard、契約、シャッフル、getTopCard、removeTopCard、removeAllCards
  • からaddCard、removeCard、getCard、removeAllCards
  • DiscardPileからaddCard、getTopCard 、removeTopCard、removeAllCards
  • MeldPileからaddCard、removeAllCards

は(MeldPileは、テーブル内のすべて融合させたを保持している。)私にとっては、私のように、getTopCardremoveTopCardgetCardremoveCardの単なるラッパーだと思う

カードの一番上の位置を取得した後、getCardまたはremoveCardに渡します。

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

+3

最善のアプローチをデッキに対処するためのロジックを実装プレイヤークラスとディーラーのクラスはちょうど書き込みを開始するだろうと思うように私をリードあなたのデザインを自然に進化させることができます。たとえば特定の質問がある場合「プレイヤーがカードをプレイすると、他のプレイは捨てなければならないが、ここでどのようなパターンを使うべきか」というルールを実装しようとしている。答えることができます。 –

+1

+1は「あなたのデザインを自然に進化させる」 – radarbob

+0

「自然発生」クラスを亜原子ベースの基底クラスに変換することに注意してください。クラス階層はあまりにも深刻になり、不必要に一般的で無償な処理が続けられます。自然なデザインの進化が新しい機能を引き出すためのより一般的な基盤を必要とするならば、あなたはいつでもリファクタリングすることができます。 – radarbob

答えて

6

私はあなたが本質的にStack周りのラッパーである、以下のような1つのデッキクラスで達成できると思います。なぜなら、特定のデッキ/パイル/ハンドが、メソッド。

class Deck { 
    private Stack<Card> cards = new Stack<Card>(); 

    public Deck() { } 

    public Deck(int numberOfCards) { 
     for (int i=0; i<numberOfCards; i++) { 
      cards.push(CardFactory.createCard(i)); 
     } 
    } 

    private void shuffle() { 
     Collections.shuffle(this.cards); 
    } 

    public void sort() { 
     Collections.sort(this.cards); 
    } 

    public void removeAllCards() { 
     this.cards.removeAllElements(); 
    } 

    public void removeCard(Card c) { 
     int i = this.cards.search(c); 
     this.cards.remove(i);    
    } 

    public Card getCard(Card c) { 
     int i = this.cards.search(c); 
     return this.cards.get(i); 
    } 

    public Card getTopCard() { 
     return this.cards.pop(); 
    } 

    public Card getNthCard(int i) { 
     return this.cards.get(i); 
    } 

    public Card addCard(Card c) { 
     this.cards.push(c); 
    } 

} 

私が見る唯一の本当の問題はdeal()方法で、これはデッキの責任であるべきかどうか?個人的に、私はそうは思わないだろう、これはおそらくあなたがプレーヤーを拡張し、

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<numberOfCards; i++) { 
       player.addCard(this.deck.getTopCard()); 
      } 
     } 
    } 

    // ..... 
} 
+0

私は実際にメルトパイルが何だったのか分かりませんでしたか?それはMtGがプレイヤーに属しているのでしょうか?たとえば、MtGスタイルのゲーム(私の短い経験からそれを演奏している)は、デッキ、手、要素のパワーカードのビット、モンスターのプレイされた部分があります。 'shuffle()'のようなメソッドを実装していない 'Deck'の基本クラスを作成し、それを 'less stacks of cards'として使用します –

+0

私はディールメソッドに関してあなたに同意します。ディーラーの行動です。融合したパイルは、テーブルに掲示されたプレイヤーに属しているカード(3種類の種類、4種類のカインド、ストレート)です。オープンソースのカードゲームのほとんどは、デッキ、手札、破棄杭のために異なるクラスを使い、もう一つはCardPileを作成してそれを基本クラスとして使用しているので、実装すべきものを決めることはできません。 – Zack

+0

私はそこからカードの追加と削除をカプセル化する単一のCardPile基本クラスを使い始めることをお勧めします。そこではシャッフルと '魔法のように作成'できる 'Deck'と、' MeldPile'それが含むことができるカードのためのそれ自身のルール、許容されるカードの最大数および廃棄するルールを設定することができる「手」を有する。もっと重要なのは、何かを始め、必要に応じてパターン化したり、リファクタリングしたり、コードを最適化したりすることが良いと思います。 –

関連する問題