Haskell 在哈斯克尔的扫雷舰克隆中管理状态

Haskell 在哈斯克尔的扫雷舰克隆中管理状态,haskell,Haskell,为了学习哈斯克尔,我决定做一个扫雷舰克隆人。我已经写了一些代码,程序的主要结构已经准备好了。其依据是: 一个板,包含矿山的数量、地图的字段列表和宽度和高度 一个字段,包含相邻地雷的数量或一个表示该字段本身就是地雷的值。字段还包含一个字段状态(标记,隐藏或显示) 游戏循环如下所示: play board = do -- Clear the screen putStrLn $ replicate 40 '\n' -- Show the board print b

为了学习哈斯克尔,我决定做一个扫雷舰克隆人。我已经写了一些代码,程序的主要结构已经准备好了。其依据是:

  • 一个
    ,包含矿山的
    数量
    、地图的
    字段列表
    宽度
    高度
  • 一个
    字段
    ,包含相邻地雷的数量或一个表示该字段本身就是地雷的值。
    字段
    还包含一个
    字段状态
    标记
    隐藏
    显示
游戏循环如下所示:

play board = do
    -- Clear the screen
    putStrLn $ replicate 40 '\n'

    -- Show the board
    print board

    -- Get and process user input
    putStr "Command: "
    -- We are generating a new board to reflect the changes!
    newBoard <- parseInput board <$> getLine

    -- If the game is not ended, go to next step
    if gameEnded newBoard
    then return $ result newBoard
    else play newBoard
playboard=do
--清除屏幕
putStrLn$replicate 40'\n'
--向董事会展示
印制板
--获取并处理用户输入
putStr“命令:”
--我们正在生成一个新的板来反映这些变化!

newBoard你是对的,当然完全更换电路板并不是最理想的,但也不一定像你想象的那么糟糕。如果
Board
使用
[[FieldState]]
-2D网格,那么更新单个单元格实际上会重复使用大部分行(这是不经过思考的工作方式,也是完全安全的,因为Haskell完全是功能性的):对于n×n网格,复杂性为O(n),只有一个常数因子比查找任何给定字段所需的因子还要差。对于像扫雷舰这样的游戏来说,这绝对不会有任何问题


对于性能更为关键的内容,有一些专用的数组类型可以在O(1)中查找和更新单个字段(在
IO
ST
monad中)。对于与您类似的应用程序,它可能是最合适的(尽管在社区中有一种趋势,倾向于围绕较低级别、更优化的类型编写您的摘要)。

您当然是对的,完全替换电路板并不是最理想的,然而,它也不一定像你想象的那么糟糕。如果
Board
使用
[[FieldState]]
-2D网格,那么更新单个单元格实际上会重复使用大部分行(这是不经过思考的工作方式,也是完全安全的,因为Haskell完全是功能性的):对于n×n网格,复杂性为O(n),只有一个常数因子比查找任何给定字段所需的因子还要差。对于像扫雷舰这样的游戏来说,这绝对不会有任何问题


对于性能更为关键的内容,有一些专用的数组类型可以在O(1)中查找和更新单个字段(在
IO
ST
monad中)。对于与您的应用程序类似的应用程序,它可能是最合适的(尽管社区中有一种趋势,倾向于围绕较低级别、更优化的类型编写您的抽象)。

您可能想尝试ST Monad()。您可能想尝试ST Monad()。