From b1540b05e9ccdd644a6801593712b7da950386e8 Mon Sep 17 00:00:00 2001 From: Frederick Yin Date: Wed, 11 Jan 2023 17:26:29 +0800 Subject: Move game setup out of Main --- Game.hs | 35 +++++++++++++++++++++++++++-------- Main.hs | 42 ++++++++---------------------------------- 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/Game.hs b/Game.hs index 3b3c5c8..e6baf67 100644 --- a/Game.hs +++ b/Game.hs @@ -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 diff --git a/Main.hs b/Main.hs index c21cdab..1244051 100644 --- a/Main.hs +++ b/Main.hs @@ -1,38 +1,12 @@ -import System.Random (getStdGen) -import Card (fullDecks, showCard, shuffle) -import Game (Game(..), - players, - playerIdx, - attack, - direction, - stockPile, - discardPile, - prompt, - dealCards, - beginRounds, - ) -import Player (Player(..)) -import qualified Player as P -import Card (Card) -import qualified Card as C +import Game (Game(..), Setup(..), beginGame) main :: IO () main = do - shuffleGen <- getStdGen - let stock = shuffle shuffleGen $ fullDecks 2 - let discard = [] - let defaultPlayers = [ Player "Alice" 0 [] - , Player "Bob" 0 [] - , Player "Carol" 0 [] - ] - let game = Game { players = defaultPlayers - , playerIdx = 0 - , attack = 1 - , direction = 1 - , prevCard = head stock - , stockPile = tail stock - , discardPile = discard - } - - beginRounds 3 True $ dealCards 6 game + let setup = Setup { playerN = 3 + , roundN = 3 + , deckN = 2 + , cardN = 6 + , autoMode = True + } + beginGame setup return () -- cgit v1.2.3