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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:33:22