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
|
module Main where
import Control.Monad
import Control.Monad.Trans.State
import System.Random
import System.Console.ANSI (clearScreen)
type Score = StateT (Integer, Integer) IO (Integer, Integer)
yourTurn :: IO (Integer, Integer)
yourTurn = do
putStrLn "Wie viele Finger zeigen Sie?"
shown <- liftM read getLine
putStrLn "Wie viele Finger wird der Gegner zeigen?"
guessed <- liftM read getLine
clearScreen
return (shown, guessed)
aiTurn :: IO (Integer, Integer)
aiTurn = do
gen1 <- getStdGen
let (shown, gen2) = randomR (1, 5) gen1
putStrLn $ "Der Gegner zeigt: " ++ (show shown)
let (guessed, gen3) = randomR (1, 5) gen2
putStrLn $ "Der Gegner hat " ++ (show guessed) ++ " geraten."
setStdGen gen3
return (shown, guessed)
score :: IO (Integer, Integer) -> Score
score partnerTurn = StateT $ \(s1, s2) -> do
you <- yourTurn
partner <- partnerTurn
let sum = (fst you) + (snd partner)
let yourScore = if (snd you) == sum then 1 else 0
let partnerScore = if (snd partner) == sum then 1 else 0
return ((yourScore, partnerScore), (s1 + yourScore, s2 + partnerScore))
loopGame :: IO (Integer, Integer)
-> (Integer, Integer)
-> IO (Either (Integer, Integer) (Integer, Integer))
loopGame partnerTurn currentScore = do
(result, s) <- runStateT (score partnerTurn) currentScore
putStrLn $ show $ result
case s of
(16, _) -> return $ Left result
(_, 16) -> return $ Right result
_ -> loopGame partnerTurn s
main :: IO ()
main = do
winner <- loopGame aiTurn (0, 0)
case winner of
Left x -> putStrLn $ "You've won! Score: " ++ (show x)
Right x -> putStrLn $ "You've lost! Score: " ++ (show x)
return ()
|