Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 纸牌游戏类的面向对象设计_Java_Oop_Design Patterns_Playing Cards - Fatal编程技术网

Java 纸牌游戏类的面向对象设计

Java 纸牌游戏类的面向对象设计,java,oop,design-patterns,playing-cards,Java,Oop,Design Patterns,Playing Cards,应用设计模式设计以下类时,最好的方法是什么 牌组-添加牌、发牌、洗牌、获取牌、移除牌、移除所有牌 手牌-添加卡、移除卡、获取卡、移除所有卡 丢弃堆-添加卡、获取卡、移除卡、移除所有卡 熔化文件-添加卡,移除所有卡 (熔化文件保存表中的所有熔化。) 对我来说,我认为gettocard和removeTopCard只是getCard和removeCard的包装,因为它只是获取卡片的顶部位置,然后将其传递给getCard或removeCard 我应该用作文吗?战略模式?或者创建另一个名为CardPi

应用设计模式设计以下类时,最好的方法是什么

  • 牌组-添加牌、发牌、洗牌、获取牌、移除牌、移除所有牌
  • 手牌-添加卡、移除卡、获取卡、移除所有卡
  • 丢弃堆-添加卡、获取卡、移除卡、移除所有卡
  • 熔化文件-添加卡,移除所有卡
(熔化文件保存表中的所有熔化。)

对我来说,我认为
gettocard
removeTopCard
只是
getCard
removeCard
的包装,因为它只是获取卡片的顶部位置,然后将其传递给
getCard
removeCard


我应该用作文吗?战略模式?或者创建另一个名为CardPile的类,并将其用作上述类的基类?如果您能提供一个示例代码,我将不胜感激。

我认为您可以使用下面这样的一个deck类来实现您想要的,它本质上是一个包装器,我不明白如果不是所有相同的方法,为什么任何特定的deck/pile/hand都不需要大多数方法

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

}

最好的方法是开始编写游戏规则,让你的设计自然发展。如果你有一个特定的问题,例如“我试图实现一个规则,如果一个玩家玩一张牌,另一个玩家必须放弃,我应该在这里使用什么模式?”这可能是可以回答的。+1表示“让你的设计自然演变”,注意将“自然发生”的类转化为亚原子粒子基类。随着不必要的泛型和无偿处理的进行,类层次结构可能变得太深。如果你的自然设计演变需要一个更一般的基础来衍生新功能,你总是可以在以后重构。这是家庭作业还是面试问题?我真的不明白什么是混合堆,或者听起来有点像MtG,它是属于玩家的吗?例如,一个MtG风格的游戏(根据我玩它的短暂经验),玩家会有一副牌,一手牌,元素能量玩的牌位,以及怪物扮演的角色。我认为所有这些都可能是一副“牌”,尽管你可能希望创建一个“牌”基类,而不是实现像
shuffle()这样的方法
并将其用作“小牌堆”,我同意您关于交易方法的看法,它不应该是牌堆的一部分,因为交易是庄家的行为。混合牌堆是一组牌(三类、四类和直牌),属于一个玩家,张贴在桌子上。我只是不能决定要实现什么,因为大多数开源纸牌游戏使用不同的牌堆类别,另一个刚创建了一个CardPile并将其用作基类。我建议从使用一个CardPile基类开始,该基类将封装添加和移除卡片,您可以将其继承到可以洗牌和“神奇创建”的
牌组中,一个
meldfile
,它对可以包含的卡有自己的规则,一个
Hand
,它可以设置允许的最大卡数和丢弃的规则。更重要的是,我认为最好是开始做一些事情,避免模式化,并在需要时重构/优化代码。
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());
            } 
        }
    }

    // .....
}