Skip to content

Instantly share code, notes, and snippets.

@kagamilove0707
Last active December 18, 2015 13:09
Show Gist options
  • Save kagamilove0707/5788204 to your computer and use it in GitHub Desktop.
Save kagamilove0707/5788204 to your computer and use it in GitHub Desktop.
OrderingのMonoid実装を使って書いたじゃんけんです>ω< unsafeInterleaveIOを使ってどうにか動くようにしてみました>< もっとうまい方法を知っていたら教えていただけると幸いですm(_ _)m
import Control.Monad
import Data.Monoid
import System.IO
import System.Random
data Janken = Guu|Choki|Paa deriving (Show, Read, Eq, Enum)
instance Ord Janken where
Guu `compare` Choki = LT
Choki `compare` Paa = LT
Paa `compare` Guu = LT
l `compare` r
|l == r = EQ
|otherwise = GT
janken :: IO Ordering
janken = do
putStrLn "Janken Pon!"
you <- prompt "you > " >>= return . read :: IO Janken
cpu <- getStdRandom (randomR (0, 2)) >>= return . (!!) [Guu .. Paa]
putStrLn $ "cpu > " ++ show cpu
(return $ you `compare` cpu) `mappendM` (unsafeInterleaveIO $ putStrLn "Draw" >> janken)
where
prompt xs = putStr xs >> hFlush stdout >> getLine
mappendM = liftM2 mappend
main = do
res <- janken
case res of
LT -> putStrLn "Win!"
GT -> putStrLn "Loss!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment