我是Haskell的新手,所以我试图制作一个简单的双人游戏基于文本的游戏,以帮助我学习它。
但是,我遇到了在“循环”中执行IO的问题。据我所知,除非在main中设置,否则不能使用从用户输入设置的变量。这是一个问题,因为对main的递归调用对我来说是无用的,因为main不接受任何参数。理想情况下,我会有一个从main调用的函数调用自己直到一个玩家失败。但是,这似乎不起作用,因为通过用户输入使用该函数中设置的任何变量会导致类型错误。
该计划的结构如下:
*提示玩家1获取名称并设置player1变量。
*提示玩家2获取名称并设置player2变量。
*“循环”:在每个玩家之间交替,提示命令直到一个玩家输掉。
解决这个问题的最佳方法是什么?
答案 0 :(得分:22)
理想情况下,我会从main调用一个调用自身的函数 直到一个玩家输了。但是,这似乎不起作用,因为使用 用户输入在该函数中设置的任何变量都会导致类型 错误。
这完全有可能。下次请包含一些代码,以便我们帮助您解决误解。这是一个示例代码段:
import System.IO
处理缓冲问题。
main = do
hSetBuffering stdin NoBuffering
putStrLn "Gimma a name ye skervy dog!"
name1 <- getLine
putStrLn "Good, Good, now another, and make it snappy!"
name2 <- getLine
loop name1 name2 10
注意main
可以调用IO monad中的另一个函数(loop
)。这个其他功能完全能够获取和操作用户输入,调用自身和/或接受参数。
loop :: String -> String -> Int -> IO ()
loop _ _ 0 = return ()
loop n1 n2 i = do
putStrLn $ "Ok Mr. " ++ n1 ++ " and Mrs. " ++ n2 ++
" tis time to roll the dice!"
print i
putStrLn "Options: (k)eep looping, (i)ncrement loop counter by 10"
c <- getChar
putStr "\n"
case c of
'k' -> loop n1 n2 (i-1)
_ -> putStrLn "Blood and bloody ashes, we have to keep going?" >>
loop n1 n2 (i+10)
并且循环只是做一个简单的愚蠢的工作,要求二进制输入(增加计数器与否),以及循环。
如果这没有用,那么也许您可以发布更完整的问题和代码。我将使用更新的答案进行编辑。
答案 1 :(得分:6)
或者您可以使用forever
。
main = do
x <- getLine
foo
forever $ do
y <- getLine
baz
如果您是Haskell的新手,我建议您通过LYAH进行介绍。