generalize skat online ai to use a general communicator type
This commit is contained in:
+18
-16
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user