/
GuessNumberCookie.hs
85 lines (73 loc) · 2.51 KB
/
GuessNumberCookie.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
-- © 2001, 2002 Peter Thiemann
module Main where
import System.Random
import Prelude hiding (head, span, map, div)
import Data.List hiding (head, span, map)
import WASH.CGI.CGI
import qualified WASH.CGI.Persistent2 as P
import qualified WASH.CGI.Cookie as C
type Score = (Int, String)
highScoreStore :: CGI (P.T [Score])
highScoreStore = P.init "GuessNumber" []
setNumber :: Int -> CGI (C.T (Int, Int))
setNumber aNumber = C.create "theNumber" (0, aNumber)
main :: IO ()
main =
run mainCGI
mainCGI = (once $
do aNumber <- io (randomRIO (1,100))
numHandle <- setNumber aNumber
standardQuery "Guess a number" $
do submit0 (play numHandle "I've thought of a number between 1 and 100.")
(fieldVALUE "Play the game")
submit0 admin (fieldVALUE "Check scores"))
>> mainCGI
play aHandle aMessage =
standardQuery "Guess a number" $
do text aMessage
text " Make a guess "
activeInputField (processGuess aHandle) empty
processGuess aHandle aGuess =
do mValue <- C.get aHandle
case mValue of
Just (nGuesses, aNumber) ->
let nGuesses' = nGuesses + 1 in
if aNumber == aGuess
then C.delete aHandle >> youGotIt nGuesses' aNumber
else do Just aHandle' <- C.set aHandle (nGuesses', aNumber)
play aHandle' ("Your guess " ++
show aGuess ++ " was too " ++
if aGuess < aNumber then "small."
else "large.")
Nothing ->
standardQuery "Don't do that!" $ do
text "You are trying to outwit me by playing with backbuttons and cloning windows!"
submit0 (return ()) (fieldVALUE "Restart")
youGotIt nGuesses aNumber =
standardQuery "You got it!" $
do text "CONGRATULATIONS!"
br empty
text "It took you "
text $ show nGuesses
text " tries to find out."
br empty
text "Enter your name for the hall of fame "
activeInputField (addToHighScore nGuesses) empty
addToHighScore nGuesses nameF =
let name = unText nameF in
if name == "" then return () else
do highScoreList <- highScoreStore
P.add highScoreList (nGuesses, name)
return ()
admin =
do highScoreList <- highScoreStore
highScores <- P.get highScoreList
standardQuery "GuessNumber - High Scores" $ do
table $ do
attr "border" "border"
tr (th (text "Name") ## th (text "# Guesses"))
mapM_ g (sort highScores)
submit0 (return ()) (fieldVALUE "Continue")
where
g (guesses, name) =
tr (td (text name) ## td (text (show guesses)))