簡體   English   中英

用Python制作鑽石ASCII藝術品

[英]Making diamond ASCII art with Python

我制作這顆鑽石時遇到了麻煩。 每當我使字符等於均勻長度時,結果都很好。 然而,當它是奇數時,只有鑽石的底部被弄亂了。 我一直在工作幾個小時,差不多完成了。 先謝謝您的幫助。

chars = 'ABCDEF'
length = len(chars)
string = ''
dots = (length*2 - 1)*2 - 1
for i in range(length):
    string1 = ''
    string += chars[i]
    length1 = len(string)
    for j in range(0, length1):
        if j % 2 != 0:
            string1 += chars[length -1 - j].center(3, '.')
        else:
            string1 += chars[length - 1 - j]
    for k in range(i - 1, -1, -1):
        if k % 2 != 0:
            string1 += chars[length - 1 - k].center(3, '.')
        else:
            string1 += chars[length - 1 - k]
    string1 = string1.center(dots, '.')
    print(string1)

string=''
for i in range(length - 1):
    string1 = ''
    string += chars[i]
    length1 = len(string)
    for j in range(length - 1 - i):
        if j % 2 != 0:
            string1 += chars[length - 1 - j]
        else:
            string1 += chars[length -1 - j].center(3, '.')
    for k in range(i + 2, length):
        if k % 2 != 0:
            string1 += chars[k].center(3, '.')
        else:
            string1 += chars[k]
    string1 = string1.center(dots, '.')     
    print(string1)

當char長度為奇數時

當字符長度均勻時

這是python。 您可以使用許多有用的字符串函數在少量代碼行中創建創造性的ASCII藝術。

一些最重要的將是str.joinstr.Xjust 我們還將使用chrord迭代字符范圍。

首先,定義一個處理填充的函數。

def pad(c1, c2, sep='.', field_width=10):
    out = sep.join(chr(x) for x in range(c2, c1, -1)).rjust(field_width, sep) # build the first part 
    return sep.join([out, chr(c1), out[::-1]])

第一行代碼將構建鑽石線的前半部分。 第二行連接前半部分的中心字母,以及上半部分的反轉版本。

接下來,確定范圍 - 您的鑽石將有多大。

start = 'A'
end = ...
field_width = (ord(end) - ord('A')) * 2 - 1

現在,你需要兩個獨立的環 - 一個用於上部鑽石,另一個用於下部鑽石。 兩次循環都在每次迭代時調用pad

for e in range(ord(end), ord(start), -1):
    print(pad(e, ord(end), '.', field_width))

for e in range(ord(start), ord(end) + 1):
    print(pad(e, ord(end), '.', field_width))

end = 'E'

........E........
......E.D.E......
....E.D.C.D.E....
..E.D.C.B.C.D.E..
E.D.C.B.A.B.C.D.E
..E.D.C.B.C.D.E..
....E.D.C.D.E....
......E.D.E......
........E........

end = 'F'

..........F..........
........F.E.F........
......F.E.D.E.F......
....F.E.D.C.D.E.F....
..F.E.D.C.B.C.D.E.F..
F.E.D.C.B.A.B.C.D.E.F
..F.E.D.C.B.C.D.E.F..
....F.E.D.C.D.E.F....
......F.E.D.E.F......
........F.E.F........
..........F..........

Seth Difley的回答探討了一種替代方法,包括建造鑽石的前半部分並將其反轉以獲得下半部分。 實際上,這種方法也可以用於這種解決方案,類似於:

lines = []
for e in range(ord(end), ord(start) - 1, -1):
    lines.append(pad(e, ord(end), '.', field_width))

for x in lines + lines[-2::-1]:
    print(x)

這也導致相同的輸出,並且更快。

策略:由於鑽石的上半部分由現有程序正確渲染,因此生成上半部分,然后通過反轉上半部分的線條生成下半部分。 build_diamond返回一個包含上半部分字符串的列表。 print('\\n'.join(string_list))打印上半部分。 bottom_of_diamond_string_list = list(reversed(string_list))[1:]從上半部分反轉字符串並用[1:]刪除中間字符串以獲取下半部分的字符串。 print('\\n'.join(bottom_of_diamond_string_list))打印下半部分。 測試並適用於5和6(偶數和奇數) chars長度。 如果需要,可以進行更多代碼清理。

chars = 'ABCDEF'
length = len(chars)

def build_diamond(length):
    dots = (length*2 - 1)*2 - 1
    string = ''
    string_list = []
    for i in range(length):
        string1 = ''
        string += chars[i]
        length1 = len(string)
        for j in range(0, length1):
            if j % 2 != 0:
                string1 += chars[length -1 - j].center(3, '.')
            else:
                string1 += chars[length - 1 - j]
        for k in range(i - 1, -1, -1):
            if k % 2 != 0:
                string1 += chars[length - 1 - k].center(3, '.')
            else:
                string1 += chars[length - 1 - k]
        string1 = string1.center(dots, '.')
        string_list.append(string1)
    return string_list

if __name__ == '__main__':
    string_list = build_diamond(length)
    print('\n'.join(string_list))
    bottom_of_diamond_string_list = list(reversed(string_list))[1:]
    print('\n'.join(bottom_of_diamond_string_list))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM