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.

50 lines
1.3KB

  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 Card
  9. import Pile
  10. import Player (Players)
  11. import qualified Player as P
  12. data SkatEnv = SkatEnv { piles :: Piles
  13. , turnColour :: Maybe Colour
  14. , trumpColour :: Colour
  15. , players :: Players }
  16. deriving Show
  17. type Skat = StateT SkatEnv IO
  18. instance P.MonadPlayer Skat where
  19. trumpColour = gets trumpColour
  20. turnColour = gets turnColour
  21. showSkat p = case P.team p of
  22. Single -> fmap (Just . skatCards) $ gets piles
  23. Team -> return Nothing
  24. instance P.MonadPlayerOpen Skat where
  25. showPiles = gets piles
  26. modifyp :: (Piles -> Piles) -> Skat ()
  27. modifyp f = modify g
  28. where g env@(SkatEnv {piles}) = env { piles = f piles}
  29. getp :: (Piles -> a) -> Skat a
  30. getp f = gets piles >>= return . f
  31. modifyPlayers :: (Players -> Players) -> Skat ()
  32. modifyPlayers f = modify g
  33. where g env@(SkatEnv {players}) = env { players = f players }
  34. setTurnColour :: Maybe Colour -> SkatEnv -> SkatEnv
  35. setTurnColour col sk = sk { turnColour = col }
  36. mkSkatEnv :: Piles -> Maybe Colour -> Colour -> Players -> SkatEnv
  37. mkSkatEnv = SkatEnv