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

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('+-', '+-', '+-', '+-+'))

为什么这个方案有效?

  1. board里只存原始数据(单个字符或空格),字符串长度始终是1,{:2}格式化时会自动补一个空格,保证每个单元格占2个显示位置。
  2. 颜色转义序列只在显示时临时添加,终端处理转义序列时不会占用显示空间,只会改变字符颜色,所以对齐完全正常。

内容的提问来源于stack exchange,提问作者Harsh Darji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:35:25