Skat Engine und AI auf Haskell Basis
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

74 lignes
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]