Files

70 lines
1.7 KiB
Haskell

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 ()