enum Suit {
SPADE { public String toString() { return "Spade"; } },
HEART { public String toString() { return "Heart"; } },
CLUB { public String toString() { return "Club"; } },
DIAMOND { public String toString() { return "Diamond"; } }
}
enum Face {
ACE { public String toString() { return "A"; } },
DEUCE { public String toString() { return "2"; } },
THREE { public String toString() { return "3"; } },
FOUR { public String toString() { return "4"; } },
FIVE { public String toString() { return "5"; } },
SIX { public String toString() { return "6"; } },
SEVEN { public String toString() { return "7"; } },
EIGHT { public String toString() { return "8"; } },
NINE { public String toString() { return "9"; } },
TEN { public String toString() { return "10"; } },
JACK { public String toString() { return "J"; } },
QUEEN { public String toString() { return "Q"; } },
KING { public String toString() { return "K"; } }
}
class Card {
private final Suit suit;
private final Face face;
public Card(Suit suit, Face face) {
this.suit = suit;
this.face = face;
}
public String toString() {
return suit.toString() + " " + face.toString();
}
}
class Deck {
private Card[] cards = new Card[52];
private int currentCardIndex = 0;
public Deck() {
int index = 0;
for (Suit suit : Suit.values()) {
for (Face face : Face.values()) {
cards[index++] = new Card(suit, face);
}
}
}
public void shuffle() {
java.util.Random random = new java.util.Random();
for (int i = 0; i < cards.length; ++i) {
ArrayUtilities.swap(cards, i, random.nextInt(cards.length));
}
}
public Card deal() {
if (currentCardIndex > cards.length)
return null;
Card card = cards[currentCardIndex];
cards[currentCardIndex++] = null;
return card;
}
}
class CardPlayer {
private java.util.List<Card> cards;
public CardPlayer() {
cards = new java.util.ArrayList<Card>();
}
public void getCard(Card card) {
cards.add(card);
}
public void showCards() {
System.out.println(cards);
}
}
abstract class CardGame {
protected Deck deck;
protected int numberOfCard;
protected int numberOfPlayer;
protected CardGame(int numberOfCard, int numberOfPlayer) {
deck = new Deck();
this.numberOfCard = numberOfCard;
this.numberOfPlayer = numberOfPlayer;
}
public void shuffle() {
deck.shuffle();
}
public abstract void displayDescription();
public abstract void deal(CardPlayer player);
}
class CardGameA extends CardGame {
protected CardGameA() {
super(5, 4);
}
public void deal(CardPlayer player) {
for (int i = 0; i < 5; ++i) {
player.getCard(deck.deal());
}
}
public void displayDescription() {
System.out.println("Card Game A");
}
}
class CardGameB extends CardGame {
protected CardGameB() {
super(13, 4);
}
public void deal(CardPlayer player) {
for (int i = 0; i < 13; ++i) {
player.getCard(deck.deal());
}
}
public void displayDescription() {
System.out.println("Card Game B");
}
}
public class PlayCardGames {
public static void main(String[] args) {
testCardGame(new CardGameA());
testCardGame(new CardGameB());
}
static void testCardGame(CardGame game) {
CardPlayer[] players = {new CardPlayer(), new CardPlayer(),
new CardPlayer(), new CardPlayer(), };
game.shuffle();
for (CardPlayer player : players) {
game.deal(player);
}
game.displayDescription();
for (CardPlayer player : players) {
player.showCards();
}
}
}
class ArrayUtilities {
public static <T> void swap(T[] array, int i1, int i2) {
T temp = array[i1];
array[i1] = array[i2];
array[i2] = temp;
}
}