Python - IndexError: строковый индекс вне диапазона (для начинающих) - PullRequest
1 голос
/ 04 февраля 2012

Прежде всего, извините, если на этот вопрос уже есть ответ. Я просмотрел последние вопросы Q, но не повезло.

Моя проблема в том, что я прошел учебник Python + libtcod по Roguebasin один раз и делаю это снова, делая свои собственные модификации.

Я пытаюсь создать жестко закодированную карту вместо случайно сгенерированной.

Код пока не будет отображать окноили что-нибудь, что я только бегу и надеюсь, что это закрывается без ошибок.НО, я продолжаю получать это:

Traceback (most recent call last):
  File "superrogue.py", line 85, in <module>
    make_map()
  File "superrogue.py", line 68, in make_map
    if MAP_FILE[x][y] in TILE_NAMES:    #Find the tile's name---
IndexError: string index out of range

Весь "индекс строки вне диапазона" - это то, что я бью головой об стену весь день и вечер.

Вотпока код:

#---Imports-------------------------------------------------------------
import libtcodpy as libtcod

#---Program Labelings---------------------------------------------------
TITLE = 'Roguetest'
VERSION = '0.01a'

#---Setup Variables-----------------------------------------------------
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 50
LIMIT_FPS = 20
#MAP_FILE = open('Maps/Test.txt', 'r')
#MAP_FILE = MAP_FILE.readlines()
MAP_FILE = ['XXXX',
            'X==X',
            'X..X',
            'X..X',
            'X==X',
            'XXXX',
            ]
MAP_WIDTH = len(MAP_FILE[0])
print MAP_WIDTH
MAP_HEIGHT = len(MAP_FILE)
print MAP_HEIGHT


#---Dictionaries--------------------------------------------------------------
COLORS = {
            'dark_new' : libtcod.Color(255, 0, 255),
            'light_new' : libtcod.Color(255, 0, 255),
            'dark_pavement' : libtcod.Color(20, 20, 20),
            'light_pavement' : libtcod.Color(50, 50, 50),
            'dark_sidewalk' : libtcod.Color(80, 80, 80),
            'light_sidewalk' : libtcod.Color(120, 120, 120),
            'dark_wall' : libtcod.Color(100, 100, 100),
            'light_wall' : libtcod.Color(180, 180, 180)
            }

TILE_NAMES = {
                'X' : 'wall',
                '.' : 'pavement',
                '=' : 'sidewalk'
                }

#---Classes-------------------------------------------------------------
class Tile:
    def __init__(self, name):
        self.name = name
        self.darkcolor = COLORS['dark_' + self.name]
        self.lightcolor = COLORS['light_' + self.name]
        self.blocks = False
        self.blocks_sight = False
        self.inside = False


#---Functions-----------------------------------------------------------
def make_map():

    map = [[ Tile(name='new')
        for x in range(MAP_WIDTH) ]
            for y in range(MAP_HEIGHT) ]

    for x in range(MAP_WIDTH):
        for y in range(MAP_HEIGHT):
            print (x, y)
            if MAP_FILE[x][y] in TILE_NAMES:    #Find the tile's name---
                map[x][y].name = TILE_NAMES[MAP_FILE[x][y]]

            map[x][y].darkcolor = COLORS['dark_' + map[x][y].name]
            map[x][y].lightcolor = COLORS['light_' + map[x][y].name]

            if MAP_FILE[x][y] == 'X':   #The WALL tile------------------
                map[x][y].blocked = True
                map[x][y].block_sight = True
            elif MAP_FILE[x][y] == '.': #The PAVEMENT tile--------------
                map[x][y].blocked = False
                map[x][y].block_sight = False
            elif MAP_FILE[x][y] == '=': #The SIDEWALK tile--------------
                map[x][y].block_sight = False
                map[x][y].ped_walkable = True


make_map()

Спасибо.

1 Ответ

7 голосов
/ 04 февраля 2012

y становится на len(MAP_HEIGHT) - 1 (из-за вызова range); MAP_HEIGHT = len(MAP_FILE); MAP_FILE - список из шести элементов.

Таким образом, y будет принимать значения 0, 1, 2, 3, 4, 5. Однако строка имеет только четыре значения, поэтому попытка доступа к пятому или шестому символу завершится неудачей.

Я думаю, что вы запутали высоту и ширину карты (она индексируется как [y] [x], и вы получаете доступ к ней как [x] [y]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...