微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 错误使列表索引超出范围,但我不知道如何解决我是新手

如何解决Pygame 错误使列表索引超出范围,但我不知道如何解决我是新手

显示回溯(最近一次调用最后一次):

File "C:/Users/PC GAMER/Desktop/pygame sprite/oo.py",line 46,in <module>
   redrawGameWindow()
File "C:/Users/PC GAMER/Desktop/pygame sprite/oo.py",line 35,in redrawGameWindow
   win.blit(walk_right[walk_Count//3],(x,y))
IndexError: list index out of range

总的来说,我对 python 和 pygame 非常陌生,虽然我知道它想说的是我想要获取的列表中的项目不可用但我不明白这有什么问题如果可能的话,我真的不知道该怎么做,请解释如何解决这个问题,谢谢你花时间阅读这篇文章,因为我的英语不是很好,谢谢你的时间

import pygame
pygame.init()

Clock = pygame.time.Clock()
win = pygame.display.set_mode((500,500))
pygame.display.set_caption("Hello")

x = 100
y = 400
width = 64
height = 64
vel = 10

walk_right = [pygame.image.load("R1.png"),pygame.image.load("R2.png"),pygame.image.load("R3.png"),pygame.image.load("R4.png"),pygame.image.load("R5.png"),pygame.image.load("R6.png"),pygame.image.load("R7.png"),pygame.image.load("R8.png")]
walk_left = [pygame.image.load("L1.png"),pygame.image.load("L2.png"),pygame.image.load("L3.png"),pygame.image.load("L4.png"),pygame.image.load("L5.png"),pygame.image.load("L6.png"),pygame.image.load("L7.png"),pygame.image.load("L8.png")]
bg = pygame.image.load("bg.jpg")
char = pygame.image.load("standing.png")

left = False
right= False
walk_Count = 0
jump_count = 10
jump = False
run = True


def redrawGameWindow():
    global walk_Count

    if walk_Count + 1 >= 27:
        walk_Count = 0
    if left:
        win.blit(walk_left[walk_Count//3],y))
    elif right:
        win.blit(walk_right[walk_Count//3],y))
        walk_Count += 1
    else:
        win.blit(char,y))
    pygame.display.update()
    win.blit(bg,(0,0))



#Mainloop
while run:
    redrawGameWindow()

    Clock.tick(27)
    for event in pygame.event.get():


        if event.type == pygame.QUIT:
            run = False


    keys = pygame.key.get_pressed()


    if keys[pygame.K_RIGHT] and x < 450:
        right = True
        left = False
        x += vel

    elif keys[pygame.K_LEFT] and x > -10:
        x -= vel
        left = True
        right = False
    else:
        right = False
        left = False
        walk_Count = 0
    if not jump:
        if keys[pygame.K_SPACE]:
            left = False
            right = False
            jump = True
    else:
        if jump_count >= -10:
            neg = 1
            if jump_count < 0:
                    neg = -1

            y -= (jump_count ** 2) /2 * neg
            jump_count -= 1

        else:
            jump = False
            jump_count = 10

pygame.quit()

解决方法

可能是因为 walk_left[] 的大小是 8 而 26//3=8。数组的索引从 0 开始。 为了解决这个问题,替换 [walk_Count//3]->[walk_Count//3-1]

,

您可能忘记了列表索引从 0 开始,而不是从 1 开始。

您的变量 walk_Count 的最大值可以为 26,如下所示:

if walk_Count + 1 >= 27:
    walk_Count = 0

但是如果您看到这些行:

if left:
    win.blit(walk_left[walk_Count//3],(x,y))
elif right:
    win.blit(walk_right[walk_Count//3],y))
    walk_Count += 1

如果 walk_Count 的最大值为 26,则 walk_Count//3 的最大值为 8。 如果我们尝试访问 walk_righ[8]walk_left[8],则会报错,因为这些索引不存在。

解决这部分代码可以改(把27改成24):

if walk_Count + 1 >= 24:
    walk_Count = 0
,

walk_rightwalk_left 仅包含 8 个图像。因此,当 walk_Count 大于或等于 24 时,您必须重置 walk_Count + 1

def redrawGameWindow():
    global walk_Count

    if walk_Count + 1 >= 24:
        walk_Count = 0 

但是,我建议检查列表的长度。测试 walk_Count // 是否大于或等于列表的长度。列表的长度可以通过 len():

获得
def redrawGameWindow():
    global walk_Count

    if left:
        if walk_Count // 3 >= len(walk_left):
            walk_Count = 0
        win.blit(walk_left[walk_Count//3],y))
        walk_Count += 1
    
    elif right:
        if walk_Count // 3 >= len(walk_right):
            walk_Count = 0
        win.blit(walk_right[walk_Count//3],y))
        walk_Count += 1
    
    else:
        win.blit(char,y))

或者更普遍:

def redrawGameWindow():
    global walk_Count

    image_list = [char]
    if left:
        image_list = walk_left
    elif right:
        image_list = walk_right

    if walk_Count // 3 >= len(image_list):
        walk_Count = 0
    
    win.blit(image_list[walk_Count // 3],y))
    walk_Count += 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。