summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-07 20:57:15 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-07 20:57:15 +0800
commit7a1584b0f7c82bd1aaf458344f420ed776787f33 (patch)
treeede56f1432e9f7572e6e6945eaa266fefcd9a30b
parentb881871420b96553037af6790191ff91b3bcdf82 (diff)
G.advanceGame lets player draw/shed card
-rw-r--r--Game.hs25
1 files changed, 21 insertions, 4 deletions
diff --git a/Game.hs b/Game.hs
index 71c6298..d7773df 100644
--- a/Game.hs
+++ b/Game.hs
@@ -17,12 +17,29 @@ data Game = Game { players :: [Player]
, discardPile :: [Card]
}
--- | Advance game state.
+-- | Let current player take their turn.
advanceGame :: Game -> IO Game
advanceGame game@(Game plyrs pidx att dir stock disc) = do
- cardToPlay <- prompt game
- let newPidx = (pidx + 1) `mod` (length plyrs)
- advanceGame (Game plyrs newPidx att dir stock disc)
+ decision <- prompt game
+ let player = plyrs !! pidx
+ let player' = case decision of
+ Nothing -> player `draw` (head stock)
+ Just card -> player `shed` card
+ let stock' = case decision of
+ Nothing -> tail stock
+ Just _ -> stock
+ let disc' = case decision of
+ Nothing -> disc
+ Just card -> card:disc
+ let (left, right) = splitAt pidx plyrs
+ let plyrs' = left ++ [player'] ++ (tail right)
+ let pidx' = (pidx + 1) `mod` (length plyrs)
+ case decision of
+ Nothing -> do
+ putStrLn $ (P.name player) ++ " draws " ++ (C.showCard $ head stock)
+ Just card -> do
+ putStrLn $ (P.name player) ++ " plays " ++ (C.showCard card)
+ advanceGame (Game plyrs' pidx' att dir stock' disc')
-- | Prompt player to play a card (or draw card and skip turn).
prompt :: Game -> IO (Maybe Card)