2014-08-21 4 views
1

Вот мой код:(IndexError: индекс индекса за пределами диапазона) Мой цикл for дает мне ошибку?

import game, pygame, sys 
from gameobjects import * 
from imageloader import * 




def main(): 
    screen = pygame.display.set_mode((800, 600)) 
    background = Background("images/Nebula1.bmp", screen.get_width(), screen.get_height()) 
    letter1 = pygame.image.load("1.bmp") 
    letter2 = pygame.image.load("2.bmp") 
    letter3 = pygame.image.load("3.bmp") 
    letter4 = pygame.image.load("4.bmp") 
    letter5 = pygame.image.load("5.bmp") 
    letter6 = pygame.image.load("6.bmp") 
    letter7 = pygame.image.load("7.bmp") 
    letter8 = pygame.image.load("8.bmp") 
    letter9 = pygame.image.load("9.bmp") 
    letter10 = pygame.image.load("10.bmp") 
    Letters = [letter1, letter2, letter3, letter4, letter5, letter6, letter7, letter8, letter9, letter10] 
    letter = 0 

    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       sys.exit() 

     screen.blit(background.image, (0,0)) 

     for i in Letters: 
      screen.blit(Letters[letter], (330 + 14 * letter, 190)) 
      letter += 1 


     pygame.display.flip() 
All the items in the Letters list are pygame.Surfaces retrieved through using pygame.image.load(). Every time I run this code, I get an error that looks like this: 

    Traceback (most recent call last): 
     File "main.py", line 75, in <module> 
     main() 
     File "main.py", line 32, in main 
     screen.blit(Letters[letter], ((330 + 14 * letter, 190))) 
    IndexError: list index out of range 

Почему это происходит? Это кажется мне совершенно верным. Что я делаю не так? То, что я хочу сделать, - вставить каждую букву на экране с 14 пикселями от последней, потому что каждая из них имеет ширину 14 пикселей. Любая помощь? (Я новичок в python, поэтому, если я совершил туманную ошибку, простите меня.)

ответ

2

Для каждой итерации вы должны установить letter = 0. Поскольку его вне цикла while, буква инициализируется только значением 0. Затем он выдает IndexError, как на второй итерации for i in letters, так как letter теперь равен длине letters из-за последней итерации!

Используйте enumerate() безопасности и легко увеличивать:

for i,val in enumerate(Letters): 
     screen.blit(Letters[i], (330 + 14 * letter, 190)) 

или альтернативно, включать letter = 0 внутри время цикла:

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

    screen.blit(background.image, (0,0)) 

    letter = 0 
    for i in Letters: 
     screen.blit(Letters[i], (330 + 14 * letter, 190)) 
     letter += 1 
+0

Он побежал, но я столкнулся с другой проблемой. Когда я запускаю его, буквы на самом деле не печатаются на экране, они просто очень быстро скользят по нему ... Знаете ли вы, почему это может произойти? – number1son10

+0

Я не совсем понимаю, что вы имеете в виду. Поскольку это два разных вопроса, вы должны задать еще один вопрос о новой проблеме. Если мой ответ решает первую проблему, можете ли вы принять мой ответ? – agconti

+0

Что я имел в виду, так это то, что цикл for не выполняет то, что он должен был делать, вот что я хотел получить. Это был вопрос, потому что у меня все еще есть ошибка, просто не та же ошибка. – number1son10

 Смежные вопросы

  • Нет связанных вопросов^_^