我正在使用 Gloss 库在 Haskell 中编写 Sokoban 程序,并且我已经达到了我想要的程度,当玩家通过关卡时,从文本文件加载新关卡并让程序继续.
由于 Gloss 的限制,我对此有点困难——play
设置游戏并使其不断更新的功能如下所示:
play :: forall world
. Display -- ^ Display mode.
-> Color -- ^ Background color.
-> Int -- ^ Number of simulation steps to take for each second of real time.
-> world -- ^ The initial world.
-> (world -> Picture) -- ^ A function to convert the world a picture.
-> (Event -> world -> world) -- ^ A function to handle input events.
-> (Float -> world -> world) -- ^ A function to step the world one iteration.
-- It is passed the period of time (in seconds) needing to be advanced.
-> IO ()
这是world
我正在使用的类型:
data Game = Game
{ levelNumber :: Int,
currentLevel :: Level Square,
won :: Bool }
其中Level
s 包含当前关卡中的块。我正在Game
使用类似这样的东西在 s 中阅读(实际上还没有制作一个通用的,但这基本上就是使用文件名参数的全部内容):
startGame = do
lvl <- readFile "levels/level001.lvl"
let lvl' = parseLevel lvl
return $ Game 1 lvl' False
所以,我的困难是由于play
. 如果我只是在单个级别上操作,我可以轻松地获取 aGame
并生成 a Picture
(和 aGame
等),而无需从文件系统中读取任何数据,但是因为我在中间加载文件中的级别游戏,我不知道如何避免让我所有Game
的s IO Game
。也许在这种情况下这是不可能的,也许这是有充分理由的?我将始终对Game
从文件中提取的内容进行操作,但我不知道在任何给定点是否可以避免,如果可以,我想避免它。