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

Pygame运行国际象棋代码时仅显示黑屏,求调试帮助

Pygame国际象棋黑屏问题修复

问题根源

  1. 主游戏函数未执行:代码定义了main_one_agent游戏核心函数,但全程没有调用它,最后仅保留了一个空的退出事件循环,导致游戏逻辑完全没启动,窗口只显示默认黑屏。
  2. 缩进错误:游戏结束判断if BOARD.outcome() != None:缩进在while循环外,无法在对局结束时触发退出逻辑。
  3. 棋子图片路径错误:白骑士('N')和白国王('K')都指向了wK.png,会导致骑士图片加载异常。
  4. 事件处理不完整:仅在人类回合处理窗口退出事件,AI回合时点击关闭按钮无响应,窗口假死。
  5. 初始化顺序错误:pygame.init()应该在创建窗口pygame.display.set_mode()之前调用,否则可能导致显示初始化异常。

修复步骤

  • 调用main_one_agent函数,传入棋盘实例、代理函数(这里提供一个随机走子的简单代理)和代理颜色。
  • 将游戏结束判断代码缩进至while循环内部,确保每帧都检查对局状态。
  • 修正白骑士的图片路径为wN.png。
  • 在AI回合加入事件处理逻辑,保证窗口随时响应退出操作。
  • 调整pygame.init()到创建窗口之前。

修正后的完整代码

# 导入所需库
import pygame
import sys
import chess
import math
import os
import random

os.chdir('/Users/stella/Desktop/comp sci NEA/ChessGame/images')

# 初始化Pygame
pygame.init()

# 设置窗口尺寸
X = 800
Y = 800
scrn = pygame.display.set_mode((X, Y))

# 定义基础颜色
WHITE = (255, 255, 255)
GREY = (128, 128, 128)
YELLOW = (204, 204, 0)
BLUE = (50, 255, 255)
BLACK = (0, 0, 0)

# 初始化棋盘
b = chess.Board()

# 加载棋子图片
pieces = {
    'p': pygame.image.load('bp.png').convert(),
    'n': pygame.image.load('bN.png').convert(),
    'b': pygame.image.load('bB.png').convert(),
    'r': pygame.image.load('bR.png').convert(),
    'q': pygame.image.load('bQ.png').convert(),
    'k': pygame.image.load('bK.png').convert(),
    'P': pygame.image.load('wp.png').convert(),
    'N': pygame.image.load('wN.png').convert(),  # 修复:白骑士图片路径
    'B': pygame.image.load('wB.png').convert(),
    'R': pygame.image.load('wR.png').convert(),
    'Q': pygame.image.load('wQ.png').convert(),
    'K': pygame.image.load('wK.png').convert(),
}

def update(scrn, board):
    '''根据棋盘状态更新画面'''
    # 绘制棋盘格子(黑白交替)
    for i in range(64):
        row = i // 8
        col = i % 8
        color = WHITE if (row + col) % 2 == 0 else GREY
        pygame.draw.rect(scrn, color, pygame.Rect(col*100, 700-row*100, 100, 100))
    
    # 绘制棋子
    for i in range(64):
        piece = board.piece_at(i)
        if piece:
            scrn.blit(pieces[str(piece)], ((i%8)*100, 700-(i//8)*100))
    
    # 绘制棋盘网格线
    for i in range(1, 8):
        pygame.draw.line(scrn, BLACK, (0, i*100), (800, i*100), 2)
        pygame.draw.line(scrn, BLACK, (i*100, 0), (i*100, 800), 2)

    pygame.display.flip()

# 简单AI代理:随机走合法棋步
def random_agent(board):
    legal_moves = list(board.legal_moves)
    return random.choice(legal_moves)

def main_one_agent(BOARD, agent, agent_color):
    '''人机对战主函数,agent_color=True表示AI执白,False表示AI执黑'''
    # 设置窗口标题
    pygame.display.set_caption('Chess')
    
    index_moves = []
    moves = []  # 提前初始化变量,避免未定义报错
    status = True
    
    while status:
        # 处理全局事件(AI回合也能响应退出)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                status = False
                pygame.quit()
                sys.exit()
        
        # 更新画面
        update(scrn, BOARD)
        
        if BOARD.turn == agent_color:
            # AI回合:走棋后刷新背景
            BOARD.push(agent(BOARD))
        else:
            # 人类回合:处理鼠标点击
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    scrn.fill(BLACK)
                    pos = pygame.mouse.get_pos()
                    square = (math.floor(pos[0]/100), math.floor(pos[1]/100))
                    index = (7 - square[1])*8 + square[0]
                    
                    if index in index_moves:
                        # 执行选中的棋步
                        move = moves[index_moves.index(index)]
                        BOARD.push(move)
                        index_moves = []
                        moves = []
                    else:
                        # 显示选中棋子的合法走法
                        piece = BOARD.piece_at(index)
                        if piece:
                            all_moves = list(BOARD.legal_moves)
                            moves = [m for m in all_moves if m.from_square == index]
                            index_moves = [m.to_square for m in moves]
                            # 绘制可走格子高亮
                            for m in moves:
                                t = m.to_square
                                tx = 100*(t%8)
                                ty = 100*(7 - t//8)
                                pygame.draw.rect(scrn, BLUE, pygame.Rect(tx, ty, 100, 100), 5)
                            pygame.display.flip()
        
        # 检查游戏是否结束
        if BOARD.outcome() is not None:
            print(BOARD.outcome())
            print(BOARD)
            status = False

# 启动游戏:AI执黑(agent_color=False),人类执白
main_one_agent(b, random_agent, agent_color=False)

# 退出处理
pygame.quit()
sys.exit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:25:25