1

我正在尝试在 python 中测试一个简单的二维地图坐标生成器。它使用 x 和 y 数组创建一个 Tile 对象,以便我可以访问坐标并修改它们的属性。

这将创建地图对象并用 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

我试图让程序逐字符读取文本文件以创建地图。它将在 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

(经过几次 elifs 后)

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

运行此程序时,我收到此错误:IndexError: list index out of range。它说这条线

 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 cts...

于 2013-03-21T20:45:20.427 回答