summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@fkfd.me>2023-01-18 11:36:56 +0800
committerFrederick Yin <fkfd@fkfd.me>2023-01-18 11:36:56 +0800
commit018486dde08e85cd52d12bac845f0cc5d199e20c (patch)
tree3d26e8cfb2fb3c483f9054a69adaadcbd5b9bd6d
parente9405365b1d19aef2c0bbf0e66476be9e556c384 (diff)
Determine first player
-rw-r--r--Game.hs25
1 files changed, 22 insertions, 3 deletions
diff --git a/Game.hs b/Game.hs
index 2fd87c1..2888bbe 100644
--- a/Game.hs
+++ b/Game.hs
@@ -1,7 +1,9 @@
module Game where
import Prelude hiding (round)
+import qualified Data.List as L
import Data.Char (isDigit)
+import Data.Function (on)
import Control.Monad (mapM_)
import System.Random (RandomGen, getStdGen, newStdGen)
import Player (Player(..), shed, draw)
@@ -31,21 +33,38 @@ beginGame :: Setup -> IO Game
beginGame setup@(Setup n r d c a) = do
gen <- getStdGen
let decks = C.shuffle gen $ C.fullDecks d
+ let stock = drop n decks
let defaultPlayers = [ Player "Alice" 0 []
, Player "Bob" 0 []
, Player "Carol" 0 []
]
+ pidx <- firstPlayer defaultPlayers decks
let game = Game { players = defaultPlayers
- , playerIdx = 0 -- TODO: determine first player
+ , playerIdx = pidx
, attack = 1
, direction = 1
- , prevCard = head decks
- , stockPile = tail decks
+ , prevCard = head stock
+ , stockPile = tail stock
, discardPile = []
, round = 0
}
beginRound setup game
+-- | Determine playerIdx from top `n` cards from `stock`.
+firstPlayer :: [Player] -> [Card] -> IO Int
+firstPlayer plyrs stock = do
+ let cards = take (length plyrs) stock
+ putStrLn "Drawing cards to determine playing order..."
+ mapM_ (\(Player name _ _, i) ->
+ putStrLn $ name ++ " draws " ++ C.showCard (cards !! i))
+ $ zip plyrs [0..]
+ let minRank = L.minimumBy (compare `on` C.rank)
+ let playerIdx = case L.elemIndex (minRank cards) cards of
+ Just i -> i
+ Nothing -> 0 -- impossible
+ putStrLn $ (P.name $ plyrs !! playerIdx) ++ " goes first"
+ return playerIdx
+
-- | Begin round.
beginRound :: Setup -> Game -> IO Game
beginRound setup@(Setup _ r d c a) game =