2011-12-21 5 views
5

私は楽しいアプリケーションのためのASCIIアートテキストを生成しようとしています。 FIGLETから、私はASCIIパターンを得ました。私は文字を印刷するためにprintfステートメントでそのパターンを使用しています。ここでCでAsciiアートテキストを生成

FIGLET

私は印刷に使用コードスニペットです:

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

、私は、ユーザーからの入力テキストを取り、ここで私はFigletによるからもらったパターンのスクリーンショットですASCIIアートでそれを示してください。

Vertical image

をしかし、私は水平方向のASCIIアートを実行する必要があります。私はprintfのを使用するように、私は垂直方向にのみ、それを生成することができます。どうやってするか ?

答えて

2

はい、これはよく知られた問題です。これを最後に解決したのは、各行に配列を使用し、各文字を別々にレンダリングすることです。

まず、各文字を配列で表します。同様にアレイ状になり、実際のレンダリング

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

(各文字は異なる指標である実際の2Dアレイが使用される。)

:たとえば、あなたのAは、このようなものであろう

char * render [8];の行に沿った何か;

を入力し、連結を使用して各行を作成します。

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ループネストされたトリックを行う必要があります。実際には、レンダリング配列をスキップして、改行なしで各行を単に印刷することができます。以下のようなものが頭に浮かぶ:

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 
} 

+0

(上記のように、上記を基にして、実際にアスキーアートのフォントファイルを作成し、必要に応じて配列にロードすることができます) –

+0

ありがとう、私は考えを持っていると思う...それを試してみましょう... – utsabiem

+0

2D配列を使っていましたが、スペースパディングの問題に直面しています。うまくいけばすぐに解決します。 – utsabiem

1

代わりの1つの全体を印刷する(。。私のCは、そこから「擬似」コードしかし、私は私のロジックが健全だと思い、少し錆びです)文字を一度に1つの文字列として扱い、文字を複数の文字列に分割します。文字を構成するテキスト行ごとに1つずつです。その後、各文字の最初の行、改行、各文字の2行目などを印刷します。行をスペースで埋めて、すべての幅が正しいことを確認する必要があります。

1

あなたはフィレットが好きであることを知りました。実際に表示されているFigureletウィジェットには、実際にASCII出力を生成するコマンドラインツールが含まれています。 http://www.figlet.org/ また、ブリュー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

ありがとう、私はそれを試してみましょう..私はJaco Vanも同様の考えを語ったと思います。 – utsabiem

関連する問題