/*******************************************************************************
 * Companion code for the book "Introduction to Software Design with Java",
 * 2nd edition by Martin P. Robillard.
 *
 * Copyright (C) 2022 by Martin P. Robillard
 *
 * This code is licensed under a Creative Commons 
 * Attribution-NonCommercial-NoDerivatives 4.0 International License.
 * 
 * See http://creativecommons.org/licenses/by-nc-nd/4.0/
 * 
 *******************************************************************************/
package e2.chapter2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Represents a deck of playing cards. In this version, the cards in the 
 * deck are stored in a list and the list of cards in the deck can 
 * be obtained by client code using an immutable wrapper object.
 */
public class Deck {
private List<Card> aCards = new ArrayList<>();
/** * Creates a new deck of 52 cards, shuffled. */ public Deck() { shuffle(); } /** * Reinitializes the deck with all 52 cards, and shuffles them. */ public void shuffle() { aCards.clear(); for( Suit suit : Suit.values() ) { for( Rank rank : Rank.values() ) { aCards.add( new Card( rank, suit )); } } Collections.shuffle(aCards); } /** * Places pCard on top of the deck. * @param pCard The card to place on top * of the deck.
* @pre pCard !=null
*/ public void push(Card pCard) {
assert pCard != null;
aCards.add(pCard); } /** * Draws a card from the deck: removes the card from the top * of the deck and returns it. * @return The card drawn. * @pre !isEmpty() */ public Card draw() { assert !isEmpty(); return aCards.remove(aCards.size() - 1); } /** * @return True if and only if there are no cards in the deck. */ public boolean isEmpty() { return aCards.isEmpty(); } /** * @return An unmodifiable list of all the cards in the deck. */ public List<Card> getCards() { return Collections.unmodifiableList(aCards); } }