2013-04-05 130 views
0

我很困惑如何正確地創建這個類。我不知道如何創建一個具有所有這些混合值的ArrayList ...任何幫助,將不勝感激。卡構造函數

public StandardCardImpl(Suit suit, int rank, StandardCardImpl deck) { 
    face_up = false; 

List<Card> cards = new ArrayList<Card>(DeckSize); 
     cards.add(suit,rank,deck); 

    if (rank < 1 || rank > KING) { 
     throw new RuntimeException("Rank is out of range for standard card"); 
    } 
    Iterator iterator = cards.iterator(); 
    this.suit = suit; 
    this.rank = rank; 
    this.deck = deck; 
} 
+0

什麼是'卡'?它能撐住'西裝','等級','甲板'嗎? – MadProgrammer 2013-04-05 02:39:29

回答

0

重新開始。什麼是Card?這是一個擁有等級和套裝的對象。所以你需要:

  1. 一個enum名爲西裝。
  2. Ranks的一系列數字。大概2到14(10,傑克,女王,國王,王牌)。
    • 或者一個枚舉:TWO,THREE,...,ACE。這可能有點多。
  3. 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; 
    } 
} 

這裏有各種各樣的設計決定。

  1. Rank還應該是enum嗎?它使for循環更容易。
  2. 是否應該在Deck課堂內部建造甲板?假設你不僅要處理撲克和橋牌,還要處理pinochle或bezique,每個套裝中有兩個ace-nine。
  3. 洗牌應該與密碼質量的RNG綁定嗎?
  4. 您是否應該使用StackDeque而不是ArrayListStack可能更清晰,而Deque s不能混洗。
  5. 你有一張牌面朝上或朝下的想法。這是一個補充。玩單人紙牌?
  6. 如果甲板是空的,應該怎麼做deal?這是使用堆棧的一個很好的理由。
0

也許你想要下面?

cards.add(new Card(suit,rank,deck)); 

即創建與適當的成員新Card對象,然後添加到陣列列表。