Rock-paper-scissors: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: hlint, hindent, type signatures, specified import)
Line 2,312: Line 2,312:
=={{header|Haskell}}==
=={{header|Haskell}}==


<lang haskell>import System.Random
<lang haskell>import System.Random (randomRIO)

data Choice = Rock | Paper | Scissors
deriving (Show, Eq)


data Choice
= Rock
| Paper
| Scissors
deriving (Show, Eq)


beats :: Choice -> Choice -> Bool
beats Paper Rock = True
beats Paper Rock = True
beats Scissors Paper = True
beats Scissors Paper = True
Line 2,323: Line 2,326:
beats _ _ = False
beats _ _ = False


genrps (r,p,s) = fmap rps rand
genrps :: (Int, Int, Int) -> IO Choice
genrps (r, p, s) = rps <$> rand
where rps x | x <= s = Rock
where
| x <= s+r = Paper
rps x
| otherwise = Scissors
rand = randomRIO (1,r+p+s) :: IO Int
| x <= s = Rock
| x <= s + r = Paper
| otherwise = Scissors
rand = randomRIO (1, r + p + s) :: IO Int


getrps = fmap rps getLine
getrps :: IO Choice
getrps = rps <$> getLine
where rps "scissors" = Scissors
where
rps "rock" = Rock
rps "paper" = Paper
rps "scissors" = Scissors
rps _ = error "invalid input"
rps "rock" = Rock
rps "paper" = Paper
rps _ = error "invalid input"


game :: (Int, Int, Int) -> IO a
game (r,p,s) = do putStrLn "rock, paper or scissors?"
game (r, p, s) = do
h <- getrps
putStrLn "rock, paper or scissors?"
c <- genrps (r,p,s)
h <- getrps
putStrLn ("Player: " ++ show h ++ " Computer: " ++ show c)
c <- genrps (r, p, s)
putStrLn (if beats h c then "player wins\n"
putStrLn ("Player: " ++ show h ++ " Computer: " ++ show c)
else if beats c h then "player loses\n"
putStrLn
else "draw\n")
(if beats h c
let rr = if h == Rock then r+1 else r
pp = if h == Paper then p+1 else p
then "player wins\n"
else if beats c h
ss = if h == Scissors then s+1 else s
game (rr,pp,ss)
then "player loses\n"
else "draw\n")
let rr =
if h == Rock
then r + 1
else r
pp =
if h == Paper
then p + 1
else p
ss =
if h == Scissors
then s + 1
else s
game (rr, pp, ss)


main = game (1,1,1)</lang>
main :: IO a
main = game (1, 1, 1)</lang>


=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==