diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | Card.hs | 27 | ||||
-rw-r--r-- | Game.hs | 11 | ||||
-rw-r--r-- | Main.hs | 6 | ||||
-rw-r--r-- | Player.hs | 9 |
5 files changed, 57 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c56f049 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.undodir/ +*.hi +*.o +Main @@ -0,0 +1,27 @@ +module Card where + +import System.Random (RandomGen, random) + +data Suit = Spade | Heart | Diamond | Club deriving (Show, Eq, Ord, Enum) +data Rank = Two | Three | Four | Five | Six | Seven | Eight + | Nine | Ten | Jack | Queen | King | Ace + deriving (Show, Eq, Ord, Enum) +data Card = Card { suit :: Suit, rank :: Rank } deriving (Show, Eq, Ord) + +-- | Produce one full 52-deck. +fullDeck = [Card st rk | st <- allSuits, rk <- allRanks] + where allSuits = enumFrom $ toEnum 0 + allRanks = enumFrom $ toEnum 0 + +-- | Produce n full 52-decks. +fullDecks :: Int -> [Card] +fullDecks n = concat $ replicate n fullDeck + +-- | Shuffle a list. Works by taking a random entry each time. +shuffle :: (RandomGen g) => g -> [a] -> [a] +shuffle _ [] = [] +shuffle _ [x] = [x] +shuffle gen xs = (head right):(shuffle newGen (left ++ (tail right))) + where (rand, newGen) = random gen + i = rand `mod` (length xs) + (left, right) = splitAt i xs @@ -0,0 +1,11 @@ +module Game where + +import Player (Player) +import qualified Player as P +import Card (Card) +import qualified Card as C + +data Game = Game { players :: [Player] + , stockPile :: [Card] + , discardPile :: [Card] + } @@ -0,0 +1,6 @@ +import System.Random (getStdGen) +import Card (fullDecks, shuffle) + +main = do + gen <- getStdGen + print $ shuffle gen $ fullDecks 1 diff --git a/Player.hs b/Player.hs new file mode 100644 index 0000000..8a2adb6 --- /dev/null +++ b/Player.hs @@ -0,0 +1,9 @@ +module Player where + +import Card (Card) +import qualified Card + +data Player = Player { name :: String + , penalty :: Integer + , cards :: [Card] + } |