Skat Engine und AI auf Haskell Basis
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

87 строки
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. else runAI
  33. env :: SkatEnv
  34. env = SkatEnv piles Nothing Spades playersExamp
  35. where piles = distribute allCards
  36. envStupid :: SkatEnv
  37. envStupid = SkatEnv piles Nothing Spades pls2
  38. where piles = distribute allCards
  39. playersExamp :: Players
  40. playersExamp = Players
  41. (PL $ Stupid Team Hand1)
  42. (PL $ Stupid Team Hand2)
  43. (PL $ mkAIEnv Single Hand3 10)
  44. pls2 :: Players
  45. pls2 = Players
  46. (PL $ Stupid Team Hand1)
  47. (PL $ Stupid Team Hand2)
  48. (PL $ Stupid Team Hand3)
  49. shuffledEnv :: IO SkatEnv
  50. shuffledEnv = do
  51. cards <- shuffleCards
  52. return $ SkatEnv (distribute cards) Nothing Spades playersExamp
  53. env2 :: SkatEnv
  54. env2 = SkatEnv piles Nothing Spades playersExamp
  55. where hand1 = [Card Seven Clubs, Card King Clubs, Card Ace Clubs, Card Queen Diamonds]
  56. hand2 = [Card Seven Hearts, Card King Hearts, Card Ace Hearts, Card Queen Spades]
  57. hand3 = [Card Seven Spades, Card King Spades, Card Ace Spades, Card Queen Clubs]
  58. h1 = map (putAt Hand1) hand1
  59. h2 = map (putAt Hand2) hand2
  60. h3 = map (putAt Hand3) hand3
  61. piles = Piles (h1 ++ h2 ++ h3) [] []
  62. runWebSocketServer :: IO ()
  63. runWebSocketServer = do
  64. WS.runServer "localhost" 4243 application
  65. application :: WS.PendingConnection -> IO ()
  66. application pending = do
  67. conn <- WS.acceptRequest pending
  68. putStrLn "someone connected"
  69. forever $ do
  70. msg <- WS.receiveData conn
  71. putStrLn $ BS.unpack msg