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.

101 lignes
3.2KB

  1. {-# LANGUAGE ExistentialQuantification #-}
  2. module Skat.Preperation (
  3. ) where
  4. import Control.Monad.IO.Class
  5. import Control.Monad.State
  6. import Skat.Pile
  7. import Skat.Card
  8. import Skat.Player (PL, Players(..))
  9. import Skat.Bidding
  10. import Skat (SkatEnv, mkSkatEnv)
  11. type Bid = Int
  12. data PrepEnv = PrepEnv { piles :: Piles
  13. , currentBid :: Bid
  14. , currentHand :: Hand
  15. , bidders :: Bidders }
  16. deriving Show
  17. type Preperation = StateT PrepEnv IO
  18. class Bidder a where
  19. hand :: a -> Hand
  20. askBid :: MonadIO m => a -> Hand -> Bid -> m (Maybe Bid)
  21. askResponse :: MonadIO m => a -> Hand -> m Bool
  22. askGame :: MonadIO m => a -> Bid -> m Game
  23. askHand :: MonadIO m => a -> Bid -> m Bool
  24. askSkat :: MonadIO m => a -> Bid -> [Card] -> m [Card]
  25. toPlayer :: a -> Team -> PL
  26. -- | trick to allow heterogenous bidder list
  27. data BD = forall b. (Show b, Bidder b) => BD b
  28. instance Show BD where
  29. show (BD b) = show b
  30. instance Bidder BD where
  31. hand (BD b) = hand b
  32. askBid (BD b) = askBid b
  33. askGame (BD b) = askGame b
  34. askHand (BD b) = askHand b
  35. askSkat (BD b) = askSkat b
  36. askResponse (BD b) = askResponse b
  37. toPlayer (BD b) = toPlayer b
  38. data Bidders = Bidders BD BD BD
  39. deriving Show
  40. bidder :: Bidders -> Hand -> BD
  41. bidder (Bidders b _ _) Hand1 = b
  42. bidder (Bidders _ b _) Hand2 = b
  43. bidder (Bidders _ _ b) Hand3 = b
  44. toPlayers :: Hand -> Bidders -> Players
  45. toPlayers single (Bidders b1 b2 b3) =
  46. Players (toPlayer b1 $ if single == Hand1 then Single else Team)
  47. (toPlayer b2 $ if single == Hand2 then Single else Team)
  48. (toPlayer b3 $ if single == Hand3 then Single else Team)
  49. runPreperation :: Preperation (Maybe SkatEnv)
  50. runPreperation = do
  51. bds <- gets bidders
  52. (winner, bid) <- runBidding 0 (bidder bds Hand2) (bidder bds Hand1)
  53. (finalWinner, finalBid) <- runBidding 0 (bidder bds Hand3) (bidder bds winner)
  54. if finalBid == 0 then do
  55. bid <- askBid (bidder bds finalWinner) finalWinner 0
  56. case bid of
  57. Just val -> Just <$> initGame finalWinner val
  58. Nothing -> return Nothing
  59. else Just <$> initGame finalWinner finalBid
  60. runBidding :: Bid -> BD -> BD -> Preperation (Hand, Bid)
  61. runBidding startingBid reizer gereizter = do
  62. first <- askBid reizer (hand gereizter) startingBid
  63. case first of
  64. Just val -> do
  65. response <- askResponse gereizter (hand reizer)
  66. if response then runBidding val reizer gereizter
  67. else return (hand reizer, val)
  68. Nothing -> return (hand gereizter, startingBid)
  69. initGame :: Hand -> Bid -> Preperation SkatEnv
  70. initGame single bid = do
  71. ps <- gets piles
  72. bds <- gets bidders
  73. -- ask if player wants to play hand
  74. noSkat <- askHand (bidder bds single) bid
  75. -- either return piles or ask for skat cards and modify piles
  76. ps' <- if noSkat then return ps else do
  77. let skat = skatCards ps
  78. skat' <- askSkat (bidder bds single) bid skat
  79. return $ moveToSkat single skat' ps
  80. -- ask for game kind
  81. (Colour col _) <- askGame (bidder bds single) bid
  82. -- construct skat env
  83. return $ mkSkatEnv ps Nothing col (toPlayers single bds) Hand1