Pygame中for循环多次blit图像无效,仅显示一次wPawn
问题修复:Pygame重复绘制棋子仅显示一次
核心问题分析
- 坐标重置错误:循环内每次都将
xPos设为2.5,导致所有棋子都绘制在同一位置,互相覆盖,最终仅能看到一个棋子。 - 屏幕刷新时机错误:循环内频繁调用
pg.display.flip(),不仅无意义还浪费性能,应在所有绘制操作完成后统一刷新屏幕。 - 路径转义隐患:Windows系统中路径的
\会被识别为转义字符,可能导致图片加载失败,建议改用/或\\。 - 主循环无事件处理:仅靠
while True: pg.display.update()会导致程序无法响应关闭等操作,必须添加事件处理逻辑。
修复后的完整代码
import pygame as pg # 初始化Pygame pg.init() size = [480, 480] display = pg.display.set_mode(size) pg.display.set_caption("Chess Demo") # 颜色定义 white = (255, 255, 255) # 加载棋盘和棋子资源 board = pg.image.load("Chess/ChessBoard810.png").convert_alpha() # 改用/避免转义问题,或者用"Chess\\ChessBoard810.png" # 初始化棋子字典并加载图片 pieces = {} piece_names = ["wPawn", "wRook", "wKnight", "wBishop", "wQueen", "wKing", "bPawn", "bRook", "bKnight", "bBishop", "bQueen", "bKing"] for name in piece_names: pieces[name] = pg.image.load(f"Chess/{name}.png").convert_alpha() # 主游戏循环 running = True while running: # 处理事件 for event in pg.event.get(): if event.type == pg.QUIT: running = False # 绘制背景和棋盘 display.fill(white) display.blit(board, (0, 0)) # 横向绘制8个白兵 y_pos = 360 x_pos = 2.5 for _ in range(8): display.blit(pieces["wPawn"], (x_pos, y_pos)) x_pos += 60 # 每次循环后增加x坐标 # 统一刷新屏幕 pg.display.flip() # 退出Pygame pg.quit()
关键修改说明
- 将
xPos的初始化移到循环外,确保每次循环时x_pos在上一次的基础上递增60。 - 所有绘制操作放在主循环内,每次循环先填充背景再重新绘制所有元素,避免画面残留。
- 添加事件处理逻辑,确保程序可以正常关闭。
- 改用
/作为路径分隔符,避免转义问题。 - 移除了不必要的
time模块和空的menu函数,简化代码结构。
内容的提问来源于stack exchange,提问作者RX400
相关产品推荐
相关产品推荐

