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.

115 lines
3.6KB

  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. import Skat.AI.Minmax (playCLI)
  16. main :: IO ()
  17. main = testAI 10
  18. testAI :: Int -> IO ()
  19. testAI n = do
  20. let acs = repeat runAI
  21. vals <- sequence (take n acs)
  22. putStrLn $ "average won points " ++ show (fromIntegral (sum vals) / fromIntegral n)
  23. runAI :: IO Int
  24. runAI = do
  25. env <- shuffledEnv
  26. let ps = piles env
  27. cs = handCards Hand3 ps
  28. trs = filter (isTrump Spades) cs
  29. if length trs >= 5 && any ((==32) . getID) cs
  30. then do
  31. pts <- fst <$> evalStateT turn env
  32. -- if pts > 60 then return 1 else return 0
  33. return pts
  34. else runAI
  35. env :: SkatEnv
  36. env = SkatEnv piles Nothing Spades playersExamp Hand1
  37. where piles = distribute allCards
  38. envStupid :: SkatEnv
  39. envStupid = SkatEnv piles Nothing Spades pls2 Hand1
  40. where piles = distribute allCards
  41. playersExamp :: Players
  42. playersExamp = Players
  43. (PL $ Stupid Team Hand1)
  44. (PL $ Stupid Team Hand2)
  45. (PL $ mkAIEnv Single Hand3 10)
  46. pls2 :: Players
  47. pls2 = Players
  48. (PL $ Stupid Team Hand1)
  49. (PL $ Stupid Team Hand2)
  50. (PL $ Stupid Single Hand3)
  51. shuffledEnv :: IO SkatEnv
  52. shuffledEnv = do
  53. cards <- shuffleCards
  54. return $ SkatEnv (distribute cards) Nothing Spades playersExamp Hand1
  55. shuffledEnv2 :: IO SkatEnv
  56. shuffledEnv2 = do
  57. cards <- shuffleCards
  58. return $ SkatEnv (distribute cards) Nothing Spades pls2 Hand1
  59. env2 :: SkatEnv
  60. env2 = SkatEnv piles Nothing Spades playersExamp Hand1
  61. where hand1 = [Card Seven Clubs, Card King Clubs, Card Ace Clubs, Card Queen Diamonds]
  62. hand2 = [Card Seven Hearts, Card King Hearts, Card Ace Hearts, Card Queen Spades]
  63. hand3 = [Card Seven Spades, Card King Spades, Card Ace Spades, Card Queen Clubs]
  64. h1 = map (putAt Hand1) hand1
  65. h2 = map (putAt Hand2) hand2
  66. h3 = map (putAt Hand3) hand3
  67. piles = Piles (h1 ++ h2 ++ h3) [] []
  68. env3 :: SkatEnv
  69. env3 = SkatEnv piles Nothing Diamonds pls2 Hand3
  70. where hand1 = [ Card Jack Diamonds, Card Jack Clubs, Card Nine Spades, Card King Spades
  71. , Card Seven Diamonds, Card Nine Diamonds, Card Seven Clubs, Card Eight Clubs
  72. , Card Ten Clubs, Card Eight Hearts ]
  73. hand2 = [ Card Seven Spades, Card Eight Spades, Card Seven Hearts, Card Nine Hearts
  74. , Card Ace Hearts, Card King Diamonds, Card Ace Diamonds, Card Nine Clubs
  75. , Card King Clubs, Card Ace Clubs ]
  76. hand3 = [ Card Jack Hearts, Card Jack Spades, Card Ten Spades, Card Ace Spades, Card Eight Diamonds
  77. , Card Queen Diamonds, Card Ten Diamonds, Card Ten Hearts, Card Queen Hearts, Card King Hearts ]
  78. skat = [ Card Queen Clubs, Card Queen Spades]
  79. h1 = map (putAt Hand1) hand1
  80. h2 = map (putAt Hand2) hand2
  81. h3 = map (putAt Hand3) hand3
  82. skt = map (putAt SkatP) skat
  83. piles = Piles (h1 ++ h2 ++ h3) [] skt
  84. runWebSocketServer :: IO ()
  85. runWebSocketServer = do
  86. WS.runServer "localhost" 4243 application
  87. application :: WS.PendingConnection -> IO ()
  88. application pending = do
  89. conn <- WS.acceptRequest pending
  90. putStrLn "someone connected"
  91. forever $ do
  92. msg <- WS.receiveData conn
  93. putStrLn $ BS.unpack msg
  94. playSkat :: IO ()
  95. playSkat = do
  96. void $ (flip runStateT) env3 playCLI