| @@ -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 | |||||
| @@ -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) | ||||
| @@ -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 | ||||
| @@ -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) | ||||