summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-11 17:26:29 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-11 17:26:29 +0800
commitb1540b05e9ccdd644a6801593712b7da950386e8 (patch)
tree078f821cac7b0cfaa57060fad992ea2d8d639d33
parent7f34eef9fb39824ea5457368db593adca7b5c30b (diff)
Move game setup out of Main
-rw-r--r--Game.hs35
-rw-r--r--Main.hs42
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 ()