我正在尝试在python中测试一个简单的2d地图坐标生成器。它使用x和y数组创建一个Tile对象,以便我可以访问坐标并修改它们的属性。
这将创建地图对象并使用2D坐标平面中的切片填充
map = [[ Tile(True)
for y in range(MAP_HEIGHT) ]
for x in range(MAP_WIDTH) ]
tile类:
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
(在更多的精灵之后)
if(mapx < MAP_WIDTH):
mapx += 1
elif(mapy < MAP_HEIGHT):
mapy += 1
mapx = 0
运行时,我收到此错误:IndexError:列表索引超出范围。 它说行
new_map[mapx][mapy].blocked = False
这是错误的。知道我做错了吗?
答案 0 :(得分:2)
在初始化之后,外部列表将具有索引从0到MAP_WIDTH
的{{1}}个元素。同样,每个内部列表都有从0到MAP_WIDTH-1
的索引。
考虑MAP_HEIGHT-1
时会发生什么;即使用您的代码在列表的末尾:
mapx = MAP_WIDTH-1
if(mapx < MAP_WIDTH):
mapx += 1
....
的值将大于列表的上限。
测试应mapx
来解决此问题。 elif中的测试也需要相应更改。
答案 1 :(得分:0)
如果您首先读取文件并创建列表[...(xi,yi)...]然后在(xi,yi)上创建一个循环以实现Tile对象,那将更加pythonic。 这样,您就不必考虑列表索引。
只是我的2个cts ......