import java.util.ArrayList; public class Game { private Deck drawDeck; private Deck discardDeck; private ArrayList players; private Card upCard() { return discardDeck.get(discardDeck.getSize() - 1); } public Game() { // set up the draw deck drawDeck = new Deck(false); drawDeck.shuffle(); // set up discard deck discardDeck = new Deck(true); // create one human and one ai player players = new ArrayList<>(); players.add(new Player(true)); players.add(new Player(false)); players.add(new Player(false)); // give the players their 7 cards for (int i = 0; i < 7; i++) { for (Player p : players) { p.giveCard(drawDeck.deal(), false); } } // flip the first up card discardDeck.add(drawDeck.deal()); } // this method draws a card from the deck -- it performs the // re-shuffle if the deck is empty private Card dealCard() { // re-shuffle if needed if (drawDeck.getSize() == 0) { // save the upcard Card upCard = discardDeck.take(discardDeck.getSize() - 1); // move all cards from discard to draw while (discardDeck.getSize() > 0) { drawDeck.add(discardDeck.deal()); } // shuffle the draw deck drawDeck.shuffle(); // put the up card back on discard deck discardDeck.add(upCard); System.out.println("The deck was re-shuffled!"); } // deal from the draw deck which we now know is not empty return drawDeck.deal(); } public boolean canPlay(Card candidate) { Card up = upCard(); /* 8's are crazy */ if (candidate.getRank() == 8) { return true; } /* one of suit/rank must match */ if (candidate.getRank() == up.getRank()) { return true; } if (candidate.getSuit() == up.getSuit()) { return true; } return false; } public void play() { int currentPlayer = 0; boolean playing = true; while (playing) { // print game state System.out.println(); for (int i = 0; i < players.size(); i++) { System.out.println("Player " + i + " has " + players.get(i).numCards() + " cards."); } System.out.println("It is player " + currentPlayer + "'s turn!"); Player p = players.get(currentPlayer); // get a move from the player boolean valid = false; while (!valid) { Card candidate = p.playCard(upCard()); if (candidate == null) { Card newCard = dealCard(); System.out.println("Player " + currentPlayer + " had to daw a card."); p.giveCard(newCard, true); } else if (canPlay(candidate)) { System.out.println("Player " + currentPlayer + " played the " + candidate); discardDeck.add(candidate); valid = true; } else { System.out.println("You can't play " + candidate + " on the " + upCard()); p.giveCard(candidate, false); } } // check if they won if (p.hasWon()) { System.out.println("Congratulations, player " + currentPlayer + " has won!"); playing = false; } // move to next player currentPlayer = (currentPlayer + 1) % players.size(); } } }