2015-03-01 3 views
0

Когда я спотыкался по учебнику, у меня была повторяющаяся проблема (повторяю, повторяю, потому что она, казалось, спонтанно разрешилась после того, как я отказался от дня и позже снова появляться, я не знаю, что я сделал, чтобы это случилось) с ошибкой:IndexError: индекс индекса за пределами допустимого диапазона

Traceback (most recent call last): 
    File "roguelike.py", line 215, in <module> 
    make_map() 
    File "roguelike.py", line 131, in make_map 
    create_room(new_room) 
    File "roguelike.py", line 84, in create_room 
    map[x][y].blocked = False 
IndexError: list index out of range 

Соответствующий код ниже:

def create_room(room): 
    global map 
    #set all tiles inside the room to passable 
    for x in range(room.x1 + 1, room.x2): 
     for y in range(room.y1 + 1, room.y2): 
      map[x][y].blocked = False 
      map[x][y].block_sight = False 

Он оказался в точке, где я сравнивал код Я написал по-символу код примера, написанный в учебнике, без везения. Это первый раз, когда в программе используется «карта», и я довольно упущен, когда дело доходит до списков в python.

Как последнее замечание, я размышлял по другим вопросам в том же духе, но я не мог применить их к своей ситуации из-за моих ограниченных знаний.

+2

Честно говоря, я бы держаться подальше от любого учебника, который использует имена переменных, как 'map' (который затеняет встроенный function 'map()'). –

+0

Из интереса, что такое учебник? Я видел так много вопросов на Python с картами и номерами здесь. – YXD

+0

Если вам нужен ответ, я думаю, вам нужно добавить какой-то контекст. Что такое карта? Насколько велика она должна быть? Что делает остальная часть этого учебника? Ссылка на учебник, вероятно, тоже будет полезна. Исключительно основанный на том, что вы опубликовали, трудно дать вам полезный ответ. –

ответ

0

Atleast один из room.x1 + 1, room.x2, room.y1 + 1 и room.y2 превышает вашу карту. Либо проверьте размер своей карты, либо ограничите доступ.

Вариант 1:

class RoomOutsideError(Exception): 
    pass 

# ... 

def create_room(room): 
    global map 
    #set all tiles inside the room to passable 

    # check for limits and raise exception 
    # (this will need handling outside this function) 
    max_x, max_y = len(map) - 1, len(max[0]) - 1 
    if room.x1+1 > max_x or room.x2 > max_x or \ 
     room.y1+1 > max_y or room.y2 > max_y: 
      raise RoomOutsideError("Room outside map.") 

    for x in range(room.x1 + 1, room.x2): 
     for y in range(room.y1 + 1, room.y2): 
      map[x][y].blocked = False 
      map[x][y].block_sight = False 

Вариант 2:

def create_room(room): 
    global map 
    #set all tiles inside the room to passable 

    # limit room coordinates. This is free of additional handlings but 
    # might create odd rooms in the corner of the map. 
    max_x, max_y = len(map) - 1, len(map[0]) - 1 
    for x in range(room.x1 + 1, room.x2): 
     for y in range(room.y1 + 1, room.y2): 
      map[min(max_x, x)][min(max_y, y)].blocked = False 
      map[min(max_x, x)][min(max_y, y)].block_sight = False 
Смежные вопросы