126 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package cards.maumau.model;
 | |
| 
 | |
| import cards.Card;
 | |
| 
 | |
| import java.util.Collections;
 | |
| import java.util.LinkedList;
 | |
| import java.util.List;
 | |
| 
 | |
| /**
 | |
|  * Manages the draw pile and discard pile in a MauMau game.
 | |
|  */
 | |
| public class CardHandler {
 | |
|     private final MauMau game;
 | |
|     private final int numCardsPerPlayer;
 | |
|     private final List<Card> drawPile = new LinkedList<>();
 | |
|     private final List<Card> discardPile = new LinkedList<>();
 | |
| 
 | |
|     /**
 | |
|      * Constructs a CardHandler for the specified MauMau game, deck, and number of cards per player.
 | |
|      *
 | |
|      * @param game              The MauMau game instance.
 | |
|      * @param deck              The deck of cards.
 | |
|      * @param numCardsPerPlayer The number of cards per player.
 | |
|      */
 | |
|     CardHandler(MauMau game, List<Card> deck, int numCardsPerPlayer) {
 | |
|         this.game = game;
 | |
|         this.numCardsPerPlayer = numCardsPerPlayer;
 | |
|         drawPile.addAll(deck);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the draw pile containing remaining cards.
 | |
|      *
 | |
|      * @return The draw pile.
 | |
|      */
 | |
|     List<Card> getDrawPile() {
 | |
|         return drawPile;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the discard pile containing played cards.
 | |
|      *
 | |
|      * @return The discard pile.
 | |
|      */
 | |
|     List<Card> getDiscardPile() {
 | |
|         return discardPile;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Draws a card from the draw pile.
 | |
|      *
 | |
|      * @return The drawn card, or null if the draw pile is empty.
 | |
|      */
 | |
|     Card drawCard() {
 | |
|         if (drawPile.isEmpty())
 | |
|             reuseDiscardedCards();
 | |
|         if (!drawPile.isEmpty())
 | |
|             return drawPile.removeFirst();
 | |
|         game.getActionHandler().cancelGame();
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     private void reuseDiscardedCards() {
 | |
|         if (discardPile.isEmpty()) return;
 | |
|         final Card top = discardPile.removeFirst();
 | |
|         Collections.shuffle(discardPile);
 | |
|         drawPile.addAll(discardPile);
 | |
|         discardPile.clear();
 | |
|         discardPile.addFirst(top);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Deals cards to all players.
 | |
|      * @throws Exception when there are not enough cards to satisfy starting conditions
 | |
|      */
 | |
|     public void dealCards() throws Exception {
 | |
| 
 | |
|         // get List of players
 | |
|         List<Player> players = game.getPlayers();
 | |
| 
 | |
| 
 | |
|         //checks if there are enough cards to be dealt
 | |
|         int totalCardsNeeded = players.size() * numCardsPerPlayer + 1;
 | |
| 
 | |
|         if (totalCardsNeeded > drawPile.size() ){
 | |
|             throw new Exception("Not enough cards to deal!");
 | |
|         }
 | |
| 
 | |
|         
 | |
|         for (int i = 0; i < numCardsPerPlayer; i++) {
 | |
| 
 | |
|             for (int j = 0; j < players.size(); j++) {
 | |
| 
 | |
|                 // get the current player
 | |
|                 Player currPlayer = players.get(j);
 | |
| 
 | |
|                 //execute drawCards as currPlayer to draw 1 card
 | |
|                 currPlayer.drawCards(1);
 | |
|                 
 | |
| 
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Put the starting card on the discard Pile
 | |
|         discard(drawCard());
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Discards a card onto the discard pile.
 | |
|      *
 | |
|      * @param c The card to discard.
 | |
|      */
 | |
|     void discard(Card c) {
 | |
|         discardPile.addFirst(c);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the top card of the discard pile.
 | |
|      *
 | |
|      * @return The top card of the discard pile.
 | |
|      */
 | |
|     public Card top() {
 | |
|         return discardPile.getFirst();
 | |
|     }
 | |
| }
 |