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

Pygame操作列表时报ListIndex out of range错误原因咨询

报错根因

你触发越界错误的核心问题有3个:

  • 你的onelist初始化为空列表,没有提前为每一行创建对应的子列表,直接访问onelist[row]时必然触发索引越界
  • 你遍历行用的range(0,SCREEN_WIDTH, cell_width)生成的row值是0、5、10……995,直接拿这个值当onelist的下标使用,要求onelist长度至少要到996,但你从未给onelist插入过足够多的元素,自然触发越界
  • 插入值2和0时,你用的插入位置是len(onelist)(整个大列表的长度),而不是对应行子列表的长度len(onelist[行索引]),即使解决了前两个问题,这里也会触发子列表的越界

修复方案

首先要把行列的索引和实际坐标分开,不能拿坐标值直接当下标用,还要提前初始化列表结构,修复后的代码逻辑参考:

import pygame
import time
import random as rnd
from pygame.locals import *
pygame.init()
flags = SCALED | FULLSCREEN | DOUBLEBUF
SCREEN_HEIGHT = 500
SCREEN_WIDTH = 1000
resolution = (SCREEN_WIDTH, SCREEN_HEIGHT)
screen = pygame.display.set_mode(resolution, flags, 16)
# COLOR SCHEME
RED = (255, 0, 0)
BLUE = (100, 100, 255)
BLACK = (0, 0, 0)
clock = pygame.time.Clock()
running = True
cell_width = 5
tick = 0
# 先计算总行数和总列数,提前初始化onelist结构
row_count = SCREEN_WIDTH // cell_width
col_count = SCREEN_HEIGHT // cell_width
onelist = [[] for _ in range(row_count)] # 提前给每一行创建空的子列表
while running:
    # 事件循环不能丢,不然窗口会无响应
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
    tick = tick+1
    screen.fill(BLUE)
    if tick ==1:
        # 遍历的i是行索引,row_x是实际的x坐标
        for i, row_x in enumerate(range(0,SCREEN_WIDTH, cell_width)):
            for col_y in range(0, SCREEN_HEIGHT, cell_width):
                # 单元格的宽高就是cell_width,不用再做除法计算
                square_coords = (row_x, col_y, cell_width, cell_width)
                rand_val = rnd.random()
                if rand_val < .6:
                    # append等价于insert到末尾,写法更简单
                    onelist[i].append(1)
                elif rand_val < .8:
                    onelist[i].append(2)
                else:
                    onelist[i].append(0)
    # 渲染逻辑和帧率控制
    pygame.display.flip()
    clock.tick(60)
pygame.quit()

其他注意点

  • 原代码里没有加pygame的事件循环,运行后窗口会直接处于未响应状态,修复后的代码已经补上
  • 原sqaure_coords里的宽高计算逻辑错误,按你的需求每个网格瓦片的大小就是cell_width*cell_width,直接用对应值即可
  • 同一个逻辑里不要连续多次调用rnd.random(),不然会出现三个判断条件都不满足的情况,提前存一次随机值就可以

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:48:05