70 lines
1.7 KiB
Haskell
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 ()
|