Skat Engine und AI auf Haskell Basis
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

73 linhas
1.9KB

  1. {-# LANGUAGE MultiParamTypeClasses #-}
  2. {-# LANGUAGE TypeSynonymInstances #-}
  3. {-# LANGUAGE FlexibleInstances #-}
  4. {-# LANGUAGE FlexibleContexts #-}
  5. {-# LANGUAGE FunctionalDependencies #-}
  6. {-# LANGUAGE TupleSections #-}
  7. module Skat.AI.Base where
  8. import System.Random (Random)
  9. import qualified System.Random as Rand
  10. import Control.Monad.State
  11. import Control.Exception (assert)
  12. import Control.Monad.Fail
  13. import Data.Ord
  14. import Text.Read (readMaybe)
  15. import Data.List (maximumBy, sortBy)
  16. import Debug.Trace
  17. class (Ord v, Eq v) => Value v where
  18. invert :: v -> v
  19. win :: v
  20. loss :: v
  21. tie :: v
  22. tonum :: v -> Float
  23. tonum v
  24. | v == win = 1.0
  25. | v == loss = 0.0
  26. | v == tie = 0.5
  27. class Player p where
  28. maxing :: p -> Bool
  29. class (Traversable l, Monad m, Value v, Player p, Eq t) => MonadGame t l v p m | m -> t, m -> p, m -> v, m -> l where
  30. currentPlayer :: m p
  31. turns :: m (l t)
  32. play :: t -> m ()
  33. simulate :: t -> m a -> m a
  34. evaluate :: m v
  35. over :: m Bool
  36. class (MonadIO m, Show t, Show v, Show p, MonadGame t l v p m) => PlayableGame t l v p m | m -> t, m -> p, m -> v where
  37. showTurns :: m ()
  38. showBoard :: m ()
  39. askTurn :: m (Maybe t)
  40. showTurn :: t -> m ()
  41. winner :: m (Maybe p)
  42. class Choose t m | m -> t where
  43. choose :: m t
  44. class MonadRandom m where
  45. random :: Random a => m a
  46. chooser :: [a] -> m a
  47. instance MonadRandom IO where
  48. random = Rand.randomIO
  49. chooser [] = error "chooser: empty list"
  50. chooser os = (os!!) <$> Rand.randomRIO (0, length os -1)
  51. instance MonadRandom (State Rand.StdGen) where
  52. random = do
  53. gen <- get
  54. let (a, gen') = Rand.random gen
  55. put gen'
  56. return a
  57. chooser [] = error "chooser: empty list"
  58. chooser os = do
  59. gen <- get
  60. let (a, gen') = Rand.randomR (0, length os -1) gen
  61. put gen'
  62. return (os !! a)