【问题标题】:How can I condense this printf that uses ANSI colors? [closed]如何压缩这个使用 ANSI 颜色的 printf? [关闭]
【发布时间】:2021-10-26 01:24:17
【问题描述】:

我正在编写一个要在终端上玩的俄罗斯方块游戏。当然,没有花哨的颜色就不是俄罗斯方块!不幸的是,要打印漂亮的颜色,代码必须看起来很难看。有"ANSI escape sequences"我用来创建颜色,我的程序的标题屏幕看起来像this。但是,为了创建这个漂亮的屏幕,我想让代码看起来尽可能整洁。

到目前为止,我已经设计了两种压缩此代码的方法:definitionsstrings。以下是使用定义的代码版本:

#define TEXT_ADMIN "\e[31m"
#define TEXT_ORANGE "\e[38;5;202m"
#define TEXT_BROWN "\e[38;5;130m"
#define TEXT_YELLOW "\e[93m"
#define TEXT_PUKE "\e[33m"
#define TEXT_LIME "\e[92m"
#define TEXT_GREEN "\e[32m"
#define TEXT_AQUA "\e[96m"
#define TEXT_SKY "\e[94m"
#define TEXT_MAGENTA "\e[35m"
#define COLOR_RESET "\e[0m"

#include <stdio.h>

int main()
{
    char space[]="        ";

    printf(
    "%s"TEXT_ADMIN"████████╗"TEXT_ORANGE"███████"TEXT_BROWN"╗"TEXT_YELLOW"████████"TEXT_PUKE"╗"TEXT_LIME"██████"TEXT_GREEN"╗"TEXT_AQUA" ██"TEXT_SKY"╗"TEXT_MAGENTA"███████╗"COLOR_RESET"\n"
    "%s"TEXT_ADMIN"╚══██╔══╝"TEXT_ORANGE"██"TEXT_BROWN"╔════╝"TEXT_PUKE"╚══"TEXT_YELLOW"██"TEXT_PUKE"╔══╝"TEXT_LIME"██"TEXT_GREEN"╔══"TEXT_LIME"██"TEXT_LIME"╗"TEXT_AQUA"██"TEXT_SKY"║"TEXT_MAGENTA"██╔════╝"COLOR_RESET"\n"
    "%s"TEXT_ADMIN"   ██║   "TEXT_ORANGE"█████"TEXT_BROWN"╗     "TEXT_YELLOW"██"TEXT_PUKE"║   "TEXT_LIME"██████"TEXT_GREEN"╔╝"TEXT_AQUA"██"TEXT_SKY"║"TEXT_MAGENTA"███████╗"COLOR_RESET"\n"
    "%s"TEXT_ADMIN"   ██║   "TEXT_ORANGE"██"TEXT_BROWN"╔══╝     "TEXT_YELLOW"██"TEXT_PUKE"║   "TEXT_LIME"██"TEXT_GREEN"╔══"TEXT_LIME"██"TEXT_GREEN"╗"TEXT_AQUA"██"TEXT_SKY"║"TEXT_MAGENTA"╚════██║"COLOR_RESET"\n"
    "%s"TEXT_ADMIN"   ██║   "TEXT_ORANGE"███████"TEXT_BROWN"╗   "TEXT_YELLOW"██"TEXT_PUKE"║   "TEXT_LIME"██"TEXT_GREEN"║  "TEXT_LIME"██"TEXT_GREEN"║"TEXT_AQUA"██"TEXT_SKY"║"TEXT_MAGENTA"███████║"COLOR_RESET"\n"
    "%s"TEXT_ADMIN"   ╚═╝   "TEXT_BROWN"╚══════╝   "TEXT_PUKE"╚═╝   "TEXT_GREEN"╚═╝  ╚═╝"TEXT_SKY"╚═╝"TEXT_MAGENTA"╚══════╝"COLOR_RESET"\n\n"
    "%s             PRESS ANY KEY TO BEGIN\n\n",
    space,space,space,space,space,space,space);

}//TETRIS = 6 lines, text = 1 line, 8 lines total including space.

(一个需要大量水平滚动的丑陋怪物)

这是使用字符串的版本:

#include <stdio.h>

int main()
{
    char admin[]="\e[31m";
    char orange[]="\e[38;5;202m";
    char brown[]="\e[38;5;130m";
    char yellow[]="\e[93m";
    char puke[]="\e[33m";
    char lime[]="\e[92m";
    char green[]="\e[32m";
    char aqua[]="\e[96m";
    char sky[]="\e[94m";
    char magenta[]="\e[35m";
    char reset[]="\e[0m";
    char space[]="        ";

    printf(
    "%s%s████████╗%s███████%s╗%s████████%s╗%s██████%s╗%s ██%s╗%s███████╗%s\n"
    "%s%s╚══██╔══╝%s██%s╔════╝%s╚══%s██%s╔══╝%s██%s╔══%s██%s╗%s██%s║%s██╔════╝%s\n"
    "%s%s   ██║   %s█████%s╗     %s██%s║   %s██████%s╔╝%s██%s║%s███████╗%s\n"
    "%s%s   ██║   %s██%s╔══╝     %s██%s║   %s██%s╔══%s██%s╗%s██%s║%s╚════██║%s\n"
    "%s%s   ██║   %s███████%s╗   %s██%s║   %s██%s║  %s██%s║%s██%s║%s███████║%s\n"
    "%s%s   ╚═╝   %s╚══════╝   %s╚═╝   %s╚═╝  ╚═╝%s╚═╝%s╚══════╝%s\n\n"
    
    "%s             PRESS ANY KEY TO BEGIN\n\n",
    space,admin,orange,brown,yellow,puke,lime,green,sky,blue,magenta,reset,
    space,admin,orange,brown,puke,yellow,puke,lime,green,lime,green,sky,blue,magenta,reset,
    space,admin,orange,brown,yellow,puke,lime,green,sky,blue,magenta,reset,
    space,admin,orange,brown,yellow,puke,lime,green,lime,green,sky,blue,magenta,reset,
    space,admin,orange,brown,yellow,puke,lime,green,lime,green,sky,blue,magenta,reset,
    space,admin,brown,puke,green,blue,magenta,reset,
    space);

}//TETRIS = 6 lines, text = 1 line, 8 lines total including space.

如你所见,string 方法看起来更干净一些,尽管它使用更多的行和内存,但即使这种方法也相当长。我是否尽可能地压缩了这段代码?浓缩这个还值得吗?感谢您的意见!

【问题讨论】:

  • "You can" "put any number of spaces between \"\""。总的来说,这是一个奇怪的要求。如果它只是为了打印一个欢迎字符串,只需编写一次,这样它就可以工作并显示你想要的,调用是一个函数并且忘记它。让代码看起来“漂亮”是一个令人钦佩的目标,但在这种情况下真的有意义吗?
  • 第一种方式更容易阅读/理解/维护。 “TEXT_ORANGE”是明确的; "\e[38;5;202m" 没那么多。
  • @Andrew true 但两者都用不可读的代替了可读的。看到我用 %s 来使用字符串
  • TEXT_LIME"██"TEXT_GREEN"╔══"TEXT_LIME"██"TEXT_LIME"╗" 看起来不对。连续 2 个 LIME。 printf()s 的正确性如何?

标签: c colors printf ansi-escape


【解决方案1】:

我最终得到:

// colors.h
#define COLOR_ADMIN   "\033[31m"
#define COLOR_ORANGE  "\033[38;5;202m"
#define COLOR_BROWN   "\033[38;5;130m"
#define COLOR_YELLOW  "\033[93m"
#define COLOR_PUKE    "\033[33m"
#define COLOR_LIME    "\033[92m"
#define COLOR_GREEN   "\033[32m"
#define COLOR_AQUA    "\033[96m"
#define COLOR_SKY     "\033[94m"
#define COLOR_MAGENTA "\033[35m"
#define COLOR_RESET   "\033[0m"

// welcometext.c
#include "colors.h"

#define PRE "        "
#define T COLOR_ADMIN
#define E COLOR_ORANGE
#define e COLOR_BROWN
#define T2 COLOR_YELLOW
#define t2 COLOR_PUKE
#define RC COLOR_GREEN
#define rc COLOR_AQUA
#define I COLOR_SKY
#define i COLOR_AQUA
#define S COLOR_MAGENTA
#define POST COLOR_RESET"\n"

const char welcomestring[] = 
    PRE T "████████╗"   E "███████"e "╗"  T2"███"  "█████"t2"╗"   RC"██████"rc"╗ "          I"██"i"╗"  S"███████╗" POST
    PRE T "╚══██╔══╝"   E "██"e "╔════╝"  t2"╚══"T2"██"t2"╔══╝"   RC"██"rc"╔══"RC"██"rc"╗"  I"██"i"║"  S"██╔════╝" POST
    PRE T "   ██║   "   E "█████"e "╗  "    "   "T2"██"t2"║   "   RC"██████"rc"╔╝"          I"██"i"║"  S"███████╗" POST
    PRE T "   ██║   "   E "██"e "╔══╝  "    "   "T2"██"t2"║   "   RC"██"rc"╔══"RC"██"rc"╗"  I"██"i"║"  S"╚════██║" POST
    PRE T "   ██║   "   E "███████"e "╗"    "   "T2"██"t2"║   "   RC"██"rc"║  "RC"██"rc"║"  I"██"i"║"  S"███████║" POST
    PRE T "   ╚═╝   "   e "╚══════"  "╝"    "   "t2"╚═"  "╝   "   rc"╚═╝  ╚═╝"              i"╚═" "╝"  S"╚══════╝" POST
    "\n"
    PRE  "             PRESS ANY KEY TO BEGIN\n"
    "\n"
    ;

//  welcometext.h
extern const char welcomestring[];

// main.c
#include <stdio.h>
int main() {
    printf("%s\n", welcomestring);
}

请注意,L"string"u"string"U"string" 在 C 中是有意义的,而 R"string" 被 GCC 解释为原始字符串文字,因此我将其重命名为 RC。最好为定义选择唯一的名称,将这些单个字母命名为更独特的名称,或添加更多空格。

【讨论】:

  • 有没有一种技术可以写出这样漂亮的代码?一切都对齐之前是不是很麻烦?
  • Is there a technique for writing pretty code like this? 空格键!还有退格。 Was it elbow grease until everything aligned? 是的,我是手动完成的。
猜你喜欢
  • 2011-04-13
  • 2017-07-24
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多