35 lines
929 B
Haskell
35 lines
929 B
Haskell
import Data.Char (isDigit, digitToInt)
|
|
import System.IO
|
|
|
|
prompt :: String
|
|
prompt = "How many do you take? 1, 2 or 3? "
|
|
|
|
getPlayerSelection :: IO Int
|
|
getPlayerSelection = do
|
|
hSetBuffering stdin NoBuffering
|
|
c <- getChar
|
|
putChar '\n'
|
|
if isDigit c && digitToInt c <= 3 then
|
|
pure (digitToInt c)
|
|
else do
|
|
putStrLn "Invalid input"
|
|
putStr prompt
|
|
getPlayerSelection
|
|
|
|
play :: Int -> IO ()
|
|
play n = do
|
|
putStrLn $ show n ++ token n ++ " remain."
|
|
if n == 0 then putStrLn "Computer Wins!"
|
|
else do
|
|
putStr prompt
|
|
playerSelection <- getPlayerSelection
|
|
let computerSelection
|
|
| playerSelection > 4 = playerSelection - 4
|
|
| otherwise = 4 - playerSelection
|
|
putStrLn $ "Computer takes " ++ show computerSelection ++ token computerSelection ++ ".\n"
|
|
play (n - computerSelection - playerSelection)
|
|
where token 1 = " token"
|
|
token _ = " tokens"
|
|
|
|
main :: IO ()
|
|
main = play 12
|