package solitaire;
class Main {
+ private static Stock stock = new Stock();
+ private static Waste waste = new Waste();
+
+ private static void printTable() {
+ System.out.printf("%s %s\n", stock, waste);
+ }
public static void main(String[] args) {
- Deck d = new Deck();
- System.out.println(d);
+ Card c;
+
+ while (!stock.isEmpty()) {
+ printTable();
- while (!d.isEmpty()) {
- Card c = d.draw();
+ c = stock.draw();
c.reveal();
- System.out.println(c);
+ waste.add(c);
}
- System.out.println(d);
+ printTable();
}
}
package solitaire;
+import java.util.List;
+
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");
+ static final List<Rank> RANKS = List.of(Rank.values());
+
private final String symbol;
Rank(String symbol) {
package solitaire;
-import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedList;
import java.util.List;
-final class Deck {
- private static final Suit[] suits = Suit.values();
- private static final Rank[] ranks = Rank.values();
-
+final class Stock {
private final List<Card> cards;
- Deck() {
- this.cards = new ArrayList<>(suits.length * ranks.length);
+ Stock() {
+ this.cards = new LinkedList<>();
- for (Suit s : suits)
- for (Rank r : ranks)
+ for (Suit s : Suit.SUITS)
+ for (Rank r : Rank.RANKS)
cards.add(new Card(s, r));
- }
- void shuffle() {
Collections.shuffle(cards);
}
package solitaire;
+import java.util.List;
+
enum Suit {
CLUBS("♣", false), DIAMONDS("♦", true), HEARTS("♥", true), SPADES("♠", false);
+ static final List<Suit> SUITS = List.of(Suit.values());
+
private final String symbol;
private final boolean red;
--- /dev/null
+package solitaire;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+final class Waste {
+ private final List<Card> cards;
+
+ Waste() {
+ this.cards = new LinkedList<>();
+ }
+
+ void add(Card card) {
+ cards.add(card);
+ }
+
+ Card draw() {
+ return cards.removeLast();
+ }
+
+ boolean isEmpty() {
+ return cards.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ if (isEmpty())
+ return "{ }";
+
+ return cards.stream().map(String::valueOf).collect(Collectors.joining("", "{ ", " }"));
+ }
+}