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

Pygame中for循环多次blit图像无效,仅显示一次wPawn

问题修复:Pygame重复绘制棋子仅显示一次

核心问题分析

  1. 坐标重置错误:循环内每次都将xPos设为2.5,导致所有棋子都绘制在同一位置,互相覆盖,最终仅能看到一个棋子。
  2. 屏幕刷新时机错误:循环内频繁调用pg.display.flip(),不仅无意义还浪费性能,应在所有绘制操作完成后统一刷新屏幕。
  3. 路径转义隐患:Windows系统中路径的\会被识别为转义字符,可能导致图片加载失败,建议改用/或\\。
  4. 主循环无事件处理:仅靠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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:31