-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhangman.hs
124 lines (118 loc) · 4.36 KB
/
hangman.hs
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import System.IO
import System.Random
import System.Exit
main = do
handle <- openFile "enable1.txt" ReadMode
contents <- hGetContents handle
gen <- newStdGen
let words = map init (lines contents)
(n,_) = randomR (0, (length words) - 1) gen :: (Int, StdGen)
word = words !! n
play word (map (\x -> '_') word) 6
hClose handle
play word known guesses
| word == known = do
putStrLn known
putStrLn "You win!"
putStrLn ("Would you like to play again? Enter \"yes\" or \"no\"")
line1 <- getLine
if line1 == "yes"
then do
putStrLn ("Let's do it!")
main
else do
exitSuccess
main
| guesses == 0 = do
putStrLn known
putStrLn "HANGMAN YOU HUNG YOURSELF"
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " /|\\ |";
putStrLn " / \\ |"
putStrLn " |";
putStrLn "=========";
putStrLn ("You lose. The word was " ++ word ++ ".")
putStrLn ("Would you like to play again? Enter \"yes\" or \"no\"")
line1 <- getLine
if line1 == "yes"
then do
putStrLn ("Let's do it!")
main
else do
exitSuccess
main
| otherwise = do
case guesses of
1 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " /|\\ |";
putStrLn " / |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
2 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " /|\\ |";
putStrLn " |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
3 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " /| |";
putStrLn " |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
4 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " | |";
putStrLn " |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
5 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " 0 |";
putStrLn " |";
putStrLn " |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
6 -> do { putStrLn "HANGMAN DON'T HANG YOURSELF";
putStrLn " +---+";
putStrLn " | |";
putStrLn " |";
putStrLn " |";
putStrLn " |";
putStrLn " |";
putStrLn "=========";
putStrLn known;
putStrLn ("You have " ++ (show guesses) ++ " guesses left.") }
line <- getLine
if null line
then do
putStrLn ("You forgot to put in a letter.")
play word known guesses
else do
let (newKnown, newGuesses) = handle (head line) word known guesses
play word newKnown newGuesses
handle letter word known guesses
| letter `elem` word = (zipWith (\w k -> if w == letter then w else k) word known, guesses)
| otherwise = (known, guesses - 1)