1
Fork 0
This repository has been archived on 2023-12-08. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
2022FuncProg-project2-patience/lib/CardDeck.hs

100 lines
2.6 KiB
Haskell

module CardDeck
( Card
, 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
| Hearts
| Spades
| NoneType
deriving (Show, Enum, Eq)
-- Values of cards
data CardValue = Ace
| Two
| Three
| Four
| Five
| Six
| Seven
| Eight
| Nine
| Ten
| Jack
| Queen
| King
| NoneValue
deriving (Show, Enum, Eq)
data CardStatus = Hidden
| Visible
deriving (Show, Eq)
-- A card has a type and a value and is either shown or hidden.
type Card = (CardType, CardValue, CardStatus)
-- A stack of cards
type Stack = [Card]
----------------------------------------------------------------------
-- 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]