import java.util.Scanner; /** * Simulates a game of Crazy Eights. See * https://en.wikipedia.org/wiki/Crazy_Eights * for basic play and scoring rules. */ public class Eights { private Player one; private Player two; private Hand drawPile; private Hand discardPile; private Scanner in; /** * Initializes the state of the game. */ public Eights() { Deck deck = new Deck("Deck"); deck.shuffle(); // deal cards to each player int handSize = 5; one = new Player("Allen"); deck.deal(one.getHand(), handSize); two = new Player("Chris"); deck.deal(two.getHand(), handSize); // turn one card face up discardPile = new Hand("Discards"); deck.deal(discardPile, 1); // put the rest of the deck face down drawPile = new Hand("Draw pile"); deck.dealAll(drawPile); // create the scanner we'll use to wait for the user in = new Scanner(System.in); } /** * Returns true if either hand is empty. */ public boolean isDone() { return one.getHand().empty() || two.getHand().empty(); } /** * Moves cards from the discard pile to the draw pile and shuffles. */ public void reshuffle() { // save the top card Card prev = discardPile.popCard(); // move the rest of the cards discardPile.dealAll(drawPile); // put the top card back discardPile.addCard(prev); // shuffle the draw pile drawPile.shuffle(); } /** * Returns a card from the draw pile. */ public Card draw() { if (drawPile.empty()) { reshuffle(); } return drawPile.popCard(); } /** * Switches players. */ public Player nextPlayer(Player current) { if (current == one) { return two; } else { return one; } } /** * Displays the state of the game. */ public void displayState() { one.display(); two.display(); discardPile.display(); System.out.print("Draw pile: "); System.out.println(drawPile.size() + " cards"); } /** * Waits for the user to press enter. */ public void waitForUser() { in.nextLine(); } /** * One player takes a turn. */ public void takeTurn(Player player) { Card prev = discardPile.last(); Card next = player.play(this, prev); discardPile.addCard(next); System.out.println(player.getName() + " plays " + next); System.out.println(); } /** * Plays the game. */ public void playGame() { Player player = one; // keep playing until there's a winner while (!isDone()) { displayState(); waitForUser(); takeTurn(player); player = nextPlayer(player); } // display the final score one.displayScore(); two.displayScore(); } /** * Creates the game and runs it. */ public static void main(String[] args) { Eights game = new Eights(); game.playGame(); } }