6

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

FIGLET

Aを印刷するために使用するコードスニペットは次のとおりです。

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

ここで、ユーザーから入力テキストを取得し、ASCIIアートで表示します。printfを使用しているので、垂直方向にしか生成できません。

垂直方向の画像

しかし、私は水平アスキーアートをする必要があります。どうやってするか ?

4

4 に答える 4

2

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

まず、各文字を配列で表します。たとえば、Aは次のようになります。

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

(実際には、各文字が異なるインデックスにある場合は2D配列が使用されます。)

実際のレンダリングも配列内にあり、次のようなものになります。

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は少し錆びており、そこからは「擬似」コードです。しかし、私の論理は健全だと思います。)

于 2011-12-21T08:15:32.703 に答える
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) {
                                     /*0123 4567*/
    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文字が意味をなす場合があります。
  • 文字の太字、斜体、下線、強調表示をサポートできます
  • 前景色と背景色をサポートできます
  • アニメーションをサポートできます

お役に立てれば!

于 2011-12-21T08:39:25.027 に答える
1

一度に1文字全体を1つの文字列として印刷する代わりに、文字を複数の文字列に分割します。文字を構成するテキストの各行に1つずつです。次に、各文字の最初の行、改行、次に各文字の2行目などを印刷します。すべての行が正しい幅になるように、行をスペースで埋める必要があります。

于 2011-12-21T08:18:05.493 に答える
1

あなたがFigletを気に入っているのを見るのは素晴らしいことです。表示しているFigletウィジェットには、実際にはASCII出力を生成するコマンドラインツールが含まれています。http://www.figlet.org/brewLink を使用して簡単にインストールすることもできます

自分のプログラム内から、popen(..)または同様の方法でその出力を簡単にキャプチャできると考えてください。

于 2011-12-21T08:29:18.797 に答える