如何简化使用ANSI颜色的printf代码 适配终端俄罗斯方块开发需求
你当前的两种实现都没有达到精简和可读性的最优解,还有很大的优化空间:
更优的实现方案
你最初的宏定义思路其实运行效率更高,只是没有做好逻辑拆分才显得杂乱。可以把预渲染的彩色标题单独抽成独立的宏常量,既保留了宏方案零运行时开销的优势,又能让主逻辑代码极度整洁:
// 颜色定义可单独放在头文件中,供整个游戏全局复用 #define COL_RED "\e[31m" #define COL_ORANGE "\e[38;5;202m" #define COL_BROWN "\e[38;5;130m" #define COL_YELLOW "\e[93m" #define COL_DYELLOW "\e[33m" #define COL_LIME "\e[92m" #define COL_GREEN "\e[32m" #define COL_AQUA "\e[96m" #define COL_SKY "\e[94m" #define COL_MAGENTA "\e[35m" #define COL_RESET "\e[0m" #define PREFIX_SPC " " // 标题直接预定义为完整的带颜色字符串,编译期自动完成拼接 #define TETRIS_TITLE \ PREFIX_SPC COL_RED "████████╗" COL_ORANGE "███████" COL_BROWN "╗" COL_YELLOW "████████" COL_DYELLOW "╗" COL_LIME "██████" COL_GREEN "╗" COL_AQUA " ██" COL_SKY "║" COL_MAGENTA "███████╗" COL_RESET "\n" \ PREFIX_SPC COL_RED "╚══██╔══╝" COL_ORANGE "██" COL_BROWN "╔════╝" COL_DYELLOW "╚══" COL_YELLOW "██" COL_DYELLOW "╔══╝" COL_LIME "██" COL_GREEN "╔══" COL_LIME "██" COL_LIME "╗" COL_AQUA "██" COL_SKY "║" COL_MAGENTA "██╔════╝" COL_RESET "\n" \ PREFIX_SPC COL_RED " ██║ " COL_ORANGE "█████" COL_BROWN "╗ " COL_YELLOW "██" COL_DYELLOW "║ " COL_LIME "██████" COL_GREEN "╔╝" COL_AQUA "██" COL_SKY "║" COL_MAGENTA "███████╗" COL_RESET "\n" \ PREFIX_SPC COL_RED " ██║ " COL_ORANGE "██" COL_BROWN "╔══╝ " COL_YELLOW "██" COL_DYELLOW "║ " COL_LIME "██" COL_GREEN "╔══" COL_LIME "██" COL_GREEN "╗" COL_AQUA "██" COL_SKY "║" COL_MAGENTA "╚════██║" COL_RESET "\n" \ PREFIX_SPC COL_RED " ██║ " COL_ORANGE "███████" COL_BROWN "╗ " COL_YELLOW "██" COL_DYELLOW "║ " COL_LIME "██" COL_GREEN "║ " COL_LIME "██" COL_GREEN "║" COL_AQUA "██" COL_SKY "║" COL_MAGENTA "███████║" COL_RESET "\n" \ PREFIX_SPC COL_RED " ╚═╝ " COL_BROWN "╚══════╝ " COL_DYELLOW "╚═╝ " COL_GREEN "╚═╝ ╚═╝" COL_SKY "╚═╝" COL_MAGENTA "╚══════╝" COL_RESET "\n\n" \ PREFIX_SPC " PRESS ANY KEY TO BEGIN\n\n" #include <stdio.h> int main() { printf(TETRIS_TITLE); // 后续游戏逻辑 return 0; }
该方案的优势
- 编译期自动完成所有字符串拼接,运行时没有额外的内存占用,比字符串变量方案开销更低
- 标题样式定义和主业务逻辑完全拆分,后续要修改标题样式、调整颜色、修改文案都不用动
main函数里的逻辑 - 避免了字符串方案中
printf参数列表过长、容易写错参数顺序甚至出现未定义变量的问题(你提供的字符串方案代码中就出现了未定义的blue变量,无法正常编译)
进一步精简的必要性
要不要继续精简完全取决于你的目标:
- 如果目标是提升可读性:当前方案已经足够清晰,再精简反而会降低可维护性,比如把颜色宏缩写成单个字符,后续看代码还要对照才能知道对应颜色,得不偿失
- 如果目标是减少代码量:可以额外封装通用的彩色打印宏,整个游戏其他地方打印彩色内容都可以复用,比如:
#define PRINT_COLOR(color, content) printf(color content COL_RESET) - 如果目标是压缩二进制体积:当前宏方案已经是最优状态,所有内容都是只读常量,再精简也只能省几字节的空间,对于现代设备来说完全没有实际意义
内容的提问来源于stack exchange,提问作者Luke Dunn
相关产品推荐
相关产品推荐

