Skat Engine und AI auf Haskell Basis
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

112 satır
3.4KB

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