2016-05-14 9 views
0

私はPythonの単なる初心者です。私は別のリストの中からリストの1つを削除するときにいくつか問題があるようです。リスト内にリストが1つしかない場合は、コードは完璧に機能しますが、リスト内に2つのリストがある場合、そのうちの1つを削除するとプログラムがクラッシュします。Python:リスト内のリストを削除すると、IndexError:リストのインデックスが範囲外になります

import pygame 
import math 

pygame.init() 

BLACK = ( 0, 0, 0) 
WHITE = (255, 255, 255) 
GREEN = ( 0, 255, 0) 
RED  = (255, 0, 0) 
BLUE  = ( 0, 0, 255) 

PI = math.pi 

size = (700, 500) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Arcade game!") 

background_image = pygame.image.load("bg_one.jpg").convert() 
player_image = pygame.image.load("player.png").convert() 
player_image.set_colorkey(BLACK) 

click_sound = pygame.mixer.Sound("laser5.ogg") 

done = False 

clock = pygame.time.Clock() 

bullets = [] 

def create_bullet(mpos): 
    bullets.insert(len(bullets), [mpos[0]+50, mpos[1]]) 

while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     elif event.type == pygame.MOUSEBUTTONDOWN: 
      click_sound.play() 
      create_bullet(pygame.mouse.get_pos()) 

    screen.fill(BLACK) 
    # Hide mouse, etc. 
    pygame.mouse.set_visible(False) 
    # Game Logic 
    player_position = pygame.mouse.get_pos() 
    x = player_position[0] 
    y = player_position[1] 
    if not len(bullets) <= 0: 
     for i in range(len(bullets)): 
      if bullets[i][1] < 0: 
       print (bullets) 
       bullets.remove(bullets[i]) 
       print (bullets) 
      else: 
       bullets[i][1] -= 5  
    # Drawing code goes here 
    screen.blit (background_image, [0, 0]) 
    for i in range(len(bullets)): 
     pygame.draw.ellipse(screen, GREEN, [bullets[i][0], bullets[i][1], 4, 4]) 
    screen.blit (player_image, [x, y]) 

    pygame.display.flip() 

    clock.tick(60) 

print(bullets) 
pygame.quit() 

EDIT:エラーを含めるのを忘れました。ここには

Traceback (most recent call last): 
    File "main.py", line 52, in <module> 
    bullets.remove(bullets.index(i)) 
ValueError: 0 is not in list 
+0

をあなたは申し訳ありませんが、エラーメッセージ – PyNEwbie

+0

@PyNEwbieを共有する必要があります。私はちょうどそれを追加した。 –

+1

あなたのエラーメッセージ 'bullets.remove(bullets.index(i))'はソースコード行 'bullets.remove(bullets [i])'と一致しません。 –

答えて

1

私はあなたの問題を見る。ここで、

for i in range(len(bullets)): 
     if bullets[i][1] < 0: 
      print (bullets) 
      bullets.remove(bullets[i]) 
      print (bullets) 

配列["a"、 "b"]があるとします。私はこの配列を繰り返し、両方の要素を削除したい。 「」インデックス0であり、そして「b」は今、インデックス1であり、私は

array.remove(array[0]) 

は今、私の配列は、ちょうど[「B」]が含ま

で、「」アレイから削除します。しかし、今や "b"はインデックス0にある。しかし、今はあなたはもはや存在しない配列の要素1にアクセスしようとしています。

問題は、配列内のすべての要素を順番に調べようとしていることですが、配列中の要素も削除しています。つまり、配列にインデックスを作成しようとしていて、元の配列よりも短くなり、すべてのインデックスが変化しています。

は、代わりにこのコードを試してみてください。

bulletsToRemove = [] 

if not len(bullets) <= 0: 
    for i in range(len(bullets)): 
     if bullets[i][1] < 0: 
      bulletsToRemove.append(bullets[i]) 
     else: 
      bullets[i][1] -= 5  

for bullet in bulletsToRemove: 
    bullets.remove(bullet) 
関連する問題