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()。