Python终端字符着色致数独棋盘排版错乱问题求助
解决数独游戏着色后排版错乱的问题
问题根源是终端ANSI颜色转义序列被Python当成普通字符计算长度,但实际显示时这些序列不占位置。你把带转义序列的字符串存在了board单元格里,导致格式化时{:2}的宽度计算错误,原本应该占2个显示位置的单元格,因为转义序列的存在被Python误判为长字符串,破坏了对齐。
最简单的修复方案:分离数据与显示逻辑
不要把颜色转义序列存在board中,只在显示时给字符添加颜色,这样board里始终存原始的单个字符或空格,格式化宽度计算就不会出错。
步骤1:修改用户输入逻辑,只存原始字符
把输入处理部分的着色代码删掉,直接保存用户输入的字符:
# 原来的代码: # board[x][y] = PURPLE + val + NORMAL # 修改为: board[x][y] = val
步骤2:在显示函数中添加着色逻辑,统一格式化宽度
先全局定义颜色常量,然后在display_board里,对每个单元格判断是否需要着色(比如非空格字符),添加颜色后再用{:2}格式化所有单元格(确保每个单元格都占2个显示位置):
修改后的display_board函数:
# 全局定义颜色常量 PURPLE = "\033[0;35m" NORMAL = "\033[0m" def display_board(): print(' {:2}{:2}{:2}{:2}'.format(1, 2, 3, 4)) print(' {:2}{:2}{:2}{:3}'.format('+-', '+-', '+-', '+-+')) # 处理第1行单元格的颜色 c00 = PURPLE + board[0][0] + NORMAL if board[0][0] != ' ' else board[0][0] c01 = PURPLE + board[0][1] + NORMAL if board[0][1] != ' ' else board[0][1] c02 = PURPLE + board[0][2] + NORMAL if board[0][2] != ' ' else board[0][2] c03 = PURPLE + board[0][3] + NORMAL if board[0][3] != ' ' else board[0][3] print('{} {}{:2}{:2}{}{:2}{:2}{}'.format(1, '|', c00, c01, '|', c02, c03, '|')) # 处理第2行单元格的颜色 c10 = PURPLE + board[1][0] + NORMAL if board[1][0] != ' ' else board[1][0] c11 = PURPLE + board[1][1] + NORMAL if board[1][1] != ' ' else board[1][1] c12 = PURPLE + board[1][2] + NORMAL if board[1][2] != ' ' else board[1][2] c13 = PURPLE + board[1][3] + NORMAL if board[1][3] != ' ' else board[1][3] print('{} {}{:2}{:2}{}{:2}{:2}{}'.format(2, '|', c10, c11, '|', c12, c13, '|')) print(' {:2}{:2}{:2}{:3}'.format('+-', '+-', '+-', '+-+')) # 处理第3行单元格的颜色 c20 = PURPLE + board[2][0] + NORMAL if board[2][0] != ' ' else board[2][0] c21 = PURPLE + board[2][1] + NORMAL if board[2][1] != ' ' else board[2][1] c22 = PURPLE + board[2][2] + NORMAL if board[2][2] != ' ' else board[2][2] c23 = PURPLE + board[2][3] + NORMAL if board[2][3] != ' ' else board[2][3] print('{} {}{:2}{:2}{}{:2}{:2}{}'.format(3, '|', c20, c21, '|', c22, c23, '|')) # 处理第4行单元格的颜色 c30 = PURPLE + board[3][0] + NORMAL if board[3][0] != ' ' else board[3][0] c31 = PURPLE + board[3][1] + NORMAL if board[3][1] != ' ' else board[3][1] c32 = PURPLE + board[3][2] + NORMAL if board[3][2] != ' ' else board[3][2] c33 = PURPLE + board[3][3] + NORMAL if board[3][3] != ' ' else board[3][3] print('{} {}{:2}{:2}{}{:2}{:2}{}'.format(4, '|', c30, c31, '|', c32, c33, '|')) print(' {:2}{:2}{:2}{:3}'.format('+-', '+-', '+-', '+-+'))
为什么这个方案有效?
- board里只存原始数据(单个字符或空格),字符串长度始终是1,
{:2}格式化时会自动补一个空格,保证每个单元格占2个显示位置。 - 颜色转义序列只在显示时临时添加,终端处理转义序列时不会占用显示空间,只会改变字符颜色,所以对齐完全正常。
内容的提问来源于stack exchange,提问作者Harsh Darji
相关产品推荐
相关产品推荐

