001 /*
002 Copyright (c) 2005 Garrett Smith
003 The MIT License
004 
005 Permission is hereby granted, free of charge, to any person obtaining a copy 
006 of this software and associated documentation files (the "Software"), to deal
007 in the Software without restriction, including without limitation the rights
008 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
009 copies of the Software, and to permit persons to whom the Software is 
010 furnished to do so, subject to the following conditions:
011 
012 The above copyright notice and this permission notice shall be included in all 
013 copies or substantial portions of the Software.
014 
015 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
017 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
018 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
019 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
021 THE SOFTWARE.
022 */
023 
024 // $Id: StandardDeck.java.html,v 1.1 2005/06/14 06:50:55 gsmith Exp $
025 
026 package garrettsmith.playingcards;
027 
028 import java.util.*;
029 
030 import garrettsmith.playingcards.Card.Color;
031 import garrettsmith.playingcards.Card.Suit;
032 import garrettsmith.playingcards.Card.Value;
033 
034 /**
035  <p>
036  * Represents a standard deck of 52 playing cards.
037  </p><p>
038  * This class is not thread safe.
039  </p><p>
040  * This deck contains 13 cards (two through ten, Jack, Queen, King, and Ace)
041  * in 4 suits (diamonds, hearts, spades, and clubs).  It has no jokers.
042  </p>
043  @author Garrett Smith, gsmith at northwestern dot edu
044  @version Blackjack v1.0
045  @since Blackjack v1.0
046  */
047 public class StandardDeck
048     implements Deck {
049 
050     final List _cards;
051 
052     /**
053    * Singleton instance of this immutable deck.
054    */
055     public static final StandardDeck DECK = new StandardDeck();
056 
057     /**
058      * Returns a nonrandom list of all 52 cards contained in a fresh deck.
059      *
060      @return a nonrandom list of all 52 cards contained in a fresh deck.
061      */
062     public
063     List getAllCards() {
064         return _cards;
065     }
066 
067     /**
068      * Returns the number of cards in this deck: 52 for this specific deck.
069      *
070      @return the number of cards in this deck.
071      */
072     public
073     int size() {
074         return 52;
075     }
076 
077     /**
078      * Returns a string representation of this deck.
079      *
080      @return a string representing the deck
081      */
082     public
083     String toString() {
084         return getClass().getName();
085     }
086 
087     private StandardDeck() {
088         ArrayList cards = new ArrayList52 );
089         cards.addnew CardCard.Value.TWO, Card.Suit.SPADE ) );
090         cards.addnew CardCard.Value.THREE, Card.Suit.SPADE ) );
091         cards.addnew CardCard.Value.FOUR, Card.Suit.SPADE ) );
092         cards.addnew CardCard.Value.FIVE, Card.Suit.SPADE  ) );
093         cards.addnew CardCard.Value.SIX, Card.Suit.SPADE ) );
094         cards.addnew CardCard.Value.SEVEN, Card.Suit.SPADE ) );
095         cards.addnew CardCard.Value.EIGHT, Card.Suit.SPADE ) );
096         cards.addnew CardCard.Value.NINE, Card.Suit.SPADE ) );
097         cards.addnew CardCard.Value.TEN, Card.Suit.SPADE ) );
098         cards.addnew CardCard.Value.JACK, Card.Suit.SPADE ) );
099         cards.addnew CardCard.Value.QUEEN, Card.Suit.SPADE ) );
100         cards.addnew CardCard.Value.KING, Card.Suit.SPADE  ) );
101         cards.addnew CardCard.Value.ACE, Card.Suit.SPADE ) );
102 
103         cards.addnew CardCard.Value.TWO, Card.Suit.CLUB ) );
104         cards.addnew CardCard.Value.THREE, Card.Suit.CLUB ) );
105         cards.addnew CardCard.Value.FOUR, Card.Suit.CLUB ) );
106         cards.addnew CardCard.Value.FIVE, Card.Suit.CLUB ) );
107         cards.addnew CardCard.Value.SIX, Card.Suit.CLUB ) );
108         cards.addnew CardCard.Value.SEVEN, Card.Suit.CLUB ) );
109         cards.addnew CardCard.Value.EIGHT, Card.Suit.CLUB ) );
110         cards.addnew CardCard.Value.NINE, Card.Suit.CLUB ) );
111         cards.addnew CardCard.Value.TEN, Card.Suit.CLUB ) );
112         cards.addnew CardCard.Value.JACK, Card.Suit.CLUB ) );
113         cards.addnew CardCard.Value.QUEEN, Card.Suit.CLUB ) );
114         cards.addnew CardCard.Value.KING, Card.Suit.CLUB ) );
115         cards.addnew CardCard.Value.ACE, Card.Suit.CLUB ) );
116 
117         cards.addnew CardCard.Value.TWO, Card.Suit.HEART ) );
118         cards.addnew CardCard.Value.THREE, Card.Suit.HEART  ) );
119         cards.addnew CardCard.Value.FOUR, Card.Suit.HEART ) );
120         cards.addnew CardCard.Value.FIVE, Card.Suit.HEART ) );
121         cards.addnew CardCard.Value.SIX, Card.Suit.HEART ) );
122         cards.addnew CardCard.Value.SEVEN , Card.Suit.HEART ) );
123         cards.addnew CardCard.Value.EIGHT, Card.Suit.HEART ) );
124         cards.addnew CardCard.Value.NINE, Card.Suit.HEART ) );
125         cards.addnew CardCard.Value.TEN, Card.Suit.HEART ) );
126         cards.addnew CardCard.Value.JACK, Card.Suit.HEART ) );
127         cards.addnew CardCard.Value.QUEEN, Card.Suit.HEART ) );
128         cards.addnew CardCard.Value.KING, Card.Suit.HEART ) );
129         cards.addnew CardCard.Value.ACE, Card.Suit.HEART ) );
130 
131         cards.addnew CardCard.Value.TWO, Card.Suit.DIAMOND ) );
132         cards.addnew CardCard.Value.THREE, Card.Suit.DIAMOND ) );
133         cards.addnew CardCard.Value.FOUR, Card.Suit.DIAMOND ) );
134         cards.addnew CardCard.Value.FIVE, Card.Suit.DIAMOND ) );
135         cards.addnew CardCard.Value.SIX, Card.Suit.DIAMOND ) );
136         cards.addnew CardCard.Value.SEVEN, Card.Suit.DIAMOND ) );
137         cards.addnew CardCard.Value.EIGHT, Card.Suit.DIAMOND ) );
138         cards.addnew CardCard.Value.NINE, Card.Suit.DIAMOND ) );
139         cards.addnew CardCard.Value.TEN, Card.Suit.DIAMOND ) );
140         cards.addnew CardCard.Value.JACK, Card.Suit.DIAMOND ) );
141         cards.addnew CardCard.Value.QUEEN, Card.Suit.DIAMOND ) );
142         cards.addnew CardCard.Value.KING,  Card.Suit.DIAMOND  ) );
143         cards.addnew CardCard.Value.ACE, Card.Suit.DIAMOND ) );
144         _cards = Collections.unmodifiableListcards );
145     }
146 
147     /**
148      * {@inheritDoc}
149      */
150     public int getNumCardsOfTypefinal Color color ) {
151         if color == null ) {
152             throw new NullPointerException"color" );
153         }
154         if Color.NONE.equalscolor ) ) {
155             return 0;
156         }
157         else {
158             return 26;
159         }
160     }
161 
162     /**
163      * {@inheritDoc}
164      */
165     public int getNumCardsOfTypefinal Suit suit ) {
166         if suit == null ) {
167             throw new NullPointerException"suit" );
168         }
169         if Suit.NONE.equalssuit ) ) {
170             return 0;
171         }
172         else {
173             return 13;
174         }
175     }
176 
177     /**
178      * {@inheritDoc}
179      */
180     public int getNumCardsOfTypefinal Value value ) {
181         if value == null ) {
182             throw new NullPointerException"value" );
183         }
184         if Value.JOKER.equalsvalue ) ) {
185             return 0;
186         }
187         else {
188             return 4;
189         }
190     }
191 
192 // class StandardDeck