#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
|
module CardDeck
|
||||||
( Card
|
( Card
|
||||||
, CardStatus(..)
|
, CardType (..)
|
||||||
|
, CardValue (..)
|
||||||
|
, CardStatus (..)
|
||||||
, Stack
|
, Stack
|
||||||
|
|
||||||
, generateDeck
|
, generateDeck
|
||||||
, generateShuffledDeck
|
, generateShuffledDeck
|
||||||
|
|
||||||
, showCard
|
, showCard
|
||||||
, hideCard
|
, hideCard
|
||||||
, flipCard
|
, flipCard
|
||||||
|
, matchType
|
||||||
|
, matchValue
|
||||||
|
, matchColor
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Shuffle
|
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
|
-- Colors of cards
|
||||||
data CardType = Clubs
|
data CardType = Clubs
|
||||||
| Diamonds
|
| Diamonds
|
||||||
|
@ -39,7 +53,7 @@ data CardValue = Ace
|
||||||
|
|
||||||
data CardStatus = Hidden
|
data CardStatus = Hidden
|
||||||
| Visible
|
| Visible
|
||||||
deriving (Show)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
-- A card has a type and a value and is either shown or hidden.
|
-- A card has a type and a value and is either shown or hidden.
|
||||||
type Card = (CardType, CardValue, CardStatus)
|
type Card = (CardType, CardValue, CardStatus)
|
||||||
|
@ -47,21 +61,40 @@ type Card = (CardType, CardValue, CardStatus)
|
||||||
-- A stack of cards
|
-- A stack of cards
|
||||||
type Stack = [Card]
|
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 :: Stack
|
||||||
generateDeck = [(cType, cValue, Hidden) | cType <- types, cValue <- values]
|
generateDeck = [(cType, cValue, Hidden) | cType <- types, cValue <- values]
|
||||||
where types = init $ enumFrom Clubs
|
where types = init $ enumFrom Clubs
|
||||||
values = init $ enumFrom Ace
|
values = init $ enumFrom Ace
|
||||||
|
|
||||||
|
-- Generate a standard 52-card deck and shuffle all cards randomly.
|
||||||
generateShuffledDeck :: Stack
|
generateShuffledDeck :: Stack
|
||||||
generateShuffledDeck = shuffle generateDeck
|
generateShuffledDeck = shuffle generateDeck
|
||||||
|
|
||||||
|
-- Show a card.
|
||||||
showCard :: Card -> Card
|
showCard :: Card -> Card
|
||||||
showCard (t, v, _) = (t,v,Visible)
|
showCard (t, v, _) = (t,v,Visible)
|
||||||
|
|
||||||
|
-- Hide a card.
|
||||||
hideCard :: Card -> Card
|
hideCard :: Card -> Card
|
||||||
hideCard (t, v, _) = (t,v,Hidden)
|
hideCard (t, v, _) = (t,v,Hidden)
|
||||||
|
|
||||||
|
-- Flip the card. If it was visible, it is now hidden and vice versa.
|
||||||
flipCard :: Card -> Card
|
flipCard :: Card -> Card
|
||||||
flipCard c@(_, _, Visible) = hideCard c
|
flipCard c@(_, _, Visible) = hideCard c
|
||||||
flipCard c@(_, _, Hidden) = showCard 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