package solitaire;
final class Card {
- private final Suit suit;
- private final Rank rank;
- private boolean hidden;
-
- Card(Suit suit, Rank rank, boolean hidden) {
- this.suit = suit;
- this.rank = rank;
- this.hidden = hidden;
- }
-
- Card(Suit suit, Rank rank) {
- this(suit, rank, true);
- }
-
- Suit getSuit() {
- return this.suit;
- }
-
- Rank getRank() {
- return this.rank;
- }
-
- boolean isHidden() {
- return this.hidden;
- }
-
- void reveal() {
- this.hidden = false;
- }
-
- @Override
- public String toString() {
- if (this.hidden)
- return " * ";
-
- return String.format("%s%2s", this.suit, this.rank);
- }
+ private final Suit suit;
+ private final Rank rank;
+ private boolean hidden;
+
+ Card(Suit suit, Rank rank, boolean hidden) {
+ this.suit = suit;
+ this.rank = rank;
+ this.hidden = hidden;
+ }
+
+ Card(Suit suit, Rank rank) {
+ this(suit, rank, true);
+ }
+
+ Suit getSuit() {
+ return suit;
+ }
+
+ Rank getRank() {
+ return rank;
+ }
+
+ boolean isHidden() {
+ return hidden;
+ }
+
+ void reveal() {
+ hidden = false;
+ }
+
+ @Override
+ public String toString() {
+ if (isHidden())
+ return "[ * ]";
+
+ return String.format("[%s%2s]", suit, rank);
+ }
}
--- /dev/null
+package solitaire;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+final class Deck {
+ private static final Suit[] suits = Suit.values();
+ private static final Rank[] ranks = Rank.values();
+
+ private final List<Card> cards;
+
+ Deck() {
+ this.cards = new ArrayList<>(suits.length * ranks.length);
+
+ for (Suit s : suits)
+ for (Rank r : ranks)
+ cards.add(new Card(s, r));
+ }
+
+ void shuffle() {
+ Collections.shuffle(cards);
+ }
+
+ Card draw() {
+ return cards.removeLast();
+ }
+
+ boolean isEmpty() {
+ return cards.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ if (isEmpty())
+ return "{ }";
+
+ return "{ * }";
+ }
+}
class Main {
- public static void main(String[] args) {
- Card c = new Card(Suit.SPADES, Rank.TEN);
- c.reveal();
- System.out.println(c);
+ public static void main(String[] args) {
+ Deck d = new Deck();
+ System.out.println(d);
+
+ while (!d.isEmpty()) {
+ Card c = d.draw();
+ c.reveal();
+ System.out.println(c);
}
+ System.out.println(d);
+ }
+
}
package solitaire;
enum Rank {
- ACE("A"),
- TWO("2"),
- THREE("3"),
- FOUR("4"),
- FIVE("5"),
- SIX("6"),
- SEVEN("7"),
- EIGHT("8"),
- NINE("9"),
- TEN("10"),
- JACK("J"),
- QUEEN("Q"),
- KING("K");
-
- private String symbol;
-
- Rank(String symbol) {
- this.symbol = symbol;
- }
-
- @Override
- public String toString() {
- return this.symbol;
- }
+ ACE("A"), TWO("2"), THREE("3"), FOUR("4"), FIVE("5"), SIX("6"), SEVEN("7"), EIGHT("8"), NINE("9"), TEN("10"),
+ JACK("J"), QUEEN("Q"), KING("K");
+
+ private final String symbol;
+
+ Rank(String symbol) {
+ this.symbol = symbol;
+ }
+
+ @Override
+ public String toString() {
+ return symbol;
+ }
}
package solitaire;
enum Suit {
- CLUBS("♣", false),
- DIAMONDS("♦", true),
- HEARTS("♥", true),
- SPADES("♠", false);
-
- private String symbol;
- private boolean red;
-
- Suit(String symbol, boolean red) {
- this.symbol = symbol;
- this.red = red;
- }
-
- boolean isRed() {
- return this.red;
- }
-
- boolean isBlack() {
- return !this.red;
- }
-
- @Override
- public String toString() {
- return this.symbol;
- }
+ CLUBS("♣", false), DIAMONDS("♦", true), HEARTS("♥", true), SPADES("♠", false);
+
+ private final String symbol;
+ private final boolean red;
+
+ Suit(String symbol, boolean red) {
+ this.symbol = symbol;
+ this.red = red;
+ }
+
+ boolean isRed() {
+ return red;
+ }
+
+ boolean isBlack() {
+ return !red;
+ }
+
+ @Override
+ public String toString() {
+ return symbol;
+ }
}