1

Pythonで単純な2Dマップ座標ジェネレーターをテストしようとしています。x配列とy配列を使用してタイルオブジェクトを作成し、座標にアクセスしてそれらのプロパティを変更できるようにします。

これにより、マップオブジェクトが作成され、2D座標平面のタイルで塗りつぶされます。

map = [[ Tile(True)
    for y in range(MAP_HEIGHT) ]
        for x in range(MAP_WIDTH) ]

タイルクラス:

class Tile:
    #a tile of the map and its properties
    def __init__(self, blocked, type, owner, block_sight = None):
        self.blocked = blocked
        self.type = type
        self.owner = owner 
        if block_sight is None: block_sight = blocked
        self.block_sight = block_sight

プログラムにテキストファイルを1文字ずつ読み取らせて、マップを作成しようとしました。mapxとmapyによって提供される座標にあるオブジェクトをマップに挿入します。

mapx = 0
mapy = 0
filename = str(mapn) + '.txt'
new_map = [[ Tile(True, 0, 0)
         for y in range(MAP_HEIGHT) ]
       for x in range(MAP_WIDTH) ]
with open(filename) as f:
    while True:
        c = f.read(1)
        if not c:
            return new_map
        elif (c == '#'):
            new_map[mapx][mapy].blocked = False
            new_map[mapx][mapy].block_sight = True
            new_map[mapx][mapy].type = 0
            new_map[mapx][mapy].owner = 0

(さらにいくつかのエリフの後)

if(mapx < MAP_WIDTH):
    mapx += 1
elif(mapy < MAP_HEIGHT):
    mapy += 1
    mapx = 0

これを実行すると、次のエラーが発生します。IndexError:リストインデックスが範囲外です。それはラインを言います

 new_map[mapx][mapy].blocked = False 

これに責任がある。私が間違っていることについて何か考えはありますか?

4

2 に答える 2

2

MAP_WIDTH初期化後、外側のリストには0 から までのインデックスを持つ要素が含まれますMAP_WIDTH-1。同様に、各内部リストには 0 から までのインデックスがありますMAP_HEIGHT-1

次の場合に何が起こるかを考えてみましょうmapx = MAP_WIDTH-1。つまり、コードを使用してリストの最後にあります:

if(mapx < MAP_WIDTH):
    mapx += 1
....

の値はmapx、リストの上限よりも大きくなります。

mapx < MAP_WIDTH-1これを解決するためのテストを行う必要があります。それに応じて、elif のテストも変更する必要があります。

于 2013-03-21T20:29:57.460 に答える
0

最初にファイルを読み取ってリスト [ ... (xi, yi) ... ] を作成し、次に (xi,yi) のループを作成して Tile オブジェクトをインスタンス化すると、より Pythonic になります。このようにして、リストのインデックスについて考える必要がなくなります。

ちょうど私の2カラット...

于 2013-03-21T20:45:20.427 に答える