Skat Engine und AI auf Haskell Basis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
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)