generalize skat online ai to use a general communicator type

This commit is contained in:
2019-10-06 14:45:23 +02:00
parent c9eb1b5bc9
commit cbdf357121
2 changed files with 22 additions and 20 deletions
+18 -16
View File
@@ -5,7 +5,6 @@
module Skat.AI.Online where module Skat.AI.Online where
import Control.Monad.Reader import Control.Monad.Reader
import Network.WebSockets (Connection, sendTextData, receiveData)
import Data.Aeson import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as BS
@@ -15,19 +14,22 @@ import Skat.Pile
import Skat.Card import Skat.Card
import Skat.Render import Skat.Render
class Communicator a where
send :: a -> String -> IO ()
receive :: a -> IO String
class Monad m => MonadClient m where class Monad m => MonadClient m where
query :: String -> m () query :: String -> m ()
response :: m String response :: m String
data OnlineEnv = OnlineEnv { getTeam :: Team data OnlineEnv c = OnlineEnv { getTeam :: Team
, getHand :: Hand , getHand :: Hand
, connection :: Connection } , connection :: c }
deriving Show
instance Show Connection where instance Show (OnlineEnv c) where
show _ = "A connection" show _ = "An online env"
instance Player OnlineEnv where instance Communicator c => Player (OnlineEnv c) where
team = getTeam team = getTeam
hand = getHand hand = getHand
chooseCard p table _ hand = runReaderT (choose table hand) p >>= \c -> return (c, p) chooseCard p table _ hand = runReaderT (choose table hand) p >>= \c -> return (c, p)
@@ -35,22 +37,22 @@ instance Player OnlineEnv where
onGameResults p res = runReaderT (onResults res) p onGameResults p res = runReaderT (onResults res) p
onGameStart p singlePlayer = runReaderT (onStart singlePlayer) p onGameStart p singlePlayer = runReaderT (onStart singlePlayer) p
type Online m = ReaderT OnlineEnv m type Online a m = ReaderT (OnlineEnv a) m
instance MonadIO m => MonadClient (Online m) where instance (Communicator c, MonadIO m) => MonadClient (Online c m) where
query s = do query s = do
conn <- asks connection conn <- asks connection
liftIO $ sendTextData conn (BS.pack s) liftIO $ send conn s
response = do response = do
conn <- asks connection conn <- asks connection
liftIO $ BS.unpack <$> receiveData conn liftIO $ receive conn
instance MonadPlayer m => MonadPlayer (Online m) where instance MonadPlayer m => MonadPlayer (Online a m) where
trumpColour = lift $ trumpColour trumpColour = lift $ trumpColour
turnColour = lift $ turnColour turnColour = lift $ turnColour
showSkat = lift . showSkat showSkat = lift . showSkat
choose :: MonadPlayer m => [CardS Played] -> [Card] -> Online m Card choose :: (Communicator c, MonadPlayer m) => [CardS Played] -> [Card] -> Online c m Card
choose table hand = do choose table hand = do
query (BS.unpack $ encode $ ChooseQuery hand table) query (BS.unpack $ encode $ ChooseQuery hand table)
r <- response r <- response
@@ -60,13 +62,13 @@ choose table hand = do
if card `elem` hand && allowed then return card else choose table hand if card `elem` hand && allowed then return card else choose table hand
Nothing -> choose table hand Nothing -> choose table hand
cardPlayed :: MonadPlayer m => CardS Played -> Online m () cardPlayed :: (Communicator c, MonadPlayer m) => CardS Played -> Online c m ()
cardPlayed card = query (BS.unpack $ encode $ CardPlayedQuery card) cardPlayed card = query (BS.unpack $ encode $ CardPlayedQuery card)
onResults :: MonadIO m => (Int, Int) -> Online m () onResults :: (Communicator c, MonadIO m) => (Int, Int) -> Online c m ()
onResults (sgl, tm) = query (BS.unpack $ encode $ GameResultsQuery sgl tm) onResults (sgl, tm) = query (BS.unpack $ encode $ GameResultsQuery sgl tm)
onStart :: MonadPlayer m => Hand -> Online m () onStart :: (Communicator c, MonadPlayer m) => Hand -> Online c m ()
onStart singlePlayer = do onStart singlePlayer = do
trCol <- trumpColour trCol <- trumpColour
ownHand <- asks getHand ownHand <- asks getHand
+3 -3
View File
@@ -32,12 +32,12 @@ cardDistr = Piles hands [] (map (putAt SkatP) skt)
++ map (putAt Hand3) hand3 ++ map (putAt Hand3) hand3
skt = [Card Nine Clubs, Card Queen Clubs] skt = [Card Nine Clubs, Card Queen Clubs]
singleVsBots :: (Team -> Hand -> OnlineEnv) -> IO () singleVsBots :: Communicator c => c -> IO ()
singleVsBots mkPlayer = do singleVsBots comm = do
--let gen = mkStdGen 123 --let gen = mkStdGen 123
-- cards = shuffleCardsWithGen gen -- cards = shuffleCardsWithGen gen
let ps = Players let ps = Players
(PL $ mkPlayer Team Hand1) (PL $ OnlineEnv Team Hand1 comm)
(PL $ Stupid Team Hand2) (PL $ Stupid Team Hand2)
(PL $ mkAIEnv Single Hand3 10) (PL $ mkAIEnv Single Hand3 10)
env = SkatEnv cardDistr Nothing Spades ps env = SkatEnv cardDistr Nothing Spades ps