Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main
- ( main
- ) where
- import Data.Char
- import Data.Set (Set)
- import qualified Data.Set as S
- import Control.Monad.Reader
- import Control.Monad.IO.Class
- getFilteredChar :: (Char -> Bool) -> IO Char
- getFilteredChar p = do
- c <- getChar
- if p c
- then return c
- else getFilteredChar p
- printSeparator :: IO ()
- printSeparator = putStrLn $ take 80 $ repeat '-'
- hangman :: Set Char -> ReaderT String IO ()
- hangman g | S.size g < 8 = guess g
- | otherwise = printGameOver
- guess :: Set Char -> ReaderT String IO ()
- guess g = do
- w <- ask
- c <- liftIO $ getFilteredChar isAlpha
- let g' = S.insert c g
- printState g' >> (liftIO printSeparator)
- if guessed w g'
- then printWonMessage
- else hangman g'
- guessed :: String -> Set Char -> Bool
- guessed w g = (S.fromList w) `S.isSubsetOf` g
- printGameOver :: ReaderT String IO ()
- printGameOver = do
- w <- ask
- liftIO $ putStrLn $ "You lost. The word was: " ++ w ++ "."
- printWonMessage :: ReaderT String IO ()
- printWonMessage = liftIO $ putStrLn "Congratulations, komrad."
- printState :: Set Char -> ReaderT String IO ()
- printState g = do
- w <- ask
- liftIO $ do
- putStrLn $ map (\c -> if c `S.member` g then c else '_') w
- putStrLn $ "Guessed: " ++ S.toList g
- main :: IO ()
- main = liftIO $ runReaderT (hangman S.empty) "hello"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement