Python 尝试使用递归时出现函数名未定义错误

Python 尝试使用递归时出现函数名未定义错误,python,pygame,Python,Pygame,我想做一个能射子弹的球员。为此,我尝试定义一个shot函数,按下空格键时调用该函数。函数如下所示(p是播放器对象,顺便说一句): 我希望函数会不断调用自己,子弹会继续前进。然而,当我按下空格键时,会出现一个错误 shoot() NameError: name 'shoot' is not defined 我如何调用函数: while True: d.fill((98, 98, 98)) p.draw() for event in pygame.event.ge

我想做一个能射子弹的球员。为此,我尝试定义一个
shot
函数,按下空格键时调用该函数。函数如下所示(p是播放器对象,顺便说一句):

我希望函数会不断调用自己,子弹会继续前进。然而,当我按下空格键时,会出现一个错误

    shoot()
NameError: name 'shoot' is not defined
我如何调用函数:

while True:
    d.fill((98, 98, 98))
    p.draw()

    for event in pygame.event.get():
        pass

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            b.shoot()
我观察到,如果我移除
shoot()
函数末尾的递归
shoot()
,它会运行,但只要按住空格,项目符号就会保持在同一位置(正如预期的那样,递归被移除)。我如何解决这个问题?谢谢

严格来说,shot
不是一个函数。它是一个实例方法,必须从
bullet
对象调用。你需要使用

self.shoot()
用于递归

然而,这是一种让子弹移动的糟糕方法。这是一个循环的工作。当你用问题的较小版本调用例程时,最好使用递归;这只是一个延续

    while self.shooting == True:
        self.x = (p.x + 60)
        self.y = (p.y + 25)
        self.x += self.speed
        self.y += self.speed
        pygame.draw.circle(d, (0, 0, 0), (self.x, self.y), self.radius)
这就提出了一个问题,你打算如何停止移动子弹。你需要像这样的东西

        self.shooting = (self.x <= x_limit) and \
                        (self.y <= y_limit)

self.shooting=(self.x我认为您必须将递归调用
shoot()
替换为
self.shoot())
shoot
方法中。这应该可以解决问题,并为您提供所需的递归函数。

刚刚尝试过这样做,但仍然出现错误:递归错误:中超过了最大递归深度comparison@hippozhipos这是一个完全不同的错误,与你的第一个错误无关。@Hippohipos:那是b因为你没有退出递归逻辑——请看这个答案的第二部分。下面的其他人已经给出了为什么会出现这个错误的答案。我只想指出,这里的递归设计可能不是你想要的,最终会耗尽堆栈空间,因为它是一个无限递归循环。看一看在pygame sprite对象中,
update()
function.Python不是,
this
不是实例方法的隐式作用域。
        self.shooting = (self.x <= x_limit) and \
                        (self.y <= y_limit)