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))

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

