Task

Create a data structure and the associated methods to define and manipulate a deck of   playing cards.

The deck should contain 52 unique cards.

The methods must include the ability to:

   make a new deck
   shuffle (randomize) the deck
   deal from the deck
   print the current contents of a deck 
Each card must have a pip value and a suit value which constitute the unique value of the card.

Related tasks:

 Card shuffles
 Deal cards_for_FreeCell
 War Card_Game
 Poker hand_analyser
 Go Fish


import groovy.transform.TupleConstructor
 
enum Pip {
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING
}
enum Suit {
    DIAMONDS, SPADES, HEARTS, CLUBS
}
 
@TupleConstructor
class Card {
    final Pip pip
    final Suit suit
 
    String toString() { "$pip of $suit" }
}
 
class Deck {
    private LinkedList cards = []
 
    Deck() { reset() }
 
    void reset() {
        cards = []
        Suit.values().each { suit ->
            Pip.values().each { pip ->
                cards << new Card(pip, suit)
            }
        }
    }
 
    Card deal() { cards.poll() }
 
    void shuffle() { Collections.shuffle cards }
 
    String toString() { cards.isEmpty() ? "Empty Deck" : "Deck $cards" }
}