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.

50 lignes
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