summaryrefslogtreecommitdiff
path: root/Haskell-book/26/Morra/app/Main.hs
blob: 0b0d28aff33029188bb5a499f5dae63c8ccd2bab (plain)
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 ()