索引器错误:列表索引超出范围/难以使用OOP调用列表

2024-10-01 17:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的代码,一直在自学python通过'学习python的艰难之路'教程,目前正在做一个简单的游戏。到目前为止,一切似乎都在工作,除了我不知道如何正确调用我的一个类与其他类的列表。你知道吗

class engine(object):
    def __init__(self,world,days,character):
        self.world = world
        self.days = days
        self.character = character

    def letsdoit(self):
        self.world.worldbuilder()

这是一个实际运行游戏的块,前面的第9行被省略,因为它们不相关。你知道吗

你知道吗世界.worldbuilder是一个函数,用于创建游戏实际在其上进行的地图。你知道吗

class World(self, width, height):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def worldbuilder(self):
        map = []
        for x in xrange(self.width):
            z = []
            for y in xrange(self.height):
                z.append(self.tiletype())
            map.append(z)
        return map

你知道吗世界.tiletype只是随机生成一个磁贴然后重置。当我实例化一个World对象并运行worldbuilder时(除了打印地图而不是返回地图),一切都很好。然而,当我在推测中使用对象而不是引擎运行的世界时,我得到了错误。最常见的是:

IndexError: list out of range

具体来说,我得到的回应是:

class player(object):
    def __init__(self, World):
        self.x = randint(1,World.width)
        self.y = randint(1,World.height)
        self.tilestore = map([self.x][self.y])

即使当我开始播放器.tilestore为了与泛型图块相等,当我在其他地方引用map时,我遇到了TypeErrors,它说我的“内置函数”或“方法”项没有“get\u项”属性。你知道吗

我已尝试设置列表=self.world.worldbuilder(),然后调用list而不是map,但是我遇到了完全相同的问题。你知道吗


Tags: self游戏mapworldinitdef地图世界
2条回答

IndexError是由不正确的列表索引语法引起的,TypeError是由命名空间冲突引起的。要修复IndexError,应使用以下语法:

self.tilestore = world_map[self.x][self.y]

TypeError是由命名空间冲突引起的。在player.init中,使用变量map,而不初始化本地命名空间中的map,因此map是指全局命名空间,其中包含对内置map函数的引用。您需要像这样将map作为参数传递给player.init

class player(object):
    def __init__(self, world, map):

或者从这样的World实例中获取

class player(object):
    def __init__(self, world):
        self.x = randint(1,world.width)
        self.y = randint(1,World.height)
        self.tilestore = world.map([self.x][self.y])

您还应该像上面所做的那样,将参数World更改为world,以避免类名World和类实例World之间的另一个命名空间冲突。你知道吗

另一个可能导致IndexError的问题是使用randint。假设您使用的是^{}函数,对于参数ab,它会生成a <= N <= b这样的数字。请注意,此范围包含在两侧。这意味着有时self.x等于world.widthself.y等于world.height。由于构建world.map的方式,这两个值都超出了范围。解决方法如下:

class player(object):
    def __init__(self, world):
        self.x = randint(1,world.width - 1)
        self.y = randint(1,World.height - 1)
        self.tilestore = world.map([self.x][self.y])

在为世界地图编制索引的任何地方,都必须进行类似的更改。你知道吗

您似乎没有调用worldbuilder,所以您可以在使用map之前调用它:

class player(object):
    def __init__(self, World):
        self.x = randint(1,World.width)
        self.y = randint(1,World.height)
        map = World.worldbuilder()
        self.tilestore = map[self.x][self.y]

正如Brionius所提到的,使用map是个坏主意(除非您想使用内置函数)。这将导致错误消息的误导。 对类和实例使用相同的名称(World)也是不好的。你知道吗

相关问题 更多 >

    热门问题