2011-12-21 8 views
5

Tôi đang cố gắng tạo văn bản nghệ thuật ascii cho một ứng dụng thú vị. Từ FIGLET, tôi nhận được mẫu ASCII. Tôi đang sử dụng mẫu đó trong câu lệnh printf để in chữ cái. Đây là một ảnh chụp màn hình của mô hình tôi nhận được từ FIGLET:Tạo văn bản nghệ thuật Ascii trong C

FIGLET

Dưới đây là đoạn mã tôi sử dụng để in A:

printf("  _/_/\n _/ _/\n _/_/_/_/\n _/ _/\n_/ _/\n"); 

Bây giờ, tôi có một văn bản đầu vào từ người dùng, và hiển thị nó trong nghệ thuật ASCII. Như tôi đã sử dụng printf, tôi chỉ có thể tạo ra nó theo chiều dọc:

Vertical image

Nhưng tôi cần phải làm nghệ thuật ASCII ngang. Làm thế nào để làm điều đó ?

Trả lời

2

Vâng, đây là một vấn đề nổi tiếng. Lần cuối cùng tôi giải quyết điều này là sử dụng một mảng cho mỗi dòng và hiển thị từng chữ cái một cách riêng biệt.

Thứ nhất, tôi sẽ đại diện cho từng chữ cái trong một mảng. Ví dụ: A của bạn sẽ là một cái gì đó như thế này: (. Trên thực tế một mảng 2D sẽ được sử dụng nơi mỗi chữ cái là một chỉ số khác nhau)

char* letter[8]; 
letter[0] = "  _/_/ "; 
letter[1] = " _/ _/"; 
etc. 

Các thực tế làm sẽ là trong một mảng là tốt, một cái gì đó dọc theo các dòng:

char * render [8];

và sau đó sử dụng nối để tạo mỗi dòng. Vòng lặp lồng nhau đơn giản nên thực hiện thủ thuật:

for each line, i to render (i.e the height of the letters) 
    for each letter, j 
     concatenate line i of letter j to the to char* i in the array 

Cuối cùng lặp lại mảng và in từng dòng. Trên thực tế, bạn có thể bỏ qua mảng kết xuất và chỉ cần in từng dòng mà không cần trả về dòng. Giống như sau nói đến cái tâm:

for each line, i to render : // (i.e the height of the letters) 
    for each letter, j { 
     output line i of letter j 
    } 
    output a carriage return 
} 

(C của tôi là một chút gỉ, từ đó là "giả" code Tuy nhiên, tôi nghĩ logic của tôi là âm thanh..)

+0

(Là một bên, bằng cách sử dụng ở trên làm cơ sở, bạn thực sự có thể tạo tệp phông chữ ascii-nghệ thuật và tải chúng vào mảng khi cần.) –

+0

Cảm ơn, tôi nghĩ rằng tôi đã có ý tưởng ... Hãy để tôi dùng thử ... – utsabiem

+0

Đã sử dụng mảng 2D ... nhưng phải đối mặt với một số vấn đề trong không gian đệm .. hy vọng tôi sẽ giải quyết nó sớm .. – utsabiem

1

Thay vì in một toàn bộ ký tự tại một thời điểm dưới dạng một chuỗi, chia các ký tự thành nhiều chuỗi - một cho mỗi dòng văn bản tạo nên ký tự. Sau đó in dòng đầu tiên của mỗi ký tự, dòng mới, sau đó dòng thứ hai của mỗi ký tự, v.v. Bạn sẽ cần phải dán các dòng có dấu cách để đảm bảo chúng có chiều rộng phù hợp.

1

Thật tuyệt khi thấy bạn thích Figlet. Widget Figlet mà bạn đang hiển thị thực sự chứa một công cụ dòng lệnh để tạo ra đầu ra ASCII. http://www.figlet.org/ Nó cũng có thể dễ dàng được cài đặt với brew http://mxcl.github.com/homebrew/.

Giả sử bạn có thể dễ dàng nắm bắt đầu ra của nó từ bên trong chương trình của riêng bạn theo popen(..) hoặc tương tự.

2

Bạn có thể thử một cái gì đó như sau:

LƯU Ý: Rõ ràng, sau đây thiếu trong rất nhiều những thứ như bộ nhớ de-phân bổ, kiểm tra lỗi, mã không đầy đủ, vv Ý tưởng là để cung cấp cho bạn một gợi ý !

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

#define ROW 4 
#define COL 8 
#define CHAR_INDEX_MAX 26 

enum alph_enum {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z}; 

typedef struct _alphabets { 
    char *line[ROW]; 
}alphabet; 

alphabet chars[26]; 

init_a(enum alph_enum letter) 
{ 
    int i; 
    for (i=0 ; i<ROW ; i++) { 
     chars[letter].line[i] = (char *) malloc(COL); 
     if (chars[letter].line[i] == NULL) { 
      printf("memory allocation failed \n"); 
      return; 
     } 
    } 

    switch (letter) { 
            /**/ 
    case H: 
     strcpy(chars[letter].line[0], "|  |"); 
     strcpy(chars[letter].line[1], "|_______|"); 
     strcpy(chars[letter].line[2], "|  |"); 
     strcpy(chars[letter].line[3], "|  |"); 
     break; 
    case E: 
     strcpy(chars[letter].line[0], "|-------"); 
     strcpy(chars[letter].line[1], "|_______"); 
     strcpy(chars[letter].line[2], "|  "); 
     strcpy(chars[letter].line[3], "|_______"); 
     break; 
    case L: 
     strcpy(chars[letter].line[0], "|  "); 
     strcpy(chars[letter].line[1], "|  "); 
     strcpy(chars[letter].line[2], "|  "); 
     strcpy(chars[letter].line[3], "|_______"); 
     break; 
    /* for all the other alphabets */ 
    } 

    return; 

} 

print_str(char word[]) 
{ 
    int i, j; 

    printf("\n"); 
    for (i=0; i<ROW; i++) { 
     for (j=0 ; j<strlen(word) ; j++) { 
      printf("%s", chars[word[j] % 'A'].line[i]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 

    return; 
} 


int main(void) 
{ 
    init_a(H); 
    init_a(E); 
    init_a(L); 
    /* print_str("HELLO"); */ 
    print_str("HELL"); 
    return 0; 

    /* free the memory for HEL here */ 
} 

Kết quả sẽ như sau:

> gcc test.c -o print 
> print 

|  ||-------|  | 
|_______||_______|  | 
|  ||  |  | 
|  ||_______|_______|_______ 

> 

TODO:

  • Bạn có thể kèm theo chữ số, ký tự đặc biệt (như, @, #, $, vv!), Trống không gian, có thể là tất cả các ký tự ASCII đều có ý nghĩa.
  • Bạn có thể hỗ trợ in đậm, in nghiêng, gạch dưới và nhấn mạnh cho các nhân vật
  • Bạn có thể hỗ trợ màu foreground và background
  • Bạn có thể hỗ trợ hoạt hình

Hope this helps!

+0

Cảm ơn, Hãy để tôi thử nó .. Tôi nghĩ Jaco Van đã nói về một ý tưởng tương tự. – utsabiem