<p><code>IndexError</code>是由不正确的列表索引语法引起的,<code>TypeError</code>是由命名空间冲突引起的。要修复<code>IndexError</code>,应使用以下语法:</p>
<pre><code>self.tilestore = world_map[self.x][self.y]
</code></pre>
<p><code>TypeError</code>是由命名空间冲突引起的。在<code>player.init</code>中,使用变量<code>map</code>,而不初始化本地命名空间中的<code>map</code>,因此<code>map</code>是指全局命名空间,其中包含对内置<code>map</code>函数的引用。您需要像这样将<code>map</code>作为参数传递给<code>player.init</code></p>
<pre><code>class player(object):
def __init__(self, world, map):
</code></pre>
<p>或者从这样的<code>World</code>实例中获取</p>
<pre><code>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])
</code></pre>
<p>您还应该像上面所做的那样,将参数<code>World</code>更改为<code>world</code>,以避免类名<code>World</code>和类实例<code>World</code>之间的另一个命名空间冲突。你知道吗</p>
<p>另一个可能导致<code>IndexError</code>的问题是使用<code>randint</code>。假设您使用的是<a href="https://docs.python.org/2/library/random.html#random.randint" rel="nofollow">^{<cd19>}</a>函数,对于参数<code>a</code>和<code>b</code>,它会生成<code>a <= N <= b</code>这样的数字。请注意,此范围包含在两侧。这意味着有时<code>self.x</code>等于<code>world.width</code>,<code>self.y</code>等于<code>world.height</code>。由于构建<code>world.map</code>的方式,这两个值都超出了范围。解决方法如下:</p>
<pre><code>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])
</code></pre>
<p>在为世界地图编制索引的任何地方,都必须进行类似的更改。你知道吗</p>