2016-07-08 4 views
0

저는 hkurses가있는 haskell에서 약간의 RL을 만들고 있습니다. 이제는 던전을 만들고 인쇄하는 코드를 작성합니다.haskell의 배열 또는 목록

def mk_list(x, y):   
    dungeon = [['#' for j in range(y)] for i in range(x)] 

    return dungeon 

그리고이 같은 인쇄 할 것이다 :

내가 할 첫 번째 점은 같은 것 '벽'파이썬에서
(V3)와 목록/배열을하고있다

import curses 
def print_dungeon(window, x, y, dungeon): 
    for i in range(x): 
     for j in range(y): 
     window.addstr(j, i, dungeon[x][y]) 
    window.refresh() 

내 질문은 : 어떻게 할 수있는 haskell합니까? 나는 모듈 Data.Array을 제외하고는 압니다 만, 이해할 수 있듯이 2D 배열 만 지원합니다.
또한 나중에 배열과 복도를 '파'해야하기 때문에 배열을 변경할 수 있어야합니다.

하지만 제 질문은 배열을 사용해야합니까, 아니면 목록이 더 좋습니까?

미리 감사드립니다.

+0

"X를 어떻게 디자인해야합니까?"-이 질문은이 사이트에서 좋은 답변을 얻으려면 일반적으로 [너무 광범위]합니다 (http://stackoverflow.com/help/closed-questions). 또한, 당신은 그것이 어떻게 작동하는지에 대한 가정을 가지고있는 것 같습니다 ("배열은 변경 가능해야합니다"). 나는 정확하지 않다고 생각합니다. –

+1

당신은이 질문을하기 때문에 비효율적 일지라도 목록을 추천합니다. – Alec

+0

개인적으로지도 (좌표)를 키로 사용하여 작업했습니다. 간단합니다.지도에없는 모든 것은 벽이나 빈 돌이며, 쉽게 업데이트하고 접을 수 있습니다. –

답변

2

하스켈은 N 차원 배열을 지원

import Data.Array 
import Data.Ix 
import Control.Monad 

main = do 
    let myBounds = ((0,5,10),(7,8,12)) :: ((Int,Int,Int),(Int,Int,Int)) 
     threeDexample = array myBounds 
         [ (ijk, e) | [email protected](i,j,k) <- range myBounds, 
            let e = i+j*10+k*100 ] 

    forM_ (range myBounds) $ \[email protected](i,j,k) -> do 
    putStrLn $ "value at " ++ show ijk ++ " = " ++ show (threeDexample ! ijk) 

돌연변이, Data.Array.MArray를 사용하거나 사용 (//) 동작을 행해도된다.