Skip to content

Instantly share code, notes, and snippets.

@Epitaph64
Created November 15, 2013 17:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Epitaph64/0cb73c025e5db56da969 to your computer and use it in GitHub Desktop.
Save Epitaph64/0cb73c025e5db56da969 to your computer and use it in GitHub Desktop.
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