You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame贪吃蛇游戏出现IndexError: Invalid rect index错误求助

问题:Pygame贪吃蛇游戏IndexError错误排查

我在使用Pygame编写贪吃蛇游戏时,尝试实现蛇头无法移出屏幕边界的功能,对应代码位于第42行。运行时出现IndexError: Invalid rect index错误,该错误源于语句if key_press[pygame.K_LEFT] and snake.x - SPEED > 0:。我的IDE未标记该代码错误,谷歌搜索未找到相关解决方案,恳请告知代码问题所在。

完整出错代码:

#importing stuff

import pygame
from pygame.locals import QUIT

import random as ran


#defining variables

SNAKE_WIDTH = 50
SNAKE_HEIGHT = 50

FPS = 60

GREEN = (0, 128, 0)
WHITE = (255, 255, 255)

SNAKE_HEAD_IMAGE = pygame.image.load('snake_head.png')
SNAKE_HEAD = pygame.transform.scale(SNAKE_HEAD_IMAGE, (SNAKE_WIDTH, SNAKE_HEIGHT))

WIDTH, HEIGHT = 500, 500
DIS = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Race")

SPEED = 3


#functions



#draw function

def draw_screen(snake):
    DIS.fill(WHITE)
    DIS.blit(SNAKE_HEAD, (snake.x, snake.y))
    pygame.display.update()

#movement function
def snake_movement(snake, key_press):
    if key_press[pygame.K_LEFT] and snake.x - SPEED > 0:
        snake.x -= SPEED

    if key_press[pygame.K_RIGHT] and snake.x + SPEED < 500:
        snake.x += SPEED

#main game loop
def main():

    snake = pygame.Rect(250, 300, SNAKE_HEIGHT, SNAKE_WIDTH) 
    
    clock = pygame.time.Clock()
    game_running = True

    while game_running:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_running = False


        key_press = pygame.key.get_pressed()
        snake_movement(key_press, snake)
        draw_screen(snake)

    pygame.quit()

if __name__ == "__main__":
    main()

错误原因

函数参数传递顺序完全颠倒:

  • 定义snake_movement时,参数顺序是(snake, key_press)
  • 但在main函数调用时,写成了snake_movement(key_press, snake)

这导致函数内部把键盘状态数组key_press当成了pygame.Rect对象处理。Pygame的Rect对象支持通过索引访问坐标(比如rect.x等价于rect[0]),当代码尝试访问snake.x时,实际是在对key_press数组用pygame.K_LEFT作为索引取值,超出了数组有效范围,因此触发IndexError: Invalid rect index。

修复后的完整代码

#importing stuff

import pygame
from pygame.locals import QUIT

import random as ran


#defining variables

SNAKE_WIDTH = 50
SNAKE_HEIGHT = 50

FPS = 60

GREEN = (0, 128, 0)
WHITE = (255, 255, 255)

SNAKE_HEAD_IMAGE = pygame.image.load('snake_head.png')
SNAKE_HEAD = pygame.transform.scale(SNAKE_HEAD_IMAGE, (SNAKE_WIDTH, SNAKE_HEIGHT))

WIDTH, HEIGHT = 500, 500
DIS = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Race")

SPEED = 3


#functions

#draw function
def draw_screen(snake):
    DIS.fill(WHITE)
    DIS.blit(SNAKE_HEAD, (snake.x, snake.y))
    pygame.display.update()

#movement function
def snake_movement(snake, key_press):
    if key_press[pygame.K_LEFT] and snake.x - SPEED > 0:
        snake.x -= SPEED

    if key_press[pygame.K_RIGHT] and snake.x + SPEED < WIDTH:
        snake.x += SPEED

#main game loop
def main():
    snake = pygame.Rect(250, 300, SNAKE_HEIGHT, SNAKE_WIDTH) 
    
    clock = pygame.time.Clock()
    game_running = True

    while game_running:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_running = False

        key_press = pygame.key.get_pressed()
        snake_movement(snake, key_press)  # 修复:调整参数顺序为(snake, key_press)
        draw_screen(snake)

    pygame.quit()

if __name__ == "__main__":
    main()

额外优化建议

  • 把边界判断中的魔法数字500替换为定义好的WIDTH常量,后续修改窗口尺寸时无需手动修改多处
  • 补充上下方向的边界判断逻辑,完善蛇的移动限制

内容的提问来源于stack exchange,提问作者Crystallaura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:27:45