2012-04-11 1 views
0

파이썬으로 작성된 작은 게임이 있습니다. 이전 질문을 본다면 "우주 침략자"클론입니다.random "ValueError : list.remove (x) : x 목록에 없음"파이 게임에서 오류가 발생했습니다.

잠시 동안 임의의 오류가 나타나는 것을 제외하고 거의 모든 것이 원활하게 실행됩니다. 이것은 완전히 무작위입니다. 일부 총알이 발사 된 후에 발생할 수 있으며, 전혀 발사되지 않을 수도 있습니다.

for bullet in bullets: 
     bullet.attack() 
     if bullet.posy<=-20: 
      bullet_draw=False 
     if bullet_draw==True: 
      bullet.draw() 
     for enemy in enemies: 
      if bullet.sprite.rect.colliderect(enemy.sprite.rect): 
       enemy.health-=1 
       bullets.remove(bullet) 
       bullet_draw=False 
      else: 
       bullet_draw=True 

는 때때로 나에게 다음과 같은 오류를 제공합니다 :

나는이 코드를 가지고있다.

Traceback (most recent call last): 
    File "\Programming\space invaders\space.py", line 280, in <module> 
    bullets.remove(bullet) 
ValueError: list.remove(x): x not in list 

이 오류는 완전히 무작위입니다. 비록 그것이 아니더라도, 나는 그 기원을 추적 할 수 없다. 그것을 제거하는 방법에 어떤 도움?

+1

일반적으로 오류를 포착하고 사후 디버거 ('import pdb; pdb.post_mortem()')를 사용하면 오류를 파악할 수 있습니다. 개발하는 동안 나는 일반적으로 프로그램의 진입 점 (entry point)에 대해 catch-all try-except 절을 사용하므로 예기치 않은 문제를 즉시 디버깅 할 수 있습니다. –

답변

3

총알이 여러 명의 적을 때립니다. 루프 enemies 개 중 break 개가 필요합니다.

+0

OP에서 반복되는 항목을 목록에서 제거하면 문제가 발생할 수도 있습니다. – DSM

+0

@DSM : 사실이지만, 다루기 쉽습니다. '총알 글 머리 기호 [:] : ' –

+0

완료! 그건 그렇고,'continue'는'bullet_draw = True'가'bullet in bullets' 바로 아래에 들여 쓰기 직후에 들어갑니다. – mechanicarts

4

다음로 변경합니다 : 하나의 총알이 호출 할 bullets.remove(bullet)을 야기 다수의 적을 타격 할 수 있기 때문에

for bullet in bullets[:]: # this is changed, iterating over a copy 
     bullet.attack() 
     if bullet.posy<=-20: 
      bullet_draw=False 
     if bullet_draw==True: 
      bullet.draw() 
     for enemy in enemies: 
      if bullet.sprite.rect.colliderect(enemy.sprite.rect): 
       enemy.health-=1 
       bullets.remove(bullet) 
       bullet_draw=False 
       break   # this is added, prevents multiple removes 
      else: 
       bullet_draw=True 

주에게 변화를 보여 내가 추가 한 두 의견의 break이 필요하다 두 번, 당신이보고있는 추적을 일으키는 중입니다.

반복 중에 목록에서 요소를 제거하면 반복 중에 일부 요소를 건너 뛸 수 있기 때문에 예기치 않은 결과가 발생할 수 있으므로 첫 번째 변경이 필요합니다. 목록 지수는 반복하는 동안 변경되기 때문에

이 목록에서 모든 요소를 ​​제거해야합니다 같은 코드가 보인다하더라도
>>> data = range(10) 
>>> for x in data: 
...  data.remove(x) 
... 
>>> data 
[1, 3, 5, 7, 9] 

, 그것은 단지 다른 모든 제거 : 다음 코드는이 보여줍니다.

관련 문제