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

Pygame绘制历史矩形时颜色不匹配问题求助

问题

使用Pygame 2.5与Python 3.11.4,能够绘制带有历史位置的后续矩形,但无法为后续矩形匹配对应历史颜色。bodycolor列表存储了所有历史颜色元组,数据如下:

[]
[(32, 0, 0)]
[(64, 0, 0), (32, 0, 0)]
[(96, 0, 0), (64, 0, 0), (32, 0, 0)]
[(128, 0, 0), (96, 0, 0), (64, 0, 0), (32, 0, 0)]
[(160, 0, 0), (128, 0, 0), (96, 0, 0), (64, 0, 0), (32, 0, 0)]

body列表存储着类似的历史位置数据,按预期每个历史矩形应对应不同的红色值,但实际输出不符合预期,相关代码如下:

import pygame

pygame.init()

size = (512,512)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
sx,sy = size
cursor = (-64,0, 32,32)
dx = 0
dy = 0
body = []
color = (0,0,0)
bodycolor = []

run = True
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False


    bodycolor.insert(0, color)
    bodycolor.pop()
    body.insert(0, cursor)
    body.pop()
    ##print(bodycolor)
    

    dy += 32
    cursor = (dx, dy, 32,32)
    color = (dy%255,dx%255,0)

    screen.fill('black')
        
    cursorr = pygame.draw.rect(screen, 'white', cursor, 1)
    for c in bodycolor:
        for b in body:
            pygame.draw.rect(screen, c, b)
        
    if cursorr.bottom >= sy:
        dy = -32
        dx += 32
        

    bodycolor.append(color)
    body.append(cursor)
    

    pygame.display.update()
    clock.tick(32)
pygame.quit()

原因与修复

问题根源

  1. 双重循环导致颜色覆盖:你用嵌套循环遍历bodycolor和body,这会让每个颜色都绘制所有历史位置的矩形,后面的颜色会覆盖前面的,最终所有历史矩形都显示最后一个颜色。
  2. 无效的列表操作:代码开头的insert(0, ...)和pop()完全多余——初始列表为空时pop()会报错,后续列表有元素时,这两步是先插入再删除,等于没有任何实际作用。

修复方案

  1. 删除无意义的bodycolor.insert(0, color)、bodycolor.pop()、body.insert(0, cursor)、body.pop()四行代码。
  2. 用zip()函数并行遍历bodycolor和body,让颜色与位置一一对应绘制。

修复后的完整代码

import pygame

pygame.init()

size = (512,512)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
sx,sy = size
cursor = (-64,0, 32,32)
dx = 0
dy = 0
body = []
color = (0,0,0)
bodycolor = []

run = True
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False

    dy += 32
    cursor = (dx, dy, 32,32)
    color = (dy%255,dx%255,0)

    screen.fill('black')
        
    cursorr = pygame.draw.rect(screen, 'white', cursor, 1)
    # 并行遍历颜色与位置,一一对应绘制
    for c, b in zip(bodycolor, body):
        pygame.draw.rect(screen, c, b)
        
    if cursorr.bottom >= sy:
        dy = -32
        dx += 32
        
    bodycolor.append(color)
    body.append(cursor)
    
    pygame.display.update()
    clock.tick(32)
pygame.quit()

修改后,每个历史位置的矩形都会匹配对应的历史颜色,符合预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:19