Python索引器:字符串索引超出范围(初学者)

Python索引器:字符串索引超出范围(初学者),python,string,indexing,Python,String,Indexing,首先,很抱歉,如果这个问题已经得到了回答,我已经查看了过去的Q,但没有运气 我的问题是:我已经完成了一次Python+libtcod教程,并且在进行自己的修改时又做了一次 我试图制作一张硬编码的地图,而不是随机生成的 到目前为止,代码不会显示窗口或我正在运行的任何东西,希望它关闭时不会出现错误。但是,我一直在想: Traceback (most recent call last): File "superrogue.py", line 85, in <module> ma

首先,很抱歉,如果这个问题已经得到了回答,我已经查看了过去的Q,但没有运气

我的问题是:我已经完成了一次Python+libtcod教程,并且在进行自己的修改时又做了一次

我试图制作一张硬编码的地图,而不是随机生成的

到目前为止,代码不会显示窗口或我正在运行的任何东西,希望它关闭时不会出现错误。但是,我一直在想:

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

谢谢。

y
正在升级到
len(地图高度)-1
(因为
范围
呼叫)<代码>贴图高度=len(贴图文件)
<代码>映射文件是一个包含六个元素的列表

因此,
y
将取值0、1、2、3、4、5。但是,字符串只有四个值,因此尝试访问第五个或第六个字符将失败


我想你已经把地图高度和地图宽度搞混了(它由[y][x]索引,你通过[x][y]访问它)。

y
正在达到
len(地图高度)-1
(因为
范围
调用)<代码>贴图高度=len(贴图文件)
<代码>映射文件是一个包含六个元素的列表

因此,
y
将取值0、1、2、3、4、5。但是,字符串只有四个值,因此尝试访问第五个或第六个字符将失败



我想你把地图的高度和宽度搞混了(它由[y][x]索引,你通过[x][y]访问它)。

这不可能是你的实际代码。MAP_文件的最后一行有,这将导致语法错误。另外,您打印的地图高度和地图宽度与异常前打印的x、y一起显示了什么?实际上,在列表中尾随逗号是合法的。啊,真的。一定是SQL给我的大脑蒙上了阴影。不管怎样,我很确定这不是他正在运行的实际代码,查看他正在打印的索引和长度数字将非常有用。@G幸运:您可以尝试运行它。。。如果没有libtcodpy模块,则需要清空libtcod.Color内容,但这并不难。或者在你的大脑中运行它,你就会明白为什么会出错。这不可能是你真正的代码。MAP_文件的最后一行有,这将导致语法错误。另外,您打印的地图高度和地图宽度与异常前打印的x、y一起显示了什么?实际上,在列表中尾随逗号是合法的。啊,真的。一定是SQL给我的大脑蒙上了阴影。不管怎样,我很确定这不是他正在运行的实际代码,查看他正在打印的索引和长度数字将非常有用。@G幸运:您可以尝试运行它。。。如果没有libtcodpy模块,则需要清空libtcod.Color内容,但这并不难。或者在你的大脑中运行它,你就会明白为什么会出错。哦,够了。他的地图的设置方式,我认为他的列表索引为map[y][x]而不是map[x][y]很好,x和y确实互换了。因此,如果我理解正确,列表看起来像是4宽6高,但索引为6宽4高?@YAS:你试图访问它,好像它是6宽4高。结构首先按高度索引,然后按宽度索引,而您正试图以另一种方式访问它。如果您将
[x][y]
切换到
[y][x]
(并且为了逻辑和提高性能而交换x和y循环的位置),它会修复它。列表的外部部分(
map[I]
)为您提供行。拾取特定行(
map[i]
)与拾取“y”坐标相同。拾取一行后,行中的项目就是列(
map[i][j]
),拾取一列对应于拾取“x”坐标。那有用吗?哦,够了。他的地图的设置方式,我认为他的列表索引为map[y][x]而不是map[x][y]很好,x和y确实互换了。因此,如果我理解正确,列表看起来像是4宽6高,但索引为6宽4高?@YAS:你试图访问它,好像它是6宽4高。结构首先按高度索引,然后按宽度索引,而您正试图以另一种方式访问它。如果您将
[x][y]
切换到
[y][x]
(并且为了逻辑和提高性能而交换x和y循环的位置),它会修复它。列表的外部部分(
map[I]
)为您提供行。拾取特定行(
map[i]
)与拾取“y”坐标相同。拾取一行后,行中的项目就是列(
map[i][j]
),拾取一列对应于拾取“x”坐标。这有用吗?
#---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()