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

Pygame开发Flappy Bird复刻版出现图形闪烁、管道偏移问题如何解决

这是代码逻辑错误导致的,和Pygame引擎本身无关,核心存在两个问题:

  1. 遍历pipes列表的同时执行删除操作,会导致遍历跳过部分元素。Python的for循环遍历列表是按索引依次取值,如果你遍历到索引为i的元素时将其删除,后续元素的索引会整体前移1位,下一轮循环会直接取索引i+1的元素,相当于跳过了原来索引为i+1、现在变为i的元素。被跳过的元素这一帧不会执行左移、渲染逻辑,就会出现偏移、闪烁的问题。
  2. 用pipes.index(pipe)判断管道上下朝向的逻辑不稳定,当列表有新增、删除操作时,原有管道的索引会发生变化,且如果列表存在坐标相同的管道,index方法只会返回第一个匹配元素的索引,会导致管道渲染颠倒,也是异常的诱因之一。

修复方案

1. 改造管道创建逻辑,直接存储管道对应的渲染资源,避免依赖索引判断朝向

def create_new_pipe(): 
    bottom_pipe_position = random.randrange(24+pipe_vertical_spacing, screenh-168)
    # 子列表第三个元素存储对应要渲染的管道图像
    pipes.extend([
    [screenw+pipe_horizontal_spacing, bottom_pipe_position, pipe_image], 
    [screenw+pipe_horizontal_spacing, bottom_pipe_position-320-pipe_vertical_spacing, pipe_image_flipped]])

2. 修改管道遍历逻辑,先收集待删除元素,遍历完成后再统一删除

# 先收集所有超出屏幕的待删除管道
to_remove = []
for pipe in pipes:
    if pipe[0] < -52:
        to_remove.append(pipe)
    else:
        pipe[0] -= 2
        # 直接读取预存的图像渲染,无需判断索引
        screen.blit(pipe[2], (pipe[0], pipe[1]))
# 遍历完成后统一删除失效管道
for pipe in to_remove:
    pipes.remove(pipe)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:51:03