2011-12-21 11 views
5

Sto provando a generare testo ascii art per un'applicazione divertente. Da FIGLET, ho ottenuto il pattern ASCII. Sto usando quel modello in un'istruzione printf per stampare lettere. Ecco uno screenshot del modello che ho ricevuto da figlet:Genera testo Ascii art in C

FIGLET

Ecco il frammento di codice che uso per stampare A:

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

Ora, prendo un testo di input da utente, e mostralo in arte ASCII. Come io uso printf, posso solo generare verticalmente:

Vertical image

Ma ho bisogno di fare arte ASCII orizzontale. Come farlo ?

risposta

2

Sì, questo è un problema ben noto. L'ultima volta che ho risolto questo è utilizzare un array per ogni riga e rendere ogni lettera separatamente.

In primo luogo, rappresenterei ogni lettera in un array. Per esempio il vostro A sarebbe qualcosa di simile: (. In realtà un array 2D sarebbero stati utilizzati in cui ogni lettera è a un diverso indice)

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

L'attuale renda sarebbe in un array come pure, qualcosa sulla falsariga di:

char * render [8];

e quindi utilizzare la concatenazione per creare ogni riga. Un ciclo semplicemente annidato dovrebbe fare il trucco:

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 

Infine loop anche se l'array e stampare ogni riga. In realtà, puoi saltare l'array di rendering e stampare semplicemente ogni riga senza un ritorno a capo. Qualcosa di simile a quanto segue viene in mente:

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 
} 

(La mia C è un po 'arrugginito, da lì il codice "pseudo" Tuttavia, credo che la mia logica è il suono..)

+0

(Come parte, come base, puoi effettivamente creare file di carattere ascii e caricarli nell'array secondo necessità.) –

+0

Grazie, penso di aver avuto l'idea ... Fammi provare ... – utsabiem

+0

Ha usato l'array 2D ... ma sta affrontando qualche problema nello spazio-padding ... speriamo di risolverlo presto .. – utsabiem

1

Invece di stampare un intero carattere alla volta come una stringa, dividere i caratteri in più stringhe - una per ogni riga di testo che costituisce il carattere. Quindi stampa la prima riga di ogni carattere, nuova riga, poi la seconda riga di ogni carattere, ecc. Avrai bisogno di riempire le linee con spazi per assicurarti che abbiano la larghezza giusta.

1

Bello vedere che ti piace Figlet. Il widget di Figlet che stai visualizzando contiene in realtà uno strumento da riga di comando che genera l'output ASCII. http://www.figlet.org/ Può anche essere facilmente installato con brew http://mxcl.github.com/homebrew/.

Pensa di poter facilmente acquisire l'output dal tuo programma tramite popen(..) o simile.

2

Si può provare qualcosa di simile a quanto segue:

NOTA: Ovviamente, il seguente manca in un sacco di cose come la memoria de-allocazione, il controllo degli errori, il codice incompleta, ecc L'idea è di dare un suggerimento !

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

L'output sarà il seguente:

> gcc test.c -o print 
> print 

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

> 

TODO:

  • È possibile includere numeri, caratteri speciali (come, @, #, $, ecc!), Vuoto spazio, possono essere tutti i caratteri ASCII ha senso.
  • È possibile sostenere grassetto, corsivo, sottolineato ed evidenziare per i personaggi
  • È possibile sostenere colori di primo piano e di sfondo
  • È possibile il supporto di animazione

Spero che questo aiuti!

+0

Grazie, fammi provare .. Penso che Jaco Van abbia parlato di un'idea simile. – utsabiem

Problemi correlati