我有一个文本文件(data.txt),如下所示:
--#--
--#-@
-----
这是一个MAP,其中( - )是我可以去的地方,(#)是墙,而(@)是我的目标。我想将它加载到列表列表中,以便我可以通过(row,col)对其进行索引,然后遍历它(除非有更好的方法,我在这里是新手。)
我正在使用readFile,但这一次性给了我所有的一切,尝试使用.lines打破它但仍然没有工作......
我希望最终得到这样的结果:
myMap = [[-,-,#,-,-],[-,-,#,-,@],[-,-,-,-,-]]
除非我弄错了,否则这会让我做像myMap这样的事情! 0 !! 0得到[ - ]这是地图上单元格(0,0)上的CHAR(等等)。
然后我可以将它传递给一个函数并确定我可以做什么动作(显然不会移动到墙上)并尝试找到一些方法来递归移动直到我到达我的(@)等...
答案 0 :(得分:1)
如果我理解正确,您希望将字符串加载到二维地图中。你可以这样做:
import Data.Map hiding (map)
toMap :: String -> Map (Int,Int) Char
toMap = fromList . concatMap (λ(r,line) -> map (λ(c,char) -> ((r,c),char)) $ zip [0..] $ line) . zip [0..] . lines
然后使用它:
raw :: String
raw = "--#--λn--#-@λn-----"
main :: IO ()
main = do
let myMap = toMap raw
putStrLn $ "Map is: " ++ show myMap
putStrLn $ "Elem in pos (0,0): " ++ show (myMap ! (0,0))