Skat Engine und AI auf Haskell Basis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

119 řádky
3.7KB

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