【问题标题】:Generate Ascii art text in C在 C 中生成 Ascii 艺术文本
【发布时间】:2012-01-25 01:24:36
【问题描述】:

我正在尝试为一个有趣的应用程序生成 ascii 艺术文本。从 FIGLET,我得到了 ASCII 模式。我在printf 语句中使用该模式来打印字母。这是我从 FIGLET 得到的模式截图:

这是我用来打印A的代码sn-p:

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

现在,我从用户那里获取输入文本,并以 ASCII 艺术形式显示它。由于我使用 printf,我只能垂直生成它:

但我需要做横向 ASCII 艺术。该怎么做?

【问题讨论】:

    标签: c ascii-art


    【解决方案1】:

    很高兴看到您喜欢 Figlet。您展示的 Figlet 小部件实际上包含一个生成 ASCII 输出的命令行工具。 http://www.figlet.org/ 也可以通过brewLink轻松安装。

    认为您可以通过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) {
                                           /*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
      
      |       ||-------|       |
      |_______||_______|       |
      |       ||       |       |
      |       ||_______|_______|_______
      
      >
      

      待办事项:

      • 您可以包含数字、特殊字符(如 !、@、#、$ 等)、空格,可能所有 ASCII 字符都是有意义的。
      • 字符可以支持粗体、斜体、下划线和高亮
      • 您可以支持前景色和背景色
      • 可以支持动画

      希望这会有所帮助!

      【讨论】:

      • 谢谢,让我试试看.. 我想 Jaco Van 也说过类似的想法。
      【解决方案3】:

      不是一次打印一个完整的字符作为一个字符串,而是将字符分成多个字符串——一个用于组成字符的每一行文本。然后打印每个字符的第一行、换行符、每个字符的第二行等。您需要用空格填充行以确保它们的宽度都正确。

      【讨论】:

        【解决方案4】:

        是的,这是一个众所周知的问题。我最后一次解决这个问题是对每一行使用一个数组并分别渲染每个字母。

        首先,我将在一个数组中表示每个字母。例如,您的 A 将是这样的:

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

        (实际上将使用二维数组,其中每个字母位于不同的索引处。)

        实际的渲染也将在一个数组中,类似于:

        char* 渲染[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 有点生疏,从那里“伪”代码。但是,我认为我的逻辑是合理的。)

        【讨论】:

        • (顺便说一句,以上面的为基础,其实可以构建ascii-art字体文件,根据需要加载到数组中。)
        • 使用 2D 数组是否...但在空间填充方面遇到了一些问题。希望我会尽快解决它..
        猜你喜欢
        • 2011-03-27
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多