From bdb4482b8f4556263713fabe34c8b96528c3c494 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Mon, 9 Jan 2023 13:03:38 +0800 Subject: Restore stock pile if depleted --- Game.hs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'Game.hs') diff --git a/Game.hs b/Game.hs index 69c1d08..f2d6fd0 100644 --- a/Game.hs +++ b/Game.hs @@ -2,7 +2,7 @@ module Game where import Data.Char (isDigit) import Control.Monad (when) -import System.Random (RandomGen) +import System.Random (RandomGen, newStdGen) import Player (Player, shed, draw) import qualified Player as P import Card (Card(..)) @@ -49,13 +49,21 @@ beginTurn game@(Game plyrs pidx att dir prev stock disc) = do -- | Game state after player draws card(s) and skips turn. drawAndSkip :: Game -> IO Game drawAndSkip game@(Game plyrs pidx att dir prev stock disc) = do + gen <- newStdGen + let stockLongEnough = if length stock < att + then stock ++ (C.shuffle gen stock) + else stock + let stock' = drop att stockLongEnough + let disc' = if length stock < att + then [] + else disc + let cardsToDraw = take att stockLongEnough let player = plyrs !! pidx - let player' = player `draw` (take att stock) + let player' = player `draw` cardsToDraw let plyrs' = P.update plyrs pidx player' let pidx' = (pidx + dir) `mod` length plyrs - let stock' = drop att stock - putStrLn $ (P.name player) ++ " draws " ++ (C.showCards $ take att stock) - return $ Game plyrs' pidx' att dir prev stock' disc + putStrLn $ (P.name player) ++ " draws " ++ (C.showCards cardsToDraw) + return $ Game plyrs' pidx' att dir prev stock' disc' -- | Game state after player sheds card. shedAndContinue :: Card -> Game -> IO Game -- cgit v1.2.3