如何解决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_right
和 walk_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 举报,一经查实,本站将立刻删除。