我是编码的新手,并且通过“学习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行以后被省略,因为它们并不相关。
world.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
World.tiletype只是随机生成一个磁贴然后重置。当我实例化一个World的对象并运行worldbuilder时(除了我打印地图而不是返回它)它完全正常。然而,当我在猜想中使用除了World之外的对象来引用map时,我会遇到错误。最常见的是:
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])
即使我将player.tilestore设置为等于通用磁贴,我也会遇到TypeErrors,它说的是我的' built_in_function_or_method' item没有属性' get_item'当我在其他地方提到地图时。
我尝试过设置list = self.world.worldbuilder(),然后调用list而不是map,但后来我遇到了完全相同的问题。
答案 0 :(得分:0)
IndexError
是由不正确的列表索引语法引起的,而TypeError
是由命名空间冲突引起的。要修复IndexError
,您应该使用以下语法:
self.tilestore = world_map[self.x][self.y]
TypeError
是由命名空间冲突引起的。在player.init
您正在使用变量map
而不在本地命名空间中初始化map
,因此map
引用全局命名空间,其中包含对内置{{1}的引用1}}功能。您需要将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
。假设您使用random.randint
函数,对于参数randint
和a
,它会生成b
的数字。请注意,此范围包括双方。这意味着有时a <= N <= b
等于self.x
,world.width
等于self.y
。由于您构建world.height
的方式,这两个值都超出了范围。这是修复:
world.map
在索引世界地图的任何地方,您都必须进行类似的更改。
答案 1 :(得分:0)
您似乎没有拨打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)也很糟糕。