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.0KB

  1. {-# LANGUAGE ExistentialQuantification #-}
  2. module Player where
  3. import Control.Monad.IO.Class
  4. import Card
  5. import Pile
  6. class (Monad m, MonadIO m) => MonadPlayer m where
  7. trumpColour :: m Colour
  8. turnColour :: m (Maybe Colour)
  9. showSkat :: Player p => p -> m (Maybe [Card])
  10. class (Monad m, MonadIO m, MonadPlayer m) => MonadPlayerOpen m where
  11. showPiles :: m (Piles)
  12. class Player p where
  13. team :: p -> Team
  14. hand :: p -> Hand
  15. chooseCard :: MonadPlayer m
  16. => p
  17. -> [CardS Played]
  18. -> [CardS Played]
  19. -> [Card]
  20. -> m (Card, p)
  21. onCardPlayed :: MonadPlayer m
  22. => p
  23. -> CardS Played
  24. -> m p
  25. onCardPlayed p _ = return p
  26. chooseCardOpen :: MonadPlayerOpen m
  27. => p
  28. -> m Card
  29. chooseCardOpen p = do
  30. piles <- showPiles
  31. let table = tableCardsS piles
  32. fallen = played piles
  33. myCards = handCards (hand p) piles
  34. fmap fst $ chooseCard p table fallen myCards
  35. data PL = forall p. (Show p, Player p) => PL p
  36. instance Show PL where
  37. show (PL p) = show p
  38. instance Player PL where
  39. team (PL p) = team p
  40. hand (PL p) = hand p
  41. chooseCard (PL p) table fallen hand = do
  42. (v, a) <- chooseCard p table fallen hand
  43. return $ (v, PL a)
  44. onCardPlayed (PL p) card = do
  45. v <- onCardPlayed p card
  46. return $ PL v
  47. chooseCardOpen (PL p) = chooseCardOpen p
  48. data Players = Players PL PL PL
  49. deriving Show
  50. player :: Players -> Hand -> PL
  51. player (Players p _ _) Hand1 = p
  52. player (Players _ p _) Hand2 = p
  53. player (Players _ _ p) Hand3 = p
  54. updatePlayer :: (Show p, Player p) => p -> Players -> Players
  55. updatePlayer p (Players p1 p2 p3) = case hand p of
  56. Hand1 -> Players (PL p) p2 p3
  57. Hand2 -> Players p1 (PL p) p3
  58. Hand3 -> Players p1 p2 (PL p)
  59. playersToList :: Players -> [PL]
  60. playersToList (Players p1 p2 p3) = [p1, p2, p3]