Pygame运行国际象棋代码时仅显示黑屏,求调试帮助
Pygame国际象棋黑屏问题修复
问题根源
- 主游戏函数未执行:代码定义了
main_one_agent游戏核心函数,但全程没有调用它,最后仅保留了一个空的退出事件循环,导致游戏逻辑完全没启动,窗口只显示默认黑屏。 - 缩进错误:游戏结束判断
if BOARD.outcome() != None:缩进在while循环外,无法在对局结束时触发退出逻辑。 - 棋子图片路径错误:白骑士('N')和白国王('K')都指向了
wK.png,会导致骑士图片加载异常。 - 事件处理不完整:仅在人类回合处理窗口退出事件,AI回合时点击关闭按钮无响应,窗口假死。
- 初始化顺序错误:
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
相关产品推荐
相关产品推荐

