在我的Pong版本中,我无法找到“NoneType”错误的来源

时间:2014-05-29 14:10:55

标签: python python-2.7 pygame pong

我昨天在另一个热门网站上发布了一个Pong版本,并就如何清理它获得了很多建议,并得到了很多一般的提示。一个是所有坐标都应该是元组。

我整个上午一直在改写它以尝试改进它(特别是使用元组的东西),但是我在某处遇到了一个N​​oneType,这是我生命中找不到的。

  

追踪(最近一次通话):    文件“C:\ Users \ Jassie \ Desktop \ Pygame_Pong_v2.py”,第172行,in      my_ball.update()    更新中的文件“C:\ Users \ Jassie \ Desktop \ Pygame_Pong_v2.py”,第64行      self.pos =(self.pos [0] + self.vel [0],self.pos [1] + self.vel [1])   TypeError:'NoneType'对象没有属性' getitem '

def update(self):
    #Update ball's position
    self.pos = (self.pos[0] + self.vel[0], self.pos[1] + self.vel[1])
    self.pos_x = int(self.pos[0])
    self.pos_y = int(self.pos[1])

错误中引用了错误和代码位。

https://github.com/Jassie411/pong

如果有人可以看一看并帮助我,那么就会有完整代码的链接。我整个上午都看过代码(实际上是凌晨4点左右),查看初始速度元组的来源,初始位置元组的来源,以及它们的去向。我只是看不到NoneType的来源。我也试过完全改写它的一部分,但我自己也解决不了。

如果有人能帮我解决这个问题,我将非常感激。我知道在我过去之后,我可以简单地完成剩下的工作。但这个错误让我感到害怕。

编辑:对不起,我应该描述一下这种行为。我知道这是一个错误,位置或速度属性变为无,但我不知道它是什么,我不知道在哪里。

我所知道的是,它只会在球撞到排水沟或球拍时抛出错误。无论它击中哪个都无关紧要,无论哪种方式都会抛出同样的错误。当然我认为会在代码中检查碰撞,但我找不到它。

1 个答案:

答案 0 :(得分:1)

问题是spawn_ball功能:

def spawn_ball(direction = random.choice('01')):
    #direction should always be left if AI is enabled for paddle2.
    #0 is left, 1 is right
    if direction == 0:
        return (random.uniform(1.0, 3.0) * -1, random.uniform(1.0, 3.0) * -1)
    elif direction == 1:
        return (random.uniform(1.0, 3.0), random.uniform(1.0, 3.0) * -1)

首先,你不应该像这样初始化默认变量。创建函数对象时,random.choice('01')被计算一次。因此默认方向将始终相同。但导致错误的是0 != '0'。因此,当您在没有参数的情况下调用spawn_ball时,没有if语句匹配,函数返回None

这是正确的变体:

def spawn_ball(direction=None):
    if direction is None:
        direction = random.choice((0, 1))
    #direction should always be left if AI is enabled for paddle2.
    #0 is left, 1 is right
    if direction == 0:
        return (random.uniform(1.0, 3.0) * -1, random.uniform(1.0, 3.0) * -1)
    elif direction == 1:
        return (random.uniform(1.0, 3.0), random.uniform(1.0, 3.0) * -1)