You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

代码解释

  1. 遍历棋盘:用[0..2]生成行号和列号,覆盖3×3棋盘的所有位置(从(0,0)到(2,2))。
  2. 查找棋子:Map.lookup (row, col) board从映射中取出对应位置的棋子列表,用case处理存在/不存在的两种情况。
  3. 格式化输出:把每行的单元格用|分隔,加上可选的分隔线,让棋盘的结构更直观易读。

运行效果

执行main后,输出会是这样:

| x | piece1, piece2 | x |
|---|---|---|
| x | x | x |
|---|---|---|
| x | x | piece3, piece4 |
|---|---|---|

如果不想显示分隔线,只需要删掉printRow里的putStrLn "|---|---|---|"这一行就行,输出会更简洁。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:56:35