2016-07-08 10 views
0

私はhaskell(hscurses付き)で少しRLを作っていますが、今はダンジョンを作成/印刷するコードを書いています。haskellのRLの配列またはリスト

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

    return dungeon 

そして、それは次のように印刷される:

私が最初にすることは、それはこのようなものだ「壁」Pythonで
(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() 

私の質問は次のとおりです。これをどのようにしてハズケで行うことができますか? モジュールData.Arrayがありますが、私が理解しているように、2D配列のみをサポートしています。
また、後で部屋と廊下を '掘る'必要があるので、配列は変更可能でなければなりません。

私の質問は、私はそれのための配列を使用する必要がありますか、またはより良いリストですか?

ありがとうございます!

+0

「どのように私はXを設計するべきですか?」 - このような質問は、このサイトで良い答えを得るためには、通常は[広すぎる](http://stackoverflow.com/help/closed-questions)です。また、どのように動作するか( "配列は変更可能でなければならない")についての仮定を持っているようです。 –

+1

この質問をしているので、非効率であってもリストを推薦します。 – Alec

+0

私は個人的にマップ(ペア)をキーとして使っています。シンプルですが、マップにないものは壁や白い石です。更新や折りたたみが簡単です。 –

答えて

2

Haskellは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を使用するか、(//)操作を使用します。

関連する問題