Advertisement
Guest User

Untitled

a guest
Dec 9th, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. module Main
  3. ( main
  4. ) where
  5.  
  6. import           Data.Char
  7. import           Data.Set (Set)
  8. import qualified Data.Set as S
  9. import           Control.Monad.Reader
  10. import           Control.Monad.IO.Class
  11.  
  12. getFilteredChar :: (Char -> Bool) -> IO Char
  13. getFilteredChar p = do
  14.     c <- getChar
  15.     if p c
  16.         then return c
  17.         else getFilteredChar p
  18.  
  19. printSeparator :: IO ()
  20. printSeparator = putStrLn $ take 80 $ repeat '-'
  21.  
  22. hangman :: Set Char -> ReaderT String IO ()
  23. hangman g | S.size g < 8 = guess g
  24.           | otherwise    = printGameOver
  25.  
  26. guess :: Set Char -> ReaderT String IO ()
  27. guess g = do
  28.     w <- ask
  29.     c <- liftIO $ getFilteredChar isAlpha
  30.     let g' = S.insert c g
  31.    printState g' >> (liftIO printSeparator)
  32.     if guessed w g'
  33.        then printWonMessage
  34.        else hangman g'
  35.  
  36. guessed :: String -> Set Char -> Bool
  37. guessed w g = (S.fromList w) `S.isSubsetOf` g
  38.  
  39. printGameOver :: ReaderT String IO ()
  40. printGameOver = do
  41.     w <- ask
  42.     liftIO $ putStrLn $ "You lost. The word was: " ++ w ++ "."
  43.  
  44. printWonMessage :: ReaderT String IO ()
  45. printWonMessage = liftIO $ putStrLn "Congratulations, komrad."
  46.  
  47. printState :: Set Char -> ReaderT String IO ()
  48. printState g = do
  49.     w <- ask
  50.     liftIO $ do
  51.         putStrLn $ map (\c -> if c `S.member` g then c else '_') w
  52.         putStrLn $ "Guessed: " ++ S.toList g
  53.  
  54. main :: IO ()
  55. main = liftIO $ runReaderT (hangman S.empty) "hello"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement