2011-12-21 82 views
5

我正在嘗試爲有趣的應用程序生成ascii藝術文本。從FIGLET,我得到了ASCII模式。我在printf聲明中使用該模式來打印字母。下面是我從FIGLET得到了模式的截圖:在C生成Ascii藝術文本

FIGLET

這裏是代碼片段我用它來打印答:

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

現在,我從用戶輸入文字,用ASCII藝術展示它。當我用printf,我只能垂直生成它:

Vertical image

但我需要做的水平ASCII藝術。怎麼做 ?

回答

2

是的,這是一個衆所周知的問題。上次我解決這個問題的方法是爲每行使用一個數組,並分別渲染每個字母。

首先,我會代表數組中的每個字母。例如您的A將是這樣的:(實際上將被使用的二維陣列,其中每個字母是在不同的指數)

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

實際呈現將在陣列中,以及,沿線的東西:

char * render [8];

然後使用連接來構建每一行。一個簡單的嵌套for循環應該做的伎倆:

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 

最後循環,雖然數組和打印每一行。實際上,你可以跳過渲染數組,只需打印每一行而不用回車。像下面的東西浮現在腦海:

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是有點生疏,從那裏「僞」代碼不過,我覺得我的邏輯是合理的。)

+0

(作爲一個方面,使用上述作爲基礎,您可以實際構建ascii藝術字體文件並根據需要將它們加載到數組中。) –

+0

謝謝,我想我明白了...讓我試試看... – utsabiem

+0

它使用二維數組...但在空間填充面臨一些問題..希望我會盡快解決它.. – utsabiem

1

而不是打印一點整字符作爲一個字符串,將字符分成多個字符串 - 構成字符的每一行文本都有一個字符。然後打印每個字符的第一行,換行,然後打印每個字符的第二行等。您需要用空格填充行以確保它們都是正確的寬度。

1

很高興看到你喜歡Figlet。您顯示的Figlet小部件實際上包含一個生成ASCII輸出的命令行工具。 http://www.figlet.org/ 它也可以很容易地與brew http://mxcl.github.com/homebrew/一起安裝。

認爲您可以通過popen(..)或類似的方法輕鬆地從您自己的程序中捕獲其輸出。

2

您可以嘗試類似如下:

注:顯然,下面的很多事情,如內存重新分配,錯誤檢查,不完整代碼等我們的想法是給你一個提示缺少!

#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 */ 
} 

輸出將是如下:

> gcc test.c -o print 
> print 

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

> 

TODO:

  • 可以包括數字,特殊字符(如,@,#,$,等等!),空白空間,可能是所有ASCII字符都有道理。
  • 可以支持粗體,斜體,下劃線和突出的人物
  • 可以支持前景色和背景色
  • 可以支持動畫

希望這有助於!

+0

謝謝,讓我試試它..我認爲雅科凡告訴類似的想法。 – utsabiem