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ů.

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