diff options
Diffstat (limited to 'Game.hs')
-rw-r--r-- | Game.hs | 35 |
1 files changed, 27 insertions, 8 deletions
@@ -2,7 +2,7 @@ module Game where import Data.Char (isDigit) import Control.Monad (mapM_) -import System.Random (RandomGen, newStdGen) +import System.Random (RandomGen, getStdGen, newStdGen) import Player (Player(..), shed, draw) import qualified Player as P import Card (Card(..)) @@ -24,6 +24,32 @@ data Game = Game { players :: [Player] , discardPile :: [Card] } +-- | Set up game. +beginGame :: Setup -> IO Game +beginGame setup@(Setup n r d c a) = do + gen <- getStdGen + let decks = C.shuffle gen $ C.fullDecks d + let defaultPlayers = [ Player "Alice" 0 [] + , Player "Bob" 0 [] + , Player "Carol" 0 [] + ] + let game = Game { players = defaultPlayers + , playerIdx = 0 -- TODO: determine first player + , attack = 1 + , direction = 1 + , prevCard = head decks + , stockPile = tail decks + , discardPile = [] + } + beginRound setup game + +-- | Begin round. +beginRound :: Setup -> Game -> IO Game +beginRound (Setup _ 0 _ _ _) game = return game +beginRound (Setup n r d c a) game = do + game' <- beginTurn a $ dealCards c game + beginRound (Setup n (r - 1) d c a) game' + -- | Deal c cards to each player in game. dealCards :: Int -> Game -> Game dealCards c game@(Game plyrs _ _ _ _ stock disc) @@ -35,13 +61,6 @@ dealCards c game@(Game plyrs _ _ _ _ stock disc) giveOneCardEach = zipWith (\card player -> player { P.cards = card:(P.cards player) }) --- | Begin game. -beginRounds :: Setup -> Game -> IO Game -beginRounds (Setup _ 0 _ _ _) game = return game -beginRounds (Setup n r d c a) game = do - game' <- beginTurn a game - beginRounds (Setup n (r - 1) d c a) game' - -- | Let current player take their turn. beginTurn :: Bool -> Game -> IO Game beginTurn auto game@(Game plyrs pidx att dir prev stock disc) = do |