如何基于Data.Map (Int, Int) [String]打印3×3游戏棋盘?
解决Haskell 3×3棋盘打印问题
我来帮你搞定这个棋盘打印的需求!其实核心思路就是遍历3×3棋盘的每个位置,从你的Data.Map里取出对应位置的棋子列表,没有棋子的位置就显示x(或者空字符串),最后把每行的内容格式化输出就行。
完整代码示例
首先确保导入Data.Map模块,然后实现打印函数:
import qualified Data.Map as Map import Data.Map (Map) import Data.List (intercalate) -- 打印3×3棋盘的函数 print3x3Board :: Map (Int, Int) [String] -> IO () print3x3Board board = mapM_ printRow [0..2] where -- 打印单独一行 printRow row = do -- 生成当前行所有列的单元格内容 let cells = map (\col -> getCellContent row col) [0..2] -- 格式化并打印当前行,用竖线分隔单元格 putStrLn $ unwords $ map (\cell -> "| " ++ cell ++ " ") cells -- 打印行分隔线(可选,让棋盘更清晰) putStrLn "|---|---|---|" -- 获取单个单元格的显示内容 getCellContent row col = case Map.lookup (row, col) board of -- 如果有棋子,用逗号连接所有棋子名称 Just pieces -> intercalate ", " pieces -- 没有棋子的位置显示"x",也可以换成""表示空 Nothing -> "x" -- 测试用的棋盘 testBoard :: Map (Int, Int) [String] testBoard = Map.fromList [ ((0,1), ["piece1", "piece2"]), ((2,2), ["piece3", "piece4"]) ] -- 运行测试 main :: IO () main = print3x3Board testBoard
代码解释
- 遍历棋盘:用
[0..2]生成行号和列号,覆盖3×3棋盘的所有位置(从(0,0)到(2,2))。 - 查找棋子:
Map.lookup (row, col) board从映射中取出对应位置的棋子列表,用case处理存在/不存在的两种情况。 - 格式化输出:把每行的单元格用
|分隔,加上可选的分隔线,让棋盘的结构更直观易读。
运行效果
执行main后,输出会是这样:
| x | piece1, piece2 | x | |---|---|---| | x | x | x | |---|---|---| | x | x | piece3, piece4 | |---|---|---|
如果不想显示分隔线,只需要删掉printRow里的putStrLn "|---|---|---|"这一行就行,输出会更简洁。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

