Skip to content

Instantly share code, notes, and snippets.

@Epitaph64 Epitaph64/hangman.hs
Created Nov 15, 2013

Embed
What would you like to do?
Haskell Hangman
import System.IO
import Data.List
import Data.Char
display :: String -> String
display word = intersperse ' ' [if c `elem` ['a'..'z'] then '_' else c | c <- word]
makeGuess :: String -> Char -> Int -> IO ()
makeGuess word letter guesses
| letter `elem` word = play [if letter == c then toUpper letter else c | c <- word] guesses
| otherwise = play word (guesses - 1)
play :: String -> Int -> IO ()
play word guesses
| word == map toUpper word = do
putStrLn $ display word
putStrLn "You Win!"
| guesses == 0 = do
putStrLn $ display word
putStrLn "You Lose..."
| otherwise = do
putStrLn $ "You have " ++ show guesses ++ " guesses left."
putStrLn $ display word
putStr "Guess a letter: "
hFlush stdout
userGuess <- getLine
case userGuess of
c:_ -> makeGuess word (toLower $ head userGuess) guesses
_ -> putStrLn "Please enter a letter a-z" >> play word guesses
main :: IO ()
main = do
putStrLn "Welcome to Haskell Hangman!"
putStr "Enter a word (or sentence) to guess: "
hFlush stdout
userInput <- getLine -- Get a string from user and store it in userInput
case userInput of
c:_ -> play (map toLower userInput) 6 -- This last int is the amount of wrong guesses the player will have
_ -> putStrLn "Please input at least one character!" >> main
putStrLn "Thanks for playing!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.