Цикл Python for больше не начинается с 0 - PullRequest
0 голосов
/ 22 сентября 2018

Двигатель метода работает хорошо, пока элементы списка не организованы в другом порядке, чем прежде.В это время в mover метода переменная z получает 4, а затем цикл for (строка 39) считает от 1 до 4 вместо 0 до 3. Любая идея, как я могу это исправить?Я был бы очень рад, если бы кто-то смог решить этот вопрос.

import sys
import pygame
import random

screenx = 500
screeny = 800

go = True
speed = 0

playerx = 40
playery = 540

#zuerst xanfang dann xende
gap = [200,300,300,400,100,200]

coordx = [0,300,0,400,0,200]
coordy = [-250,-250,-250,-250,-250,-250]
length = [120,120,120,120,120,120]
width = [200,200,300,100,100,300]

loops = 2
z = 2

pygame.init()
screen = pygame.display.set_mode([screenx,screeny])
screen.fill((0,0,0))
clock = pygame.time.Clock()
imgmid = pygame.image.load("figurschwarz.png")

def drawer():
    for i in range(len(coordx)):
        pygame.draw.rect(screen, (230,10,60), (coordx[i],coordy[i],width[i],length[i]), 0)

def mover():
    global z,coordy
    if loops % 250 == 0 and z<len(coordx)-1:
        z = z+2
    for x in range(0,z):
        print (x)
        if coordy[x] <= screeny+10:
            coordy[x] += 2  
        else:
            z -= 2
            print ("pop")
            for s in range(2):
                for f in range(z):
                    print(f)
                    coordy[f] = coordy[f+1]
                print (coordy)
            coordy.pop(z+1)
            coordy.pop(z)
            print (coordy)



def collisiondetection():
    global go
    #player on the left or right wall
    if playerx <= 0 or playerx+40 >= screenx:
        go = False


while go == True:
    loops += 1
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed = -2
            if event.key == pygame.K_RIGHT:
                speed = 2
    screen.fill((0,0,0))
    playerx += speed
    screen.blit(imgmid, (playerx,playery))
    mover()
    drawer()
    collisiondetection()
    pygame.display.flip()
    clock.tick(110)

print ("Dein Score ist " + str(loops))

1 Ответ

0 голосов
/ 22 сентября 2018

Если вы поставите еще один print перед for циклом x

def mover():
global z,coordy
if loops % 250 == 0 and z<len(coordx)-1:
    print("loops = ".format(loops))
    z = z+2
print("range(0,z) = {}".format(range(0,z))) #<----Put this for debugging
for x in range(0,z):
    print ("x = {}".format(x))
    if coordy[x] <= screeny+10:  #<---------- Problem is here
        coordy[x] += 2  
    else:
        ...do something...

Вы получите следующий вывод непосредственно перед ошибкой индекса:

enter image description here

Вы можете видеть, что цикл фактически отсчитывает от 0, но условие if не выполняется, поэтому он печатает 'pop' внутри условия else.После этого он печатает еще один х.Так как предыдущее значение было 0, на этот раз оно печатает 1. И вы подумали, что x начинается здесь с 1, что не соответствует действительности.

Истинная причина ошибки индекса заключается в появлении последних 2значения из списка coordy, длина списка coordy составляет только 4. Однако диапазон значений x составляет от 0 до 5. Поэтому, когда x = 4, ваш coordy[4] пытается получить 5-й элемент изсписок, который не существует.Вот почему вы получаете ошибку индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...