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 ArrayList( 52 );
089 cards.add( new Card( Card.Value.TWO, Card.Suit.SPADE ) );
090 cards.add( new Card( Card.Value.THREE, Card.Suit.SPADE ) );
091 cards.add( new Card( Card.Value.FOUR, Card.Suit.SPADE ) );
092 cards.add( new Card( Card.Value.FIVE, Card.Suit.SPADE ) );
093 cards.add( new Card( Card.Value.SIX, Card.Suit.SPADE ) );
094 cards.add( new Card( Card.Value.SEVEN, Card.Suit.SPADE ) );
095 cards.add( new Card( Card.Value.EIGHT, Card.Suit.SPADE ) );
096 cards.add( new Card( Card.Value.NINE, Card.Suit.SPADE ) );
097 cards.add( new Card( Card.Value.TEN, Card.Suit.SPADE ) );
098 cards.add( new Card( Card.Value.JACK, Card.Suit.SPADE ) );
099 cards.add( new Card( Card.Value.QUEEN, Card.Suit.SPADE ) );
100 cards.add( new Card( Card.Value.KING, Card.Suit.SPADE ) );
101 cards.add( new Card( Card.Value.ACE, Card.Suit.SPADE ) );
102
103 cards.add( new Card( Card.Value.TWO, Card.Suit.CLUB ) );
104 cards.add( new Card( Card.Value.THREE, Card.Suit.CLUB ) );
105 cards.add( new Card( Card.Value.FOUR, Card.Suit.CLUB ) );
106 cards.add( new Card( Card.Value.FIVE, Card.Suit.CLUB ) );
107 cards.add( new Card( Card.Value.SIX, Card.Suit.CLUB ) );
108 cards.add( new Card( Card.Value.SEVEN, Card.Suit.CLUB ) );
109 cards.add( new Card( Card.Value.EIGHT, Card.Suit.CLUB ) );
110 cards.add( new Card( Card.Value.NINE, Card.Suit.CLUB ) );
111 cards.add( new Card( Card.Value.TEN, Card.Suit.CLUB ) );
112 cards.add( new Card( Card.Value.JACK, Card.Suit.CLUB ) );
113 cards.add( new Card( Card.Value.QUEEN, Card.Suit.CLUB ) );
114 cards.add( new Card( Card.Value.KING, Card.Suit.CLUB ) );
115 cards.add( new Card( Card.Value.ACE, Card.Suit.CLUB ) );
116
117 cards.add( new Card( Card.Value.TWO, Card.Suit.HEART ) );
118 cards.add( new Card( Card.Value.THREE, Card.Suit.HEART ) );
119 cards.add( new Card( Card.Value.FOUR, Card.Suit.HEART ) );
120 cards.add( new Card( Card.Value.FIVE, Card.Suit.HEART ) );
121 cards.add( new Card( Card.Value.SIX, Card.Suit.HEART ) );
122 cards.add( new Card( Card.Value.SEVEN , Card.Suit.HEART ) );
123 cards.add( new Card( Card.Value.EIGHT, Card.Suit.HEART ) );
124 cards.add( new Card( Card.Value.NINE, Card.Suit.HEART ) );
125 cards.add( new Card( Card.Value.TEN, Card.Suit.HEART ) );
126 cards.add( new Card( Card.Value.JACK, Card.Suit.HEART ) );
127 cards.add( new Card( Card.Value.QUEEN, Card.Suit.HEART ) );
128 cards.add( new Card( Card.Value.KING, Card.Suit.HEART ) );
129 cards.add( new Card( Card.Value.ACE, Card.Suit.HEART ) );
130
131 cards.add( new Card( Card.Value.TWO, Card.Suit.DIAMOND ) );
132 cards.add( new Card( Card.Value.THREE, Card.Suit.DIAMOND ) );
133 cards.add( new Card( Card.Value.FOUR, Card.Suit.DIAMOND ) );
134 cards.add( new Card( Card.Value.FIVE, Card.Suit.DIAMOND ) );
135 cards.add( new Card( Card.Value.SIX, Card.Suit.DIAMOND ) );
136 cards.add( new Card( Card.Value.SEVEN, Card.Suit.DIAMOND ) );
137 cards.add( new Card( Card.Value.EIGHT, Card.Suit.DIAMOND ) );
138 cards.add( new Card( Card.Value.NINE, Card.Suit.DIAMOND ) );
139 cards.add( new Card( Card.Value.TEN, Card.Suit.DIAMOND ) );
140 cards.add( new Card( Card.Value.JACK, Card.Suit.DIAMOND ) );
141 cards.add( new Card( Card.Value.QUEEN, Card.Suit.DIAMOND ) );
142 cards.add( new Card( Card.Value.KING, Card.Suit.DIAMOND ) );
143 cards.add( new Card( Card.Value.ACE, Card.Suit.DIAMOND ) );
144 _cards = Collections.unmodifiableList( cards );
145 }
146
147 /**
148 * {@inheritDoc}
149 */
150 public int getNumCardsOfType( final Color color ) {
151 if ( color == null ) {
152 throw new NullPointerException( "color" );
153 }
154 if ( Color.NONE.equals( color ) ) {
155 return 0;
156 }
157 else {
158 return 26;
159 }
160 }
161
162 /**
163 * {@inheritDoc}
164 */
165 public int getNumCardsOfType( final Suit suit ) {
166 if ( suit == null ) {
167 throw new NullPointerException( "suit" );
168 }
169 if ( Suit.NONE.equals( suit ) ) {
170 return 0;
171 }
172 else {
173 return 13;
174 }
175 }
176
177 /**
178 * {@inheritDoc}
179 */
180 public int getNumCardsOfType( final Value value ) {
181 if ( value == null ) {
182 throw new NullPointerException( "value" );
183 }
184 if ( Value.JOKER.equals( value ) ) {
185 return 0;
186 }
187 else {
188 return 4;
189 }
190 }
191
192 } // class StandardDeck
|