Skat Engine und AI auf Haskell Basis
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

81 wiersze
2.0KB

  1. module Operations where
  2. import Control.Monad.State
  3. import System.Random (newStdGen, randoms)
  4. import Data.List
  5. import Data.Ord
  6. import Card
  7. import Skat
  8. import Pile
  9. import Player
  10. import Utils (shuffle)
  11. compareRender :: Card -> Card -> Ordering
  12. compareRender (Card t1 c1) (Card t2 c2) = case compare c1 c2 of
  13. EQ -> compare t1 t2
  14. v -> v
  15. sortRender :: [Card] -> [Card]
  16. sortRender = sortBy compareRender
  17. turn :: Hand -> Skat (Int, Int)
  18. turn n = do
  19. table <- getp tableCards
  20. ps <- gets players
  21. let p = player ps n
  22. hand <- getp $ handCards n
  23. case length table of
  24. 0 -> play p >> turn (next n)
  25. 1 -> do
  26. modify $ setTurnColour (Just $ getColour $ head table)
  27. play p
  28. turn (next n)
  29. 2 -> play p >> turn (next n)
  30. 3 -> do
  31. w <- evaluateTable
  32. if length hand == 0 then countGame else turn w
  33. evaluateTable :: Skat Hand
  34. evaluateTable = do
  35. trumpCol <- gets trumpColour
  36. turnCol <- gets turnColour
  37. table <- getp tableCards
  38. ps <- gets players
  39. let winningCard = head $ sortCards trumpCol turnCol table
  40. Just winnerHand <- getp $ originOfCard winningCard
  41. let winner = player ps winnerHand
  42. modifyp $ cleanTable (team winner)
  43. modify $ setTurnColour Nothing
  44. return $ hand winner
  45. countGame :: Skat (Int, Int)
  46. countGame = getp count
  47. play :: Player p => p -> Skat Card
  48. play p = do
  49. table <- getp tableCards
  50. turnCol <- gets turnColour
  51. trump <- gets trumpColour
  52. hand <- getp $ handCards (hand p)
  53. let card = chooseCard p trump turnCol hand
  54. modifyp $ playCard card
  55. return card
  56. ---- TESTING VARS
  57. env :: SkatEnv
  58. env = SkatEnv piles Nothing Spades playersExamp
  59. where piles = distribute allCards
  60. playersExamp :: Players
  61. playersExamp = Players
  62. (PL $ Stupid Team Hand1)
  63. (PL $ Stupid Team Hand2)
  64. (PL $ Stupid Single Hand3)
  65. shuffledEnv :: IO SkatEnv
  66. shuffledEnv = do
  67. cards <- shuffleCards
  68. return $ SkatEnv (distribute cards) Nothing Spades playersExamp