Pygame绘制棋盘末尾两条线粗细设置不生效问题求解
Pygame棋盘末尾线条粗细异常修复
问题现象
- 基于Pygame绘制9格棋盘时,预设「索引为3的倍数的网格线使用4px粗线、其余网格线使用1px细线」的规则未正常生效,棋盘最右侧、最下方的两条网格线显示粗细异常,仅为正常粗线宽度的一半。
原始复现代码
import pygame, sys pygame.init() width, height = 750, 750 rows, cols = 9, 9 BLACK = (0,0,0) screen = pygame.display.set_mode((width, height)) screen.fill((255, 255, 255, 255)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False sys.exit() surf = pygame.Surface((600, 600)) surf.fill((255,255,255)) padding = surf.get_width()/9 for i in range(rows+1): if i % 3 == 0: thick = 4 else: thick = 1 pygame.draw.line(surf, BLACK, (0, i*padding), (width, i*padding), width=thick) pygame.draw.line(surf, BLACK, (i*padding, 0), (i*padding, height), width=thick) surf_center = ( (width-surf.get_width())/2, (height-surf.get_height())/2 ) screen.blit(surf, surf_center) pygame.display.update() pygame.display.flip()
错误原因
问题和你怀疑的if条件判断逻辑无关,是线条绘制坐标越界被裁剪导致的:
- 承载棋盘的
surf画布尺寸只有600×600,但绘制线条时传入的终点坐标用了顶层窗口的width、height(值为750),超出了surf的可绘制范围。 - Pygame绘制指定宽度的线条时,会以传入的坐标为中心线,向两侧各延伸「线宽/2」的像素。当循环到i=9时,网格线坐标刚好是
9*padding=600,也就是surf的右、下边界位置,此时4px粗的线会有2px宽度落在surf画布外面被自动裁掉,视觉上就比正常粗线细一半。 - 代码末尾同时调用
pygame.display.update()和pygame.display.flip()属于冗余操作,两个方法功能都是刷新屏幕,保留一个即可。
修复后代码
import pygame, sys pygame.init() width, height = 750, 750 rows, cols = 9, 9 BLACK = (0, 0, 0) # 给粗线预留边距,避免边缘线条被裁剪 board_size = 600 border_pad = 2 surf_size = board_size + border_pad * 2 screen = pygame.display.set_mode((width, height)) screen.fill((255, 255, 255)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False sys.exit() surf = pygame.Surface((surf_size, surf_size)) surf.fill((255, 255, 255)) padding = board_size / 9 for i in range(rows + 1): thick = 4 if i % 3 == 0 else 1 # 绘制横线,坐标偏移预留边距,终点限定在画布范围内 pygame.draw.line( surf, BLACK, (border_pad, border_pad + i * padding), (border_pad + board_size, border_pad + i * padding), width=thick ) # 绘制竖线,坐标偏移预留边距,终点限定在画布范围内 pygame.draw.line( surf, BLACK, (border_pad + i * padding, border_pad), (border_pad + i * padding, border_pad + board_size), width=thick ) surf_center = ( (width - surf.get_width()) / 2, (height - surf.get_height()) / 2 ) screen.blit(surf, surf_center) pygame.display.flip()
内容的提问来源于stack exchange,提问作者arshia mohammadi
相关产品推荐
相关产品推荐

