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

Pygame开发2048游戏:数字方块文字不对齐问题排查与修复

Pygame开发2048:数字方块文字不对齐问题解决

我用Pygame开发2048游戏时,发现所有数字方块内的文字均不对齐,不解决该问题无法安心。以下是核心代码部分(其余游戏运行逻辑暂不相关):

# Yes, I know my code is a mess.
import pygame
from pygame import *

COLORS = {"bg": (249, 246, 242),
          "subBG": (204, 192, 179),
          "0": (224, 212, 199),
          "2": (238, 228, 218),
          "4": (237, 224, 200),
          "8": (242, 177, 121),
          "16": (245, 149, 99),
          "32": (246, 124, 100),
          "64": (246, 94, 59),
          "128": (237, 207, 114),
          "256": (237, 204, 97),
          "512": (237, 200, 80),
          "1024": (237, 197, 63),
          "2048": (237, 194, 46),
          "other": (15, 15, 18),
          "light": (249, 246, 242),
          "dark": (119, 110, 101)}

pygame.init() 

X, Y = 1080, 950

window = pygame.display.set_mode((X, Y))
window.fill(COLORS["bg"])
pygame.display.set_caption('2048')
f = font.SysFont('clearsans-medium.ttf', 48)

running = True

while running:  
    colors = [[],[],[],[]]
    for row in range(4):
        for col in range(4):
            colors[row] += [COLORS[str(board[row][col])]]

    pygame.draw.rect(window, COLORS["subBG"], Rect(X/2-215, Y/2-215, 420, 420), border_radius= 8)
    row1 = [pygame.draw.rect(window, colors[0][0], Rect(X/2-200, Y/2-200, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[0][1], Rect(X/2-100, Y/2-200, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[0][2], Rect(X/2, Y/2-200, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[0][3], Rect(X/2+100, Y/2-200, 90, 90), border_radius= 8)]

    row2 = [pygame.draw.rect(window, colors[1][0], Rect(X/2-200, Y/2-100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[1][1], Rect(X/2-100, Y/2-100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[1][2], Rect(X/2, Y/2-100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[1][3], Rect(X/2+100, Y/2-100, 90, 90), border_radius= 8)]

    row3 = [pygame.draw.rect(window, colors[2][0], Rect(X/2-200, Y/2, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[2][1], Rect(X/2-100, Y/2, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[2][2], Rect(X/2, Y/2, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[2][3], Rect(X/2+100, Y/2, 90, 90), border_radius= 8)]

    row4 = [pygame.draw.rect(window, colors[3][0], Rect(X/2-200, Y/2+100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[3][1], Rect(X/2-100, Y/2+100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[3][2], Rect(X/2, Y/2+100, 90, 90), border_radius= 8),
            pygame.draw.rect(window, colors[3][3], Rect(X/2+100, Y/2+100, 90, 90), border_radius= 8)]
    for row in range(4):
        for col in range(4):
            gridRow = [row1, row2, row3, row4][row]
            if board[row][col] != 0:
                text = f.render(str(board[row][col]), True, COLORS['light' if board[row][col] >= 8 else 'dark'])
                textRect = text.get_rect(center= gridRow[col].center)
                window.blit(text, textRect)

    pygame.display.update()

编辑补充

board变量是一个多维列表:

board = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

编辑补充2

尝试更换字体(使用Calibri)但字体未变化:

f = font.SysFont('Calibri.ttf', 48)
txt = f.render("hdfahsj", True, COLORS['dark'])
window.blit(txt, (50, 70))

字体未变化的截图


问题原因

  1. 字体加载错误:pygame.font.SysFont()的第一个参数是系统字体的名称,不是带.ttf后缀的文件名。你写的'clearsans-medium.ttf'和'Calibri.ttf'都不符合要求,系统无法识别,Pygame会自动 fallback到默认字体(通常是freesansbold),这类默认字体的字符排版或边界计算有偏差,导致文字无法正确居中对齐。
  2. 你的文字居中逻辑本身是正确的,但错误的字体导致文本矩形的计算出现偏差,最终显示不对齐。

解决方法

1. 正确加载字体

有两种可靠的加载方式:

方式一:通过系统字体名称加载

如果目标字体已安装在系统中,直接使用字体名称:

# 加载Clear Sans Medium字体(系统需预先安装)
f = pygame.font.SysFont('Clear Sans Medium', 48)
# 或者加载Calibri字体
f = pygame.font.SysFont('Calibri', 48)

方式二:直接加载字体文件

如果系统未安装目标字体,将.ttf文件放在项目目录下,使用pygame.font.Font()加载:

# 直接加载项目目录下的clearsans-medium.ttf文件
f = pygame.font.Font('clearsans-medium.ttf', 48)

2. 验证字体加载是否成功

可以打印字体名称来确认是否加载到了目标字体:

print(f.get_name())

如果输出是你期望的字体名称(比如'Clear Sans Medium'或'Calibri'),说明加载成功;如果输出是'freesansbold',则说明之前的字体名称/路径有误。

3. 保持正确的居中逻辑

你当前的居中代码textRect = text.get_rect(center= gridRow[col].center)是正确的,只要字体加载正常,文字就能自动居中对齐。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:02:08