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.

74 lines
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)