track every trick, return detailed match information
This commit is contained in:
+2
-2
@@ -41,7 +41,7 @@ runAI = do
|
|||||||
trs = filter (isTrump $ TrumpColour Spades) cs
|
trs = filter (isTrump $ TrumpColour Spades) cs
|
||||||
if length trs >= 5 && any ((==32) . getID) cs
|
if length trs >= 5 && any ((==32) . getID) cs
|
||||||
then do
|
then do
|
||||||
pts <- fst <$> evalStateT turn env
|
pts <- fst <$> evalSkat turn env
|
||||||
-- if pts > 60 then return 1 else return 0
|
-- if pts > 60 then return 1 else return 0
|
||||||
return pts
|
return pts
|
||||||
else runAI
|
else runAI
|
||||||
@@ -109,4 +109,4 @@ application pending = do
|
|||||||
putStrLn $ BS.unpack msg
|
putStrLn $ BS.unpack msg
|
||||||
|
|
||||||
playSkat :: IO ()
|
playSkat :: IO ()
|
||||||
playSkat = void $ (flip runStateT) env3 playCLI
|
playSkat = void $ (flip runSkat) env3 playCLI
|
||||||
|
|||||||
+14
-1
@@ -5,6 +5,7 @@
|
|||||||
module Skat where
|
module Skat where
|
||||||
|
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
|
import Control.Monad.Writer
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Vector (Vector)
|
import Data.Vector (Vector)
|
||||||
@@ -22,7 +23,19 @@ data SkatEnv = SkatEnv { piles :: Piles
|
|||||||
, currentHand :: Hand }
|
, currentHand :: Hand }
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
type Skat = StateT SkatEnv IO
|
type Trick = (CardS Owner, CardS Owner, CardS Owner)
|
||||||
|
type Skat = StateT SkatEnv (WriterT [Trick] IO)
|
||||||
|
|
||||||
|
runSkat :: Skat a -> SkatEnv -> IO (a, SkatEnv, [Trick])
|
||||||
|
runSkat action env = do
|
||||||
|
((val, env'), tricks) <- runWriterT $ runStateT action env
|
||||||
|
return (val, env', tricks)
|
||||||
|
|
||||||
|
evalSkat :: Skat a -> SkatEnv -> IO a
|
||||||
|
evalSkat action = (fmap fst) . runWriterT . evalStateT action
|
||||||
|
|
||||||
|
execSkat :: Skat a -> SkatEnv -> IO SkatEnv
|
||||||
|
execSkat action = (fmap fst) . runWriterT . execStateT action
|
||||||
|
|
||||||
instance P.MonadPlayer Skat where
|
instance P.MonadPlayer Skat where
|
||||||
trump = gets $ getTrump . game
|
trump = gets $ getTrump . game
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import qualified Skat.Player.Utils as P
|
|||||||
import Skat.Pile hiding (isSkat)
|
import Skat.Pile hiding (isSkat)
|
||||||
import Skat.Card
|
import Skat.Card
|
||||||
import Skat.Utils
|
import Skat.Utils
|
||||||
import Skat (Skat, modifyp, mkSkatEnv)
|
import Skat (Skat, modifyp, mkSkatEnv, evalSkat)
|
||||||
import Skat.Operations
|
import Skat.Operations
|
||||||
import qualified Skat.AI.Minmax as Minmax
|
import qualified Skat.AI.Minmax as Minmax
|
||||||
import qualified Skat.AI.Stupid as Stupid (Stupid(..))
|
import qualified Skat.AI.Stupid as Stupid (Stupid(..))
|
||||||
@@ -317,7 +317,7 @@ chooseSimulating = do
|
|||||||
(PL $ Stupid.Stupid Single Hand3)
|
(PL $ Stupid.Stupid Single Hand3)
|
||||||
-- TODO: fix
|
-- TODO: fix
|
||||||
env = mkSkatEnv piles turnCol undefined ps myHand
|
env = mkSkatEnv piles turnCol undefined ps myHand
|
||||||
liftIO $ evalStateT (toCard <$> (Minmax.choose depth :: Skat (CardS Owner))) env
|
liftIO $ evalSkat (toCard <$> (Minmax.choose depth :: Skat (CardS Owner))) env
|
||||||
|
|
||||||
simulate :: (MonadState AIEnv m, MonadPlayerOpen m)
|
simulate :: (MonadState AIEnv m, MonadPlayerOpen m)
|
||||||
=> Card -> m Int
|
=> Card -> m Int
|
||||||
@@ -339,7 +339,7 @@ simulate card = do
|
|||||||
-- TODO: fix
|
-- TODO: fix
|
||||||
env = mkSkatEnv piles turnCol undefined ps (next myHand)
|
env = mkSkatEnv piles turnCol undefined ps (next myHand)
|
||||||
-- simulate the game after playing the given card
|
-- simulate the game after playing the given card
|
||||||
(sgl, tm) <- liftIO $ evalStateT (do
|
(sgl, tm) <- liftIO $ evalSkat (do
|
||||||
modifyp $ playCard myHand card
|
modifyp $ playCard myHand card
|
||||||
turnGeneric playOpen depth) env
|
turnGeneric playOpen depth) env
|
||||||
let v = if myTeam == Single then (sgl, tm) else (tm, sgl)
|
let v = if myTeam == Single then (sgl, tm) else (tm, sgl)
|
||||||
|
|||||||
+4
-1
@@ -140,7 +140,10 @@ getTrump (Colour col _) = TrumpColour col
|
|||||||
getTrump (Grand _) = Jacks
|
getTrump (Grand _) = Jacks
|
||||||
getTrump _ = None
|
getTrump _ = None
|
||||||
|
|
||||||
data Result = Result Game Int Int Int
|
data Result = Result { resultGame :: Game
|
||||||
|
, resultScore :: Int
|
||||||
|
, resultSinglePoints :: Int
|
||||||
|
, resultTeamPoints :: Int }
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
instance ToJSON Result where
|
instance ToJSON Result where
|
||||||
|
|||||||
+14
-7
@@ -1,5 +1,5 @@
|
|||||||
module Skat.Matches (
|
module Skat.Matches (
|
||||||
singleVsBots, pvp, singleWithBidding
|
singleVsBots, pvp, singleWithBidding, Match(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
@@ -18,19 +18,26 @@ import Skat.AI.Rulebased
|
|||||||
import Skat.AI.Online
|
import Skat.AI.Online
|
||||||
import Skat.AI.Stupid
|
import Skat.AI.Stupid
|
||||||
|
|
||||||
match :: PrepEnv -> IO ()
|
data Match = Match { matchPiles :: Piles
|
||||||
|
, matchResult :: Result
|
||||||
|
, matchTricks :: [Trick]
|
||||||
|
, matchSingle :: Hand }
|
||||||
|
deriving Show
|
||||||
|
|
||||||
|
match :: PrepEnv -> IO (Maybe Match)
|
||||||
match prepEnv = do
|
match prepEnv = do
|
||||||
maySkatEnv <- runReaderT runPreperation prepEnv
|
maySkatEnv <- runReaderT runPreperation prepEnv
|
||||||
case maySkatEnv of
|
case maySkatEnv of
|
||||||
Just (sglPlayer, skatEnv) -> do
|
Just (sglPlayer, skatEnv) -> do
|
||||||
finished <- execStateT turn skatEnv
|
(_, finished, tricks) <- runSkat turn skatEnv
|
||||||
let res = getResults
|
let res = getResults
|
||||||
(game skatEnv)
|
(game skatEnv)
|
||||||
sglPlayer
|
sglPlayer
|
||||||
(Skat.piles skatEnv)
|
(Skat.piles skatEnv)
|
||||||
(Skat.piles finished)
|
(Skat.piles finished)
|
||||||
publishGameResults res (bidders prepEnv)
|
publishGameResults res (bidders prepEnv)
|
||||||
Nothing -> putStrLn "no one wanted to play"
|
return $ Just $ Match (Skat.piles skatEnv) res tricks sglPlayer
|
||||||
|
Nothing -> putStrLn "no one wanted to play" >> return Nothing
|
||||||
|
|
||||||
-- | predefined card distribution for testing purposes
|
-- | predefined card distribution for testing purposes
|
||||||
cardDistr :: Piles
|
cardDistr :: Piles
|
||||||
@@ -54,7 +61,7 @@ singleVsBots comm = do
|
|||||||
(PL $ Stupid Team Hand2)
|
(PL $ Stupid Team Hand2)
|
||||||
(PL $ mkAIEnv Single Hand3 10)
|
(PL $ mkAIEnv Single Hand3 10)
|
||||||
env = SkatEnv (distribute cards) Nothing (Colour Spades Einfach) ps Hand1
|
env = SkatEnv (distribute cards) Nothing (Colour Spades Einfach) ps Hand1
|
||||||
void $ evalStateT turn env
|
void $ evalSkat turn env
|
||||||
|
|
||||||
singleWithBidding :: Communicator c => c -> IO ()
|
singleWithBidding :: Communicator c => c -> IO ()
|
||||||
singleWithBidding comm = do
|
singleWithBidding comm = do
|
||||||
@@ -66,9 +73,9 @@ singleWithBidding comm = do
|
|||||||
(BD $ NoBidder Hand2)
|
(BD $ NoBidder Hand2)
|
||||||
(BD $ NoBidder Hand3)
|
(BD $ NoBidder Hand3)
|
||||||
env = PrepEnv ps bs
|
env = PrepEnv ps bs
|
||||||
match env
|
void $ match env
|
||||||
|
|
||||||
pvp :: Communicator c => c -> c -> c -> IO ()
|
pvp :: Communicator c => c -> c -> c -> IO (Maybe Match)
|
||||||
pvp comm1 comm2 comm3 = do
|
pvp comm1 comm2 comm3 = do
|
||||||
cards <- shuffleCards
|
cards <- shuffleCards
|
||||||
let ps = distribute cards
|
let ps = distribute cards
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ module Skat.Operations (
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
|
import Control.Monad.Writer (tell)
|
||||||
import System.Random (newStdGen, randoms)
|
import System.Random (newStdGen, randoms)
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Ord
|
import Data.Ord
|
||||||
@@ -72,6 +73,7 @@ evaluateTable = do
|
|||||||
winner = player ps winnerHand
|
winner = player ps winnerHand
|
||||||
modifyp $ cleanTable (team winner)
|
modifyp $ cleanTable (team winner)
|
||||||
modify $ setTurnColour Nothing
|
modify $ setTurnColour Nothing
|
||||||
|
tell [(table !! 2, table !! 1, table !! 0)]
|
||||||
return $ hand winner
|
return $ hand winner
|
||||||
|
|
||||||
countGame :: Skat (Int, Int)
|
countGame :: Skat (Int, Int)
|
||||||
|
|||||||
Reference in New Issue
Block a user