打印具有相等字符间距python的2d列表

时间:2017-11-10 14:05:57

标签: python nested-lists

我正在制作一个国际象棋游戏,其中棋盘由2d阵列代表。然而,国际象棋棋子的宽度与空格的宽度不同,所以当我尝试像这样打印时它们会被取代:

♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖ 
♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 



   ♟           
♟ ♟   ♟ ♟ ♟ ♟ ♟ 
♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜

这是打印功能:

def print_board():
    y = ["♖", "♜", "♗", "♝", "♘", "♞", "♕", "♛", "♔","♚", "♙", "♟"," "]
    for i in range(8):
        tempListe = "".join(board[i])
        z=0
        for x in ["T","t","L","l","H","h","D","d","K","k","P","p","_"]:
            if x in tempListe:
                tempListe = tempListe.replace(x,y[z])
            z+=1
        for j in range(8):
            print("{0:2}".format(tempListe[j]),end="")
        print("")
print_board()

我尝试了许多不同的事情,但一切似乎都是一样的。如果没有碎片之间的空间变得太大,我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:1)

 T,t,L,l,H,h,D,d,K,k,P,p,_= "♖♜♗♝♘♞♕♛♔♚♙♟ "


board = [
[T,L,H,D,K,H,L,T],
[P,P,P,P,P,P,P,P],
[_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_],
[_,_,_,_,_,_,_,_],
[p,p,p,p,p,p,p,p],
[t,l,h,d,k,h,l,t]
]

board2 = [
T,L,H,D,K,H,L,T,
P,P,P,P,P,P,P,P,
_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,
_,_,_,_,_,_,_,_,
p,p,p,p,p,p,p,p,
t,l,h,d,k,h,l,t
]

def printBoard():
    for e in board:
        for ee in e:
            print(ee, end='')
        print()

代码可以继续使用另一种布局:

def printBoard2():
    b = "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}\n"\
        "{:2}{:2}{:2}{:2}{:2}{:2}{:2}{:2}".format(*board2)
    return b

board2[36] = p
board[4][3] = T
printBoard()

print("\n\n")

print(printBoard2())

最后输出是

第一个

♖♗♘♕♔♘♗♖
♙♙♙♙♙♙♙♙


   ♖    

♟♟♟♟♟♟♟♟
♜♝♞♛♚♞♝♜

第二种布局

♖ ♗ ♘ ♕ ♔ ♘ ♗ ♖ 
♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 


        ♟       

♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟ 
♜ ♝ ♞ ♛ ♚ ♞ ♝ ♜

在promt上它看起来是对齐的,但是这里(在html中)没有。 我会把它的图像放在下面。

enter image description here

答案 1 :(得分:0)

您试图在不使用水平制表符的情况下呈现表格数据(因为它会产生相当宽的列)。但是您的输出设备具有不同的空间宽度和象棋符号,因此使用空格将不起作用。如果这是一个等宽的文本,很可能你的显示设备回落到另一种字体,因为主要字体缺少棋子,这种差异将是宽度问题的根源。

有几个宽度的特殊spaces,包括数字宽度,但(据我所知),没有为chess symbols定义特定宽度。我的第一个想法是,如果它们可以与特别宽的空间结合,但Unicode似乎没有组合空间。这留下了两个基本选项:为此任务使用布局系统(如HTML表),或使用包含间距和国际象棋符号的等宽字体。后者最容易在您自己的终端中完成,或者可以使用webfont在您自己的网页上请求,但有许多地方您无法控制,包括单独的Web浏览器。尽管chess.stackexchange.com似乎有一个javascript棋盘渲染器(instructions),但Stack Overflow特别不允许在其Markdown中使用表。

另一个(丑陋的)解决方法是使用其他格式化功能在空白空间中渲染国际象棋棋子,但颜色使它们不可见。这对于那些具有自己颜色的字体不起作用,就像表情符号那样。它还会对屏幕阅读器或复制文本造成严重破坏。