2017-02-02 8 views
-2
arrows=[] 
badtimer=100 
badtimer1=0 
badguys=[[640,100]] 
healthvalue=196 

index=1 

for badguy in badguys: 
    if badguy[0]<-64: 
     badguys.pop(index) 
    badguy[0]-=7 
    index+=1 
for badguy in badguys: 
    screen.blit(badguyimg, badguy) 
# 6.3.1 - Attack castle 
    badrect=pygame.Rect(badguyimg.get_rect()) 
    badrect.top=badguy[1] 
    badrect.left=badguy[0] 
    if badrect.left<64: 
     healthvalue -= random.randint(5,20) 
     badguys.pop(index) 

дает мне ошибку:IndexError: поп индекс вне диапазона (питон) 3

Traceback (most recent call last): 
    File "C:\Users\Thinkpad\Desktop\BB_Resources\game.py", line 80, in <module> 
    badguys.pop(index) 
IndexError: pop index out of range 
+1

Первый цикл увеличивает 'index' до' len (badguys) ', и вы повторно используете эту переменную во втором цикле ... –

ответ

1

Ваша исходная задача является только то, что М. Фабр сказал: ваш индекс цикла действует через первую петлю, но не второй. Чтобы исправить это, просто установите index = 0 перед каждым циклом (помните, что Python запускает индексы в 0).

Тем не менее, у вас есть более глубокая проблема в ваших циклах: изменение badguys, в то время как вы повторяете этот список, повредит вам. Попробуйте этот тест некоторое время:

badguys = [0, 1, 2, 3, 4, 5, 6, 7] 
for i in badguys: 
    print "Before:", i, badguys 
    badguys.pop(i) 
    print "After: ", i, badguys 

Это MCVE за то, что вы делаете код. Вам нужно изменить свою работу, чтобы сохранить исходный список неповрежденным во время его прогона. Поверьте мне, ваша программа не имеет достаточного количества очков для достижения критического удара «индекс за пределами диапазона». :-)

я делаю вывод, что логика что-то вроде этого:

  1. Удалите плохой парень, который бежал мимо замка (положение < -64).
  2. Для любого плохого парня, который только что достиг замка, наносите 5-20 урона от HP и удаляйте этого плохого парня.

Я предлагаю два прохода для этого: один, чтобы нанести ущерб (используя оставил в качестве выражения для бокового положения)

if abs(left) <= 64: 
    # do damage 
    healthvalue -= random.randint(5,20) 
    # mark for deletion 
    left = -999 

... и второе, чтобы сделать новый список плохих ребята. Повторите этот список, оставив только те, которые все еще находятся на игровом поле:

badguys = [badguy if badguy.left > -64 for badguy in badguys] 

Неужели это избавит вас от неприятностей на данный момент?

+0

Я все еще смущен, где я должен добавить проходы. (Я новый программист, поэтому я не знаю, что я делаю: P) Спасибо за всю помощь :) –

+0

Замените свою текущую логику этими проходами. Для этого требуется небольшая реорганизация вашей блок-схемы (или любого используемого вами инструмента планирования предварительного кода). – Prune