Nie wiem czy to akurat to, ale te dwa miejsca się rzucają w oko:
for o in obstacles:
obstacles.remove(o)
for o in obstacles:
if o.x <= -o.width:
obstacles.remove(o)
obstacles.append(Obstacle(wid,wid/20))
points = points + 1
To raczej nie robi tego co myślisz. Przykład:
In [1]: a = [1, 2, 3, 4, 5, 6]
In [2]: for x in a:
...: a.remove(x)
...:
In [3]: a
Out[3]: [2, 4, 6]
W szczególności to pierwsze powinno dać się zastąpić przez zwykłe `obstacles.clear()`.