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.

63 lines
1.7KB

  1. {-# LANGUAGE NamedFieldPuns #-}
  2. {-# LANGUAGE TypeSynonymInstances #-}
  3. {-# LANGUAGE FlexibleInstances #-}
  4. module Skat where
  5. import Control.Monad.State
  6. import Control.Monad.Reader
  7. import Data.List
  8. import Data.Vector (Vector)
  9. import Skat.Card
  10. import Skat.Pile
  11. import Skat.Player (Players)
  12. import qualified Skat.Player as P
  13. data SkatEnv = SkatEnv { piles :: Piles
  14. , turnColour :: Maybe Colour
  15. , trumpColour :: Colour
  16. , players :: Players
  17. , currentHand :: Hand }
  18. deriving Show
  19. type Skat = StateT SkatEnv IO
  20. instance P.MonadPlayer Skat where
  21. trumpColour = gets trumpColour
  22. turnColour = gets turnColour
  23. showSkat p = case P.team p of
  24. Single -> fmap (Just . skatCards) $ gets piles
  25. Team -> return Nothing
  26. instance P.MonadPlayerOpen Skat where
  27. showPiles = gets piles
  28. modifyp :: (Piles -> Piles) -> Skat ()
  29. modifyp f = modify g
  30. where g env@(SkatEnv {piles}) = env { piles = f piles}
  31. getp :: (Piles -> a) -> Skat a
  32. getp f = gets piles >>= return . f
  33. modifyPlayers :: (Players -> Players) -> Skat ()
  34. modifyPlayers f = modify g
  35. where g env@(SkatEnv {players}) = env { players = f players }
  36. setTurnColour :: Maybe Colour -> SkatEnv -> SkatEnv
  37. setTurnColour col sk = sk { turnColour = col }
  38. setCurrentHand :: Hand -> SkatEnv -> SkatEnv
  39. setCurrentHand hand sk = sk { currentHand = hand }
  40. mkSkatEnv :: Piles -> Maybe Colour -> Colour -> Players -> Hand -> SkatEnv
  41. mkSkatEnv = SkatEnv
  42. allowedCards :: Skat [CardS Owner]
  43. allowedCards = do
  44. curHand <- gets currentHand
  45. pls <- gets players
  46. turnCol <- gets turnColour
  47. trumpCol <- gets trumpColour
  48. getp $ allowed curHand trumpCol turnCol