Skat Engine und AI auf Haskell Basis
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

74 linhas
2.5KB

  1. module Reizen where
  2. import Skat
  3. import Card
  4. import Utils
  5. import Operations
  6. import Render
  7. data Reizer = Reizer Index [Card]
  8. deriving Show
  9. getHand :: Index -> [Reizer] -> [Card]
  10. getHand n rs = let (Reizer _ h) = head $ filter (\(Reizer i cs) -> i == n) rs
  11. in h
  12. goWith :: [Card] -> Int -> IO Bool
  13. goWith cs n = query $ "Go with " ++ show n
  14. goUp :: [Card] -> Int -> IO Int
  15. goUp cs n = query $ "Go up " ++ show n
  16. askColour :: [Card] -> IO Colour
  17. askColour cs = render (sortRender cs) >> query "Trump should be:"
  18. askSkat :: [Card] -> IO (Card, Card)
  19. askSkat cs_ = do
  20. let cs = sortRender cs_
  21. render cs
  22. (n1, n2) <- query "Drop two cards:"
  23. if n1 < length cs && n2 < length cs && n1 >= 0 && n2 >= 0 && n1 /= n2
  24. then return (cs !! n1, cs !! n2)
  25. else askSkat cs
  26. reizen :: IO SkatEnv
  27. reizen = do
  28. cs <- shuffleCards
  29. let cards = distribute cs
  30. p1 = Reizer One $ findCards Hand1 cards
  31. p2 = Reizer Two $ findCards Hand2 cards
  32. p3 = Reizer Three $ findCards Hand3 cards
  33. skt = findCards SkatP cards
  34. (winner1, new) <- combat p2 p1 0
  35. (Reizer idx _, _) <- combat p3 winner1 new
  36. let ps = Players (Player (if idx == One then Single else Team) One)
  37. (Player (if idx == Two then Single else Team) Two)
  38. (Player (if idx == Three then Single else Team) Three)
  39. sglHand = playerHand idx
  40. cards' = foldr (\c css -> moveCard c sglHand css) cards skt
  41. trumpCol <- askColour (findCards sglHand cards')
  42. (s1, s2) <- askSkat (findCards sglHand cards')
  43. let cards'' = moveCard s2 WonSingle (moveCard s1 WonSingle cards')
  44. return $ SkatEnv cards'' Nothing trumpCol ps
  45. combat :: Reizer -> Reizer -> Int -> IO (Reizer, Int)
  46. combat r2@(Reizer p2 h2) r1@(Reizer p1 h1) start = do
  47. -- advantage for h1 (being challenged)
  48. putStrLn $ "Player " ++ show p2 ++ " challenging " ++ show p1
  49. putStrLn $ "Player " ++ show p2 ++ "'s turn"
  50. new <- goUp h2 start
  51. if new > start
  52. then do
  53. putStrLn $ "Player " ++ show p2 ++ " goes up to " ++ show new
  54. putStrLn $ "Player " ++ show p1 ++ "'s turn"
  55. yes <- goWith h1 new
  56. if yes then combat r2 r1 new
  57. else do
  58. putStrLn $ "Player " ++ show p1 ++ " gives up"
  59. putStrLn $ "Player " ++ show p2 ++ " wins"
  60. return (r2, new)
  61. else do
  62. putStrLn $ "Player " ++ show p2 ++ " gives up"
  63. putStrLn $ "Player " ++ show p1 ++ " wins"
  64. return (r1, start)