在之前的章节中,细心的同志应该已经发现,在终端中执行命令,有时显示的内容是彩色的,如下图:终端彩色字符显示在执行 ls 命令后,对于可执行程序,其文件名在终端上显示是绿色的,如 io1,io2某些情况下,我们还能发一些字带有底色,有的带下划线,这是怎么回事呢?原来在 ANSI 标准中,终端是可以显示不同效果的文本内容的那么我们的程序中能不能也显示这样花花绿绿的文字呢?答案是肯定的我们现在来看一个彩色版的 Hello, world!程序:彩色版 Hello, world编译并执行程序,我们得到如下结果:彩色版 Hello, world 程序运行结果我们可以看到,Hello, world!文字是绿色,同时有白色的底色分析代码不难发现,在printf 语句中,字符串”Hello, world!”的前后各多了一断奇怪的字符先分析:\033[0;32;47m其中,\033 [是一个字符样式设置符开始标识,是告诉终端,我接下来要设置字符颜色了;紧接着是三个整数,中间使用”;”号隔开,第一个整数表式样式编号,这里是 1,第二个整数表前景也就是文字颜色编号,这里 32,第三个整数表示背景颜色编号,这里是 47。
三种编号取值及意义如下表:类型 编号 意义前景 30-37 对应黑、红、绿、黄、蓝、紫、青、白背景 40-47 对应黑、红、绿、黄、蓝、紫、青、白0 终端默认1 高亮显示4 下划线5 闪烁7 反显样式8 隐藏最后,是字母 m,表示我们对字符颜色的设定参数完了,告诉终端 printf 后面显示文字按此执行吧再分析:\033[0m,意义非常简单,是告诉终端,之前应用的文字颜色设置,不要再生效了,按照终端默认的方式显示后边的内容吧有兴趣的同志可以尝试去掉这串字符,编译运行程序,你会发现,程序结束后,在终端里输入命令,也会是和 Hello, world 一样的彩色效果:实际上,文字的样式、前景、背景也可以单独设置设置方式为:\003[编号 m例子中介绍的是一种组合模式就也是\003[与 m 之间可以只有一种设定,也可以有多种设定,不同设定之间使用;号隔开小结:1 彩色字符样式设置格式为:\033[ 样式;前景;背景 m2 想恢复终端原来的字符显示,输出字符串:\033[0m3 单独的样式设定格式为:\033[编号 m如何控制彩色文字显示,已经介绍完毕接下来介绍终端中如何指定文本的显示位置通常,我们调用 printf,要行换行,要么一个一个字符往后排,这样的顺次显示字符内容。
我们能不能够随意控制字符的显示位置呢?答案依然是肯定的我们看个例子:光标定位源码编译运行程序,我们得到如下结果:程序运行结果可以看到,1 显示的坐标为(1, 1),2 显示的坐标为(2, 2),3 显示的坐标为(3, 3)是什么东西起到了这个作用呢在 Linux 终端中,可以使用:\033[x;yH 的方式来定位下一个字符显示的位置我们来分析一下代码:printf("\033[%d;%dH%d", i, i, i);正是将数字 i 显示在坐标为(i, i)的位置另外,我们在程序开始,调用了 printf("\033[2J"),其作用的清屏程序的最后,输出一个回车换行,使得程序退出后命令提示符能够靠左显示总结:无论是彩色字符也好,光标定位也好,在终端中都是使用 printf 特殊字串来实现的终端中还有其他类似的功能,这里一一列出,供大家参考学习:颜色代码:QUOTE:字背景颜色范围: 40--49 字颜色: 30--3940: 黑 30: 黑41: 红 31: 红42: 绿 32: 绿43: 黄 33: 黄44: 蓝 34: 蓝45: 紫 35: 紫46: 深绿 36: 深绿47: 白色 37: 白色ANSI 控制码 :QUOTE:/033[0m 关闭所有属性 /033[1m 设置高亮度 /03[4m 下划线 /033[5m 闪烁 /033[7m 反显 /033[8m 消隐 /033[30m -- /033[37m 设置前景色 /033[40m -- /033[47m 设置背景色 /033[nA 光标上移 n 行 /03[nB 光标下移 n 行 /033[nC 光标右移 n 行 /033[nD 光标左移 n 行 /033[y;xH 设置光标位置 /033[2J 清屏 /033[K 清除从光标到行尾的内容 /033[s 保存光标位置 /033[u 恢复光标位置 /033[?25l 隐藏光标 /33[?25h 显示光标经过这一章节的学习,我们已经能够在终端上显示彩色字符,也能控制字符有显示位置,这实现了我们原贪吃蛇游戏的显示基础,下一章节,我们将要介绍如何响应键盘输入,来达成了游戏中对蛇的控制功能,最后再开始写游戏。