2015-09-05 3 views
2

Я делаю программу, которая берет файл с ASCII художественным алфавитом и использует его для печати слов. Требуется 3 строки ввода. Ширина, высота и желаемое слово. Моя проблема заключается в том, что я могу сделать символы напечатаны на той же строке, они печатают один за другим, как так:Печать ASCII в той же строке

Height: 8 
Width: 9 
Text: TOP 
_________ 
\__ __/ 
    ) ( 
    | | 
    | | 
    | | 
    | | 
    )_( 
_______ 
( ___ ) 
| ( ) | 
| | | | 
| | | | 
| | | | 
| (___) | 
(_______) 
_______ 
( ____) 
| ( )| 
| (____)| 
| _____) 
| (  
|)  
|/  

Это мой код:

temp = [] 
hi = input('Height: ') 
wi = input('Width: ') 
tx = input('Text: ') 
fi = open("font.txt") 
for i in tx: 
    temp = cd[i] 
    var1 = int(temp[0]) 
    ra1 = (var1 * int(hi)) 
    ra1n = (ra1 + int(hi)) 
    temp = [] 
    fi = open("font.txt") 
    lines = fi.readlines() 
    print(''.join(lines[ra1:ra1n]),end='') 

font.txt выглядит следующим образом

_______ 
( ___ ) 
| ( ) | 
| (___) | 
| ___ | 
| ( ) | 
|) (| 
|/  \| 
______ 
( ___ \ 
| ( )) 
| (__//
| __ ( 
| ( \ \ 
|)___)) 
|/ \___/ 
_______ 
( ____ \ 
| ( \/ 
| |  
| |  
| |  
| (____/\ 
(_______/ 
______ 
( __ \ 
| ( \ ) 
| | ) | 
| | | | 
| | ) | 
| (__/ ) 
(______/ 
_______ 
( ____ \ 
| ( \/ 
| (__  
| __) 
| (  
| (____/\ 
(_______/ 
_______ 
( ____ \ 
| ( \/ 
| (__  
| __) 
| (  
|)  
|/  
_______ 
( ____ \ 
| ( \/ 
| |  
| | ____ 
| | \_ ) 
| (___) | 
(_______) 

|\  /| 
|) (| 
| (___) | 
| ___ | 
| ( ) | 
|) (| 
|/  \| 
_________ 
\__ __/ 
    ) ( 
    | | 
    | | 
    | | 
___) (___ 
\_______/ 
_________ 
\__ _/ 
    ) ( 
    | | 
    | | 
    | | 
|\_) ) 
(____/ 
_  
| \ /\ 
| \// 
| (_//
| _ ( 
| (\ \ 
|/\ \ 
|_/ \/ 
_  
(\  
| (  
| |  
| |  
| |  
| (____/\ 
(_______/ 
_______ 
(  ) 
|()() | 
| || || | 
| |(_)| | 
| | | | 
|) (| 
|/  \| 
_  
(( /| 
| \ (| 
| \ | | 
| (\ \) | 
| | \ | 
|) \ | 
|/ )_) 
_______ 
( ___ ) 
| ( ) | 
| | | | 
| | | | 
| | | | 
| (___) | 
(_______) 
_______ 
( ____) 
| ( )| 
| (____)| 
| _____) 
| (  
|)  
|/  
_______ 
( ___ ) 
| ( ) | 
| | | | 
| | | | 
| | /\| | 
| (_\ \ | 
(____\/_) 
_______ 
( ____) 
| ( )| 
| (____)| 
|  __) 
| (\ ( 
|) \ \__ 
|/ \__/ 
_______ 
( ____ \ 
| ( \/ 
| (_____ 
(_____ ) 
    ) | 
/\____) | 
\_______) 
_________ 
\__ __/ 
    ) ( 
    | | 
    | | 
    | | 
    | | 
    )_( 

|\  /| 
|) (| 
| | | | 
| | | | 
| | | | 
| (___) | 
(_______) 

|\  /| 
|) (| 
| | | | 
(( )) 
\ \_//
    \ / 
    \_/ 

|\  /| 
|) (| 
| | _ | | 
| |()| | 
| || || | 
|()() | 
(_______) 

|\  /| 
(\ /) 
\ (_)/
) _ ( 
/() \ 
(/ \) 
|/  \| 

|\  /| 
(\ /) 
\ (_)/
    \ / 
    ) ( 
    | | 
    \_/ 
_______ 
/___ ) 
\/ ) | 
    /) 
//
// 
/ (_/\ 
(_______/ 
+0

Вам нужно настроить свое мышление; вы должны печатать по строкам, а не по символу. – jonrsharpe

+0

Я подумал об этом, но попробую, чтобы я не мог придумать, как это сделать. Все, что я пробовал, было искаженным беспорядком. –

+1

Вместо того, чтобы писать первую (n-я) строку из одной буквы за раз, напишите первую (n-я) строку каждой буквы, разделенную некоторыми пробелами. Просто убедитесь, что ваш шрифт определяет все буквы одинаковой ширины (для правильного заполнения) и что вы добавляете, скажем, 5 пробелов всюду. – boxmein

ответ

1

Если ваш шрифт был правильно дополнен (все линии имеют одинаковую длину), вы можете использовать список списков, которые представляют собой матрицу строк и символов; Вы собираете только это в выходной, чтобы напечатать после обработки всех букв текста:

hi = int(hi) 
output = [[] for _ in range(hi)] 
with open("font.txt") as fi: 
    lines = fi.readlines() 

for character in tx: 
    offset = int(cd[character]) 
    start = offset * hi 
    end = start + hi 
    letter = lines[start:end] 
    for outputline, letterline in zip(output, letter): 
     outputline.append(letterline.rstrip('\n')) 

for line in output: 
    print(''.join(line)) 

Заметим, что вам нужно удалить символы новой строки включены в файл шрифта; вызов str.rstrip() позаботится об этом.

В качестве альтернативы, вы можете удалить все переводы строк при чтении файла:

with open("font.txt") as fi: 
    lines = fi.read().splitlines() 

Если шрифт не правильно проложенный, вам нужно, чтобы получить максимальную ширину любого данного символа первой и подушечки из остальные линии:

width = max(len(l) for l in lines[start:end]) 
letter = lines[start:end] 
for outputline, letterline in zip(output, letter): 
    outputline.append(letterline.rstrip('\n').ljust(width)) 
+0

♦ Это похоже на то, что я пробовал, но я не уверен, что здесь происходит: для выходной строки, строки в zip (вывод, буква): outputline.append (letterline)'. Я попробовал это, однако результат был почти идентичен другой попытке, которую я сделал, чтобы линии печатались один за другим, а не рядом друг с другом. –

+0

@ user5303899: Это сопоставляет списки в списке 'output' с каждой строкой шрифта. Итак, первая строка шрифтовой буквы с первым списком в 'output', затем вторая и т. Д. –

+0

@ user5303899: Итак, первая строка буквы T входит в первый список. То же самое делает первая строка буквы O, затем первая строка P. Когда вы печатаете эти строки в конце ('for line in output'), вы только печатаете первые строки букв вместе. То же самое для вторых строк и т. Д. –

1

Просто увидел этот вопрос немного поздно. Я случайно сделал что-то подобное, так это тоже может быть полезно:

import itertools 

def load_font(font_filename, width, height): 
    with open(font_filename, 'r') as figlet: 
     return [map(lambda x: x.rstrip('\n').ljust(width+1), character) for character in iter(lambda: list(itertools.islice(figlet, height)), [])] 

def figlet(font, text): 
    for line in zip(*[font[ord(letter)-65] for letter in text]): 
     print "".join(line) 

font = load_font('file.txt', 8, 8) 

figlet(font, "HELLO") 
figlet(font, "WORLD") 

Это будет отображать следующий вывод:

  _______ _  _  _______ 
|\  /|( ____ \(\  (\  ( ___ ) 
|) (|| ( \/| (  | (  | ( ) | 
| (___) || (__ | |  | |  | | | | 
| ___ || __) | |  | |  | | | | 
| ( ) || (  | |  | |  | | | | 
|) (|| (____/\| (____/\| (____/\| (___) | 
|/  \|(_______/(_______/(_______/(_______) 
      _______ _______ _  ______ 
|\  /|( ___ )( ____)(\  ( __ \ 
|) (|| ( ) || ( )|| (  | ( \ ) 
| | _ | || | | || (____)|| |  | | ) | 
| |()| || | | ||  __)| |  | | | | 
| || || || | | || (\ ( | |  | | ) | 
|()() || (___) ||) \ \__| (____/\| (__/ ) 
(_______)(_______)|/ \__/(_______/(______/ 

Параметр width также может быть использован для добавления дополнительных отступов.

Смежные вопросы