#2 Polish CardDeck
This commit is contained in:
parent
91770a48fb
commit
9bb31d9673
1 changed files with 36 additions and 3 deletions
|
@ -1,17 +1,31 @@
|
|||
module CardDeck
|
||||
( Card
|
||||
, CardStatus(..)
|
||||
, CardType (..)
|
||||
, CardValue (..)
|
||||
, CardStatus (..)
|
||||
, Stack
|
||||
|
||||
, generateDeck
|
||||
, generateShuffledDeck
|
||||
|
||||
, showCard
|
||||
, hideCard
|
||||
, flipCard
|
||||
, matchType
|
||||
, matchValue
|
||||
, matchColor
|
||||
) where
|
||||
|
||||
import Shuffle
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- Representation of the Standard 52-card deck. --
|
||||
-- Extra support for handling piles of cards, hiding and showing --
|
||||
-- cards and checking if two match given a property. --
|
||||
----------------------------------------------------------------------
|
||||
|
||||
----------------------------- Constants ------------------------------
|
||||
|
||||
-- Colors of cards
|
||||
data CardType = Clubs
|
||||
| Diamonds
|
||||
|
@ -39,7 +53,7 @@ data CardValue = Ace
|
|||
|
||||
data CardStatus = Hidden
|
||||
| Visible
|
||||
deriving (Show)
|
||||
deriving (Show, Eq)
|
||||
|
||||
-- A card has a type and a value and is either shown or hidden.
|
||||
type Card = (CardType, CardValue, CardStatus)
|
||||
|
@ -47,21 +61,40 @@ type Card = (CardType, CardValue, CardStatus)
|
|||
-- A stack of cards
|
||||
type Stack = [Card]
|
||||
|
||||
-- Generate a standard 52-card deck, given by CardValue and CardType
|
||||
----------------------------------------------------------------------
|
||||
|
||||
-- Generate a standard 52-card deck, with values by CardValue and types
|
||||
-- by CardType. Cards are hidden by default.
|
||||
generateDeck :: Stack
|
||||
generateDeck = [(cType, cValue, Hidden) | cType <- types, cValue <- values]
|
||||
where types = init $ enumFrom Clubs
|
||||
values = init $ enumFrom Ace
|
||||
|
||||
-- Generate a standard 52-card deck and shuffle all cards randomly.
|
||||
generateShuffledDeck :: Stack
|
||||
generateShuffledDeck = shuffle generateDeck
|
||||
|
||||
-- Show a card.
|
||||
showCard :: Card -> Card
|
||||
showCard (t, v, _) = (t,v,Visible)
|
||||
|
||||
-- Hide a card.
|
||||
hideCard :: Card -> Card
|
||||
hideCard (t, v, _) = (t,v,Hidden)
|
||||
|
||||
-- Flip the card. If it was visible, it is now hidden and vice versa.
|
||||
flipCard :: Card -> Card
|
||||
flipCard c@(_, _, Visible) = hideCard c
|
||||
flipCard c@(_, _, Hidden) = showCard c
|
||||
|
||||
-- Check if two cards match type.
|
||||
matchType :: Card -> Card -> Bool
|
||||
matchType (t1, _, _) (t2, _, _) = t1 == t2
|
||||
|
||||
-- Check if two cards match color.
|
||||
matchValue :: Card -> Card -> Bool
|
||||
matchValue (_, v1, _) (_, v2, _) = v1 == v2
|
||||
|
||||
-- Check if two cards have the same color.
|
||||
matchColor :: Card -> Card -> Bool
|
||||
matchColor (t1, _, _) (t2, _, _) = t1 == t2 || (fromEnum t1 + fromEnum t2) `elem` [3, 6]
|
||||
|
|
Reference in a new issue