Скорее всего, ваша проблема здесь:
for p in pipe.pipes:
if 0 - p.width < p.x < screen_width + 50:
p.x -= p.vel
else:
pipe.pipes.pop(pipe.pipes.index(p))
Вы выполняете итерацию по списку, и, повторяя его, вы удаляете из него элементы.
Возьмите этот пример, полученный изВаш код:
s = [1, 2, 3, 4, 5]
for i in s:
print(i)
s.pop(s.index(i))
Что вы ожидаете получить на выходе?Подсказка: это не будет 1 2 3 4 5
.
Чтобы исправить это, вы можете либо зациклить список, отследить в другом списке, какие элементы вы хотите удалить и удалить их после цикла, либо зациклить надскопируйте список и удаляйте элементы из оригинала каждый раз, когда вам нужно.
Кроме того, будет быстрее, если вы сохраните индекс удаляемого элемента.
Что-то вроде (не проверено!):
def move(self):
self.spawn()
index_to_remove = []
for i in range(len(pipe.pipes)):
if 0 - p.width < p.x < screen_width + 50:
p.x -= p.vel
else:
index_to_remove.append(i)
for index in index_to_remove:
del pipe.pipes[index]