Haskell Hangman (reddit updates)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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!"