2016-05-24 6 views
-1

私はコーディングが初めてで、最後の敵が殺された後にゲームがクラッシュする理由を理解するのに問題があります。私は学校のための私の最終的なプロジェクトのための宇宙侵略ゲームを作っています。今のところ、私は敵の一番上の列にそれほど頻繁に撃つように努力していましたが、一番上の行で最後の敵が殺されると、エラーコードが表示されます。私が理解するところでは、プログラムはそこにない敵のレーザーを取り除こうとしているのですが、エラーコード----> list.remove(x):xがリストにありません。再びなぜ最後の敵が殺された後にクラッシュするのですか?

for enemy in enemies: 
     for laser in lasers: 
      if laser.colliderect(enemy): 
       enemies.remove(enemy) 
       lasers.remove(laser) 

最初の敵、あなたのループの後が、レーザーが削除されています。助けてくださいあなた

def level1(): 

    # Images 
    bg = pygame.image.load('spacebackground.jpg') 

    bg = pygame.transform.scale(bg, (1024, 768)) 
    ship1 = pygame.image.load('ship1.png') 
    ship1 = pygame.transform.scale(ship1, (50, 50)) 
    life1 = pygame.image.load('ship1.png') 
    life1 = pygame.transform.scale(life1, (25, 25)) 
    life2 = pygame.image.load('ship1.png') 
    life2 = pygame.transform.scale(life2, (25, 25)) 
    enemy1 = pygame.image.load('enemy1.png') 
    enemy1 = pygame.transform.scale(enemy1, (50, 50)) 
    enemy2 = pygame.image.load('enemy2.png') 
    enemy2 = pygame.transform.scale(enemy2, (50, 50)) 
    points = 0 

    # Coordinates 
    enemy_x = 50 
    enemy_x2 = 50 
    enemy_x3 = 50 
    dx = 5 
    dx2 = 10 
    dx3 = 5 
    shipX = 462 
    shipY = 668 

    # Lists 
    enemies = [] 
    enemies_2 = [] 
    enemies_3 = [] 
    enemyLaser1 = [] 
    enemyLaser2 = [] 
    enemyLaser3 = [] 
    lasers = [] 

    # Appending enemies 
    for i in range(10): 
     enemies.append(pygame.Rect(enemy_x, 100, 50, 50)) 
     enemy_x += 65 
    for i in range(10): 
     enemies_2.append(pygame.Rect(enemy_x2, 150, 50, 50)) 
     enemy_x2 += 65 
    for i in range(10): 
     enemies_3.append(pygame.Rect(enemy_x3, 225, 50, 50)) 
     enemy_x3 += 65 

    # Game Loop 
    while True: 
     clock.tick(60) 

     # Laser Coordinates 
     laserX = shipX + 23 
     laserY = 658 

     # Event handling 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 
      # Creating lasers with space bar 
      if (pygame.key.get_pressed()[pygame.K_SPACE]) != 0 and len(lasers) < 3: 
       lasers.append(pygame.Rect(laserX, laserY, 5, 20)) 

     # Ship Rect 
     shipRect = pygame.Rect(shipX, shipY, 50, 50) 

     # Ship Controls 
     if (pygame.key.get_pressed()[pygame.K_RIGHT]) != 0: 
      shipX += 20 
     if (pygame.key.get_pressed()[pygame.K_LEFT]) != 0: 
      shipX += -20 

     # Removing enemies and lasers when collision 
     for enemy in enemies: 
      for laser in lasers: 
       if laser.colliderect(enemy): 
        enemies.remove(enemy) 
        lasers.remove(laser) 
        points += 5 
        break 
     for enemy_2 in enemies_2: 
      for laser in lasers: 
       if laser.colliderect(enemy_2): 
        enemies_2.remove(enemy_2) 
        lasers.remove(laser) 
        points += 10 
        break 
     for enemy_3 in enemies_3: 
      for laser in lasers: 
       if laser.colliderect(enemy_3): 
        enemies_3.remove(enemy_3) 
        lasers.remove(laser) 
        points += 5 
        break 

     # Moving laser 
     for laser in lasers: 
      laser.move_ip(0, -10) 

     # Removing laser when off screen 
     for laser in lasers: 
      if laser.y <= -20: 
       lasers.remove(laser) 

     # Keeping ship on screen 
     if shipX <= 0: 
      shipX = 0 
     if shipX >= 974: 
      shipX = 974 

     # Reversing direction when enemies reach boundary 
     if len(enemies) >= 1: 
      if enemies[0].x < 50: 
       dx = -dx 
      if enemies[-1].x > 924: 
       dx = -dx 
     if len(enemies_2) >= 1: 
      if enemies_2[0].x < 50: 
       dx2 = -dx2 
      if enemies_2[-1].x > 924: 
       dx2 = -dx2 
     if len(enemies_3) >= 1: 
      if enemies_3[0].x < 50: 
       dx3 = -dx3 
      if enemies_3[-1].x > 924: 
       dx3 = -dx3 

     # Move each enemy 
     for enemy in enemies: 
      enemy.x += dx 
     for enemy_2 in enemies_2: 
      enemy_2.x += dx2 
     for enemy_3 in enemies_3: 
      enemy_3.x += dx3 

     # Enemy Shooting 
     if len(enemies) >= 1: 
      randEnemy1 = random.randrange(len(enemies)) 
     if len(enemies_2) >= 1: 
      randEnemy2 = random.randrange(len(enemies_2)) 
     if len(enemies_3) >= 1: 
      randEnemy3 = random.randrange(len(enemies_3)) 

     if len(enemies) >= 0: 
      for enemy in enemies: 
       if enemy == enemies[randEnemy1] and len(enemyLaser1) < 3: 
        enemyLaser1.append(pygame.Rect(enemy.x + 22.5, 120, 5, 20)) 

     for enemyLaser in enemyLaser1: 
      enemyLaser.move_ip(0, 10) 
     if enemyLaser.y >= 769: 
      enemyLaser1.remove(enemyLaser) 

     # Drawing 
     screen.blit(bg, (0,0)) 
     for laser in lasers: 
      pygame.draw.rect(screen, red, laser) 
     for enemyLaser in enemyLaser1: 
      pygame.draw.rect(screen, red, enemyLaser) 

     screen.blit(ship1, shipRect) 
     for enemy in enemies: 
      screen.blit(enemy1, enemy) 
     for enemy_2 in enemies_2: 
      screen.blit(enemy2, enemy_2) 
     for enemy_3 in enemies_3: 
      screen.blit(enemy1, enemy_3) 
     font = pygame.font.SysFont("OCR A Extended", 30) 
     pointsFont = font.render("Points:"+ str(points), 1, red) 
     screen.blit(life1, (5,733)) 
     screen.blit(life2, (33,733)) 
     screen.blit(pointsFont, (5, 5)) 

     # Update Display 
     pygame.display.update() 
+0

古いデバッグを行う必要があります。まず、ログファイルを開いてオブジェクトをリストに追加したり削除したりしてメッセージを記録し、論理エラーをキャッチできるかどうかを確認することができます。また、pdbを使う必要があるかもしれません。あるいは少し面白いpudbを試すこともできます。 – rrauenza

答えて

0

に感謝これが問題です。クラスを作成し、それらを削除するのではなく、アクティブ/非アクティブに設定して後で削除するフラグを設定する必要があります。

関連する問題