【发布时间】:2021-10-26 01:24:17
【问题描述】:
我正在编写一个要在终端上玩的俄罗斯方块游戏。当然,没有花哨的颜色就不是俄罗斯方块!不幸的是,要打印漂亮的颜色,代码必须看起来很难看。有"ANSI escape sequences"我用来创建颜色,我的程序的标题屏幕看起来像this。但是,为了创建这个漂亮的屏幕,我想让代码看起来尽可能整洁。
到目前为止,我已经设计了两种压缩此代码的方法:definitions 和 strings。以下是使用定义的代码版本:
#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