import java.awt.*; // for $Color$, for people who want to do graphics public class Card { public final static int CLUB = 0; public final static int DIAMOND= 1; public final static int HEART = 2; public final static int SPADE = 3; public final static String suitnames = "CDHS"; public final static int ACE = 1; public final static int JACK = 11; public final static int QUEEN = 12; public final static int KING = 13; public final static String valuenames = "?A23456789TJQK"; private int mysuit; // CLUB, DIAMOND, HEART, or SPADE private int myvalue; // ACE..KING public int suit() { return mysuit; } public int value() { return myvalue; } public boolean isred() { return mysuit == DIAMOND || mysuit == HEART; } public boolean isblack() { return !isred(); } public Color color() { return isred() ? Color.red : Color.black; } // constructor public Card(int suit, int value) { mysuit = suit; myvalue = value; } // 2-letter representation public String toString() { return valuenames.charAt(myvalue) + "" + suitnames.charAt(mysuit); } } // note: below we assume piles never hold more than 52 cards public class Pile { // $cards[0..size-1]$ holds cards: private int size = 0; // position $0$ is the top private Card[] cards = new Card[52]; // position $size-1$ is the bottom // constructor: return full 52-card deck or empty (!full) pile public Pile(boolean full) { if (full) for (int value = 1; value <= 13; value++) { cards[size] = new Card(Card.CLUB, value); size++; cards[size] = new Card(Card.DIAMOND, value); size++; cards[size] = new Card(Card.HEART, value); size++; cards[size] = new Card(Card.SPADE, value); size++; } } // number of cards public int count() { return size; } // return $i$-th card from the bottom of non-empty Pile // (0=bottom; client must check bounds) public Card at(int i) { return cards[size-1-i]; } // return bottom card of non-empty Pile (client must check: size>0) public Card bottom() { return at(0); } // scramble order of cards by swapping each cards[i] with a random cards[j] public void scramble() { for (int i=size-1; i>0; i--) { int j = (int) (Math.random() * (i+1)); // swap cards at positions i, j Card c = cards[i]; cards[i] = cards[j]; cards[j] = c; } } // deal 1 card from self onto destination public void deal(Pile destination) { size--; destination.cards[destination.size] = cards[size]; destination.size++; } // return the list of cards from top to bottom public String toString() { if (size == 0) return "----"; String s = ""; for (int i = size-1; i >= 0; i--) { s += (i < size-1 ? " " : "") + cards[i]; } return s; } }