我昨天在另一个热门网站上发布了一个Pong版本,并就如何清理它获得了很多建议,并得到了很多一般的提示。一个是所有坐标都应该是元组。
我整个上午一直在改写它以尝试改进它(特别是使用元组的东西),但是我在某处遇到了一个NoneType,这是我生命中找不到的。
追踪(最近一次通话): 文件“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的来源。我也试过完全改写它的一部分,但我自己也解决不了。
如果有人能帮我解决这个问题,我将非常感激。我知道在我过去之后,我可以简单地完成剩下的工作。但这个错误让我感到害怕。
编辑:对不起,我应该描述一下这种行为。我知道这是一个错误,位置或速度属性变为无,但我不知道它是什么,我不知道在哪里。
我所知道的是,它只会在球撞到排水沟或球拍时抛出错误。无论它击中哪个都无关紧要,无论哪种方式都会抛出同样的错误。当然我认为会在代码中检查碰撞,但我找不到它。
答案 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)