重新開始。什麼是Card
?這是一個擁有等級和套裝的對象。所以你需要:
- 一個
enum
名爲西裝。
- Ranks的一系列數字。大概2到14(10,傑克,女王,國王,王牌)。
- 或者一個枚舉:TWO,THREE,...,ACE。這可能有點多。
- 類
Card
有一個西裝和等級。
Card
不應該有制定者,因爲你不希望玩家在有牌時換牌。所以,
public class Card {
private final Suit suit;
private final int rank;
public Card(final Suit suit, final int rank) {
this.suit = suit;
this.rank = rank;
}
// Getters, toString, equals, hashCode, formatting for humans, etc.
}
現在,你需要構建一個套牌。一副牌應該包含一張牌的名單,你必須能夠洗牌。你可以使它成爲一個ArrayList<Card>
,但我會讓它成爲一個包含這樣一個列表的對象,因爲套牌有行爲。 deck.deal()
比做deal
做內聯更清晰。
public class Deck {
private List<Card> cards = new ArrayList<>();
public Deck() {
for (Suit suit: Suit.values()) {
for (int rank = 2; rank <= ACE; rank ++) {
cards.add(new Card(suit, rank));
}
}
Collections.shuffle(cards); // Perhaps use your own Random too.
}
public synchronized Card deal() {
Card dealt = cards.get(0);
cards.remove(0);
return dealt;
}
}
這裏有各種各樣的設計決定。
- Rank還應該是enum嗎?它使for循環更容易。
- 是否應該在
Deck
課堂內部建造甲板?假設你不僅要處理撲克和橋牌,還要處理pinochle或bezique,每個套裝中有兩個ace-nine。
- 洗牌應該與密碼質量的RNG綁定嗎?
- 您是否應該使用
Stack
或Deque
而不是ArrayList
? Stack
可能更清晰,而Deque
s不能混洗。
- 你有一張牌面朝上或朝下的想法。這是一個補充。玩單人紙牌?
- 如果甲板是空的,應該怎麼做
deal
?這是使用堆棧的一個很好的理由。
什麼是'卡'?它能撐住'西裝','等級','甲板'嗎? – MadProgrammer 2013-04-05 02:39:29