hanabi-dealer-0.9.1.0: Game/Hanabi/Strategies/EndGameSearch.hs
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
module Game.Hanabi.Strategies.EndGameSearch where
import Game.Hanabi hiding (main)
import Game.Hanabi.Strategies.Stateless hiding (main)
import Game.Hanabi.Strategies.SimpleStrategy hiding (main)
import System.Random
-- A strategy with endgame search
data EndGameSearch = EG
instance (Monad m) => Strategy EndGameSearch m where
strategyName ms = return "EndGame"
move pvs@(pv:_) mvs EG = do (m, _) <- -- move (sontakuColorHint pvs mvs) mvs $ assumeOthersAreSLLite SL
-- move (sontakuColorHint pvs mvs) mvs $ searchExhaustivelyLite SL
move (sontakuColorHint pvs mvs) mvs $ searchExhaustivelyLite $ assumeOthersAreSLLite SL
-- move (sontakuColorHint pvs mvs) mvs $ searchExhaustively SL
-- move (sontakuColorHint pvs mvs) mvs $ assumeOthersAreSL SL
-- move (sontakuColorHint pvs mvs) mvs $ searchExhaustively $ assumeOthersAreSL SL
return (m, EG)
where searchExhaustivelyLite fallback = egml (\pub -> pileNum pub == 0) fallback (numPlayers $ gameSpec $ publicView pv)
assumeOthersAreSLLite fallback = egl (\pub -> pileNum pub <= 1) fallback $ replicate (pred $ numPlayers $ gameSpec $ publicView pv) SL
searchExhaustively fallback = egms (\pub -> pileNum pub == 0) fallback (numPlayers $ gameSpec $ publicView pv)
assumeOthersAreSL fallback = EGS (\pub -> pileNum pub <= 1 && hintTokens pub <= 2) fallback $ replicate (pred $ numPlayers $ gameSpec $ publicView pv) SL
-- assumeOthersAreSL fallback = EGS (\pub -> pileNum pub <=2 && hintTokens pub <= 4) fallback $ replicate (pred $ numPlayers $ gameSpec $ publicView pv) SL
-- assumeOthersAreSL fallback = EGS (\pub -> pileNum pub + hintTokens pub < 4) fallback $ replicate (pred $ numPlayers $ gameSpec $ publicView pv) SL
main = do g <- newStdGen
((eg,_),_) <- start defaultGS [] ([EG], [stdio]) g -- Play it with standard I/O (human player).
-- ((eg,_),_) <- start defaultGS [peek] [EG, EG] g -- Play it with itself.
putStrLn $ prettyEndGame eg