summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-04 20:40:46 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-04 20:40:46 +0800
commit6a8ff0ff2a09e7fe896d5fff3dda047bef6d1ced (patch)
treeed62b3df0975dad1e99b75c6129804427194d434
Full decks and shuffling
-rw-r--r--.gitignore4
-rw-r--r--Card.hs27
-rw-r--r--Game.hs11
-rw-r--r--Main.hs6
-rw-r--r--Player.hs9
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
diff --git a/Card.hs b/Card.hs
new file mode 100644
index 0000000..c0a13a8
--- /dev/null
+++ b/Card.hs
@@ -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
diff --git a/Game.hs b/Game.hs
new file mode 100644
index 0000000..3b02598
--- /dev/null
+++ b/Game.hs
@@ -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]
+ }
diff --git a/Main.hs b/Main.hs
new file mode 100644
index 0000000..b858907
--- /dev/null
+++ b/Main.hs
@@ -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]
+ }