Skat Engine und AI auf Haskell Basis
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

101 Zeilen
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