Skat Engine und AI auf Haskell Basis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.3KB

  1. module Main where
  2. import Control.Monad.State
  3. import Control.Monad.Reader
  4. import Control.Concurrent
  5. import qualified Network.WebSockets as WS
  6. import qualified Data.ByteString.Lazy.Char8 as BS
  7. import Skat
  8. import Skat.Card
  9. import Skat.Operations
  10. import Skat.Player
  11. import Skat.Pile
  12. import Skat.AI.Stupid
  13. import Skat.AI.Online
  14. import Skat.AI.Rulebased
  15. main :: IO ()
  16. main = testAI 10
  17. testAI :: Int -> IO ()
  18. testAI n = do
  19. let acs = repeat runAI
  20. vals <- sequence (take n acs)
  21. putStrLn $ "average won points " ++ show (fromIntegral (sum vals) / fromIntegral n)
  22. runAI :: IO Int
  23. runAI = do
  24. env <- shuffledEnv
  25. let ps = piles env
  26. cs = handCards Hand3 ps
  27. trs = filter (isTrump Spades) cs
  28. if length trs >= 5 && any ((==32) . getID) cs
  29. then do
  30. pts <- fst <$> evalStateT (turn Hand1) env
  31. -- if pts > 60 then return 1 else return 0
  32. return pts
  33. else runAI
  34. env :: SkatEnv
  35. env = SkatEnv piles Nothing Spades playersExamp
  36. where piles = distribute allCards
  37. envStupid :: SkatEnv
  38. envStupid = SkatEnv piles Nothing Spades pls2
  39. where piles = distribute allCards
  40. playersExamp :: Players
  41. playersExamp = Players
  42. (PL $ Stupid Team Hand1)
  43. (PL $ Stupid Team Hand2)
  44. (PL $ mkAIEnv Single Hand3 10)
  45. pls2 :: Players
  46. pls2 = Players
  47. (PL $ Stupid Team Hand1)
  48. (PL $ Stupid Team Hand2)
  49. (PL $ Stupid Team Hand3)
  50. shuffledEnv :: IO SkatEnv
  51. shuffledEnv = do
  52. cards <- shuffleCards
  53. return $ SkatEnv (distribute cards) Nothing Spades playersExamp
  54. env2 :: SkatEnv
  55. env2 = SkatEnv piles Nothing Spades playersExamp
  56. where hand1 = [Card Seven Clubs, Card King Clubs, Card Ace Clubs, Card Queen Diamonds]
  57. hand2 = [Card Seven Hearts, Card King Hearts, Card Ace Hearts, Card Queen Spades]
  58. hand3 = [Card Seven Spades, Card King Spades, Card Ace Spades, Card Queen Clubs]
  59. h1 = map (putAt Hand1) hand1
  60. h2 = map (putAt Hand2) hand2
  61. h3 = map (putAt Hand3) hand3
  62. piles = Piles (h1 ++ h2 ++ h3) [] []
  63. runWebSocketServer :: IO ()
  64. runWebSocketServer = do
  65. WS.runServer "localhost" 4243 application
  66. application :: WS.PendingConnection -> IO ()
  67. application pending = do
  68. conn <- WS.acceptRequest pending
  69. putStrLn "someone connected"
  70. forever $ do
  71. msg <- WS.receiveData conn
  72. putStrLn $ BS.unpack msg