我目前正在尝试使用Haskell开发小型的康威生命游戏。我编写了一个名为lifegame的库,可以管理单元格网格并计算它的演化(请参阅github.com/qleguennec/lifegame.git)。演化是一个无限列表。到目前为止,该库运行良好,但缺乏文档。由于这是一个小型库,应该不难理解。
现在,我的计划是将lifegame与helm相结合,将演化结果显示在屏幕上。以下是我的代码:
import FRP.Helm
import FRP.Helm.Graphics (Element(..))
import qualified FRP.Helm.Window as Window
import FRP.Helm.Animation (Frame, AnimationStatus(..), animate, absolute)
import FRP.Helm.Time (second, running, delta)
import FRP.Elerea.Simple
import Cell.Display (allGenFrames)
import LifeGame.Data.CellGrid (CellGrid(..), randCellGrid)
render :: Form -> (Int, Int) -> Element
render form (x, y) = collage x y $ [form]
main :: IO ()
main = do
cg <- randCellGrid 50 50
anim <- return . absolute $ allGenFrames cg (1 * second) 10
engine <- startup defaultConfig
run engine $ render <~ (animate anim running status) ~~ Window.dimensions engine
where
config = defaultConfig { windowTitle = "bats"
, windowDimensions = (500, 500)}
status = effectful $ getLine >>= \i -> return $
case i of
"Pause" -> Pause
"Stop" -> Stop
"Cycle" -> Cycle
(来自:github.com/qleguennec/bats.git)
计算的重活儿在animate running status
的第20行。我不太理解animate的第二个参数是什么。此外,我不确定提供一个无限的Frames列表是否合法。
当我运行代码时,游戏会冻结并在5分钟后停止。似乎消耗了所有内存并崩溃了。现在,我明白这一切都缺乏文档。我正在努力改进。但是,作为一个新手 Haskeller 和 FRP/SDL 开发人员,我需要知道我是否做错了(我可能确实做错了)。 欢迎并推荐任何意见。谢谢。