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
相关产品推荐
相关产品推荐

