ООП Дизайн для карточных игр - PullRequest
5 голосов
/ 06 февраля 2012

Каков наилучший подход при разработке следующих классов с применением шаблонов проектирования?

  • Палуба - addCard, deal, shuffle, getTopCard, removeTopCard, removeAllCards
  • Рука - addCard, removeCard, getCard, removeAllCards
  • DiscardPile - addCard, getTopCard,removeTopCard, removeAllCards
  • MeldPile - addCard, removeAllCards

(MeldPile хранит все комбинации в таблице.)

Для меня, я думаю, getTopCard и removeTopCard - это просто обёртка getCard и removeCard, так как они просто получают верхнюю позицию карты, а затем передают её getCard илиremoveCard.

Должен ли я использовать композицию?шаблон стратегии?или просто создайте другой класс с именем CardPile и используйте его в качестве базового класса вышеупомянутого класса?Очень признателен, если бы вы могли предоставить пример кода по этому вопросу.

1 Ответ

6 голосов
/ 06 февраля 2012

Я думаю, что вы можете достичь того, что вы хотите, с одним классом колоды, как показано ниже, который по сути является оберткой вокруг Stack , я не понимаю, почему какая-то конкретная колода / куча / рука не захотят больше всего, еслине все одинаковые методы.

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(), и должна ли это быть ответственность палубы?Лично я бы так не думал, это заставляет меня думать, что, возможно, у вас есть класс Player и класс Dealer, который расширяет Player и реализует логику раздачи колоды

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());
            } 
        }
    }

    // .....
}
...