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