Pygame用元组列表存储方块颜色绘制棋盘出现黑屏问题求助
问题排查与解决方案
你怀疑的colour = con.BOARD_COLOURS[((r+c) % 2)]这行逻辑本身是正确的,可以正常生成交替颜色索引,黑屏是其他代码逻辑错误导致的,具体问题和修复方案如下:
核心错误点
- 初始化顺序错误:必须先执行
pg.init()初始化Pygame所有模块,再调用pg.display.set_mode()创建显示窗口,你当前的顺序反过来会导致渲染功能失效 - 缺少画面刷新逻辑:Pygame的所有绘制操作默认在后台缓冲区执行,绘制完成后需要调用
pg.display.update()或者pg.display.flip()才能把内容同步到实际显示的窗口上,缺少这步就会一直显示黑屏 - 常量引用错误:你定义的常量没有挂载到
con对象/模块下,直接用con.XXX调用会触发名称错误,如果是把常量单独放在con.py文件里需要先导入,否则直接去掉con.前缀直接引用常量即可 - 非必要重复创建对象:不需要在游戏主循环里每次都新建
Board实例,放在循环外部创建一次即可
修正后可运行代码
常量与依赖导入
import pygame as pg # RGB colours BOARD_COLOURS = [(245, 222, 179),(34, 139, 34)] # Dimensions ROWS = 8 COLS = 8 DIMS = 600 SQUARE = 600 // 8
Board类实现
class Board: def __init__(self): pass def drawBoard(self, screen): for r in range(ROWS): # 列循环改为用COLS更符合逻辑,原代码用ROWS也能运行因为值都是8 for c in range(COLS): colour = BOARD_COLOURS[((r+c) % 2)] pg.draw.rect(screen, colour, pg.Rect(c*SQUARE, r*SQUARE, SQUARE, SQUARE))
主函数实现
def main(): t = 60 clock = pg.time.Clock() # 先初始化pygame再创建窗口 pg.init() interface = pg.display.set_mode((DIMS, DIMS)) run = True # Board实例只创建一次 b = Board() while run: clock.tick(t) for ev in pg.event.get(): if ev.type == pg.QUIT: run = False b.drawBoard(interface) # 刷新屏幕显示 pg.display.flip() pg.quit() if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者dextrin
相关产品推荐
相关产品推荐

