2013-03-21 9 views
1

파이썬에서 간단한 2 차원지도 좌표 생성기를 테스트하려고합니다. x 및 y 배열을 가진 Tile 객체를 만들어 좌표에 액세스하고 속성을 수정할 수 있습니다.Python, 목록 색인 범위를 벗어남 오류

이지도 객체를 생성하고 비행기를 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가 제공하는 좌표에 객체를 삽입합니다. 범위를 벗어리스트 인덱스 : IndexError : (몇 가지 더 elifs 후)

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

이 실행

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 

, 나는이 오류가 발생합니다. 줄을 말합니다

입니다. 내가 뭘 잘못하고 있는거야?

+0

문제를 보여주는 * 최소 * 예를 표시 할 수 있습니까? 그렇지 않으면 우리가 말할 수있는 유일한 것은 인덱스가 범위 내에 있는지 정확하게 확인하지 못한다는 것입니다. – Bakuriu

+0

파일에 정확히'mapx * mapy' 문자가 있습니까? – tom

+0

@ tom 오 예. 파일에 줄이 더 있으면'mapx'는 절대로 '0'으로 재설정되지 않으며 다음 루프에서 값은 범위를 벗어난'MAP_WIDTH'입니다. 'else : break' 또는'else : mapx = 0'을 추가하는 것은'IndexError'를 해결할 것입니다. (이 문제를 피하기 위해 더 똑똑한 방법이 있다고 생각합니다.) – Bakuriu

답변

2

외부 목록은 0에서 MAP_WIDTH-1까지의 인덱스를 가진 MAP_WIDTH 요소를 갖습니다. 마찬가지로 각 내부 목록에는 0에서 MAP_HEIGHT-1까지의 인덱스가 있습니다.

mapx = MAP_WIDTH-1; 즉,이 코드를 사용하여 목록의 끝에 :

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

mapx의 값은리스트의 상한보다 큰이 될 것입니다.

이 문제를 해결하려면 테스트가 mapx < MAP_WIDTH-1이어야합니다. elif의 테스트도 그에 따라 변경해야합니다.

0

처음 파일을 읽고 [... (xi, yi) ...] 목록을 만든 다음 (xi, yi)에 루프를 작성하여 Tile 객체를 인스턴스화하면 더 불량 일 것입니다. 이렇게하면 목록 인덱스에 대해 생각하지 않아도됩니다.

그냥 내 2 캐럿 ...

관련 문제