如何在Haskell中写一个游戏循环?

我想在Haskell中编写一个游戏,循环的每个迭代计算出世界的状态.我以为我应该创建一个功能:

gameLoop :: World -> World
-- ...

并有main :: IO()调用它:

main = do
    gameLoop -- ...

但问题是我没有一些基本的了解如何包装gameLoop函数,以便它返回main的参数值.

在Haskell中如何创建游戏循环?

最佳答案
你可能想要这样的东西

import Control.Monad.Loops

main = iterateM_ 
       (\w -> displayWorld w >> return (gameLoop w))
       initWorld
-- iterateM_ ((>>) <$> displayWorld <*> return . gameLoop) initWorld

或者如果你不想使用整个monad-loops包(即使它是岩石)

main = loop initWorld
  where loop w = displayWorld w >> loop (gameLoop w)

基本上你只是绘制世界,然后再次循环到下一个状态.

更可能你想要这样的东西

 -- False when the user wants to exit the game
 keepGoing :: World -> Bool

 main = iterateUntilM_ keepGoing displayLoop initWorld
   where displayLoop w = displayWorld w >> return (gameLoop w)

因为否则你不能停止:)

转载注明原文:如何在Haskell中写一个游戏循环? - 代码日志