diff options
author | Frederick Yin <fkfd@fkfd.me> | 2023-01-07 20:57:15 +0800 |
---|---|---|
committer | Frederick Yin <fkfd@fkfd.me> | 2023-01-07 20:57:15 +0800 |
commit | 7a1584b0f7c82bd1aaf458344f420ed776787f33 (patch) | |
tree | ede56f1432e9f7572e6e6945eaa266fefcd9a30b | |
parent | b881871420b96553037af6790191ff91b3bcdf82 (diff) |
G.advanceGame lets player draw/shed card
-rw-r--r-- | Game.hs | 25 |
1 files changed, 21 insertions, 4 deletions
@@ -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) |