Parcourir la source

track every trick, return detailed match information

master
flavis il y a 6 ans
Parent
révision
a7824bebea
6 fichiers modifiés avec 39 ajouts et 14 suppressions
  1. +2
    -2
      app/Main.hs
  2. +14
    -1
      src/Skat.hs
  3. +3
    -3
      src/Skat/AI/Rulebased.hs
  4. +4
    -1
      src/Skat/Bidding.hs
  5. +14
    -7
      src/Skat/Matches.hs
  6. +2
    -0
      src/Skat/Operations.hs

+ 2
- 2
app/Main.hs Voir le fichier

@@ -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
src/Skat.hs Voir le fichier

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


+ 3
- 3
src/Skat/AI/Rulebased.hs Voir le fichier

@@ -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
src/Skat/Bidding.hs Voir le fichier

@@ -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
src/Skat/Matches.hs Voir le fichier

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


+ 2
- 0
src/Skat/Operations.hs Voir le fichier

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


Chargement…
Annuler
Enregistrer