我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛
前语
本文介绍如何用C
言语在Linux
的Terminal
上输出一只奔驰的兔子,Mac
体系也能够。
作为一名Java
程序员,多多少少会一点C
言语,那就用C
言语编译打印出一只兔子吧,还不是分分钟的事,嗯…还真不是分分钟的事。
废话不多说,先看个作用图。
什么?这个兔子有点抽象?先凑合着看吧,究竟是一个符号一个符号打印出来的,光用字符拼出这个小兔子就花了好几个小时,究竟想象力有限。。。。
完成思路
兔子原型
先找到一只兔子的原型,呐,下面这张图便是兔子的原型,怎么样?和我打印的像不像?嗯……不能说一模一样,只能说毫不相干!
符号转化
找到图片后,盯着图片看了大半天,构思兔子的结构,开始用符号把兔子的姿态给表现出来。
先预备一个空白文档,按照图片的姿态尝试画出来,下面是我画的姿态。
程序预备
用C
言语在终端Terminal
输出动效,需要用到curses
形式,curses
形式能够在终端内绘制简略的图形用户界面。
静态部分
首先把用符号拼成的兔子的姿态在头文件里界说出来。
#define RABBIT_STR1 " .'''. "
#define RABBIT_STR2 " .'. .' '. "
#define RABBIT_STR3 " .' `.' ` "
#define RABBIT_STR4 " / / ` "
#define RABBIT_STR5 " .''```/````''. ' "
#define RABBIT_STR6 " .' `'.` "
#define RABBIT_STR7 " .' _ `. "
#define RABBIT_STR8 " ' ((*)) / "
#define RABBIT_STR9 " ` / . ''` ` ` '. "
......省掉一部分
动态部分
考虑到要做成动态的作用,一开始想让兔子全体的动起来,一蹦一蹦的,后来完成太麻烦了,就只让腿部部分进行动起来,界说代码如下:
#define RABBIT_LEG11 " /` .`........` /` "
#define RABBIT_LEG12 " `....` . ` . /`` "
#define RABBIT_LEG13 " `......` "
#define RABBIT_LEG21 " /` .`........` /` "
#define RABBIT_LEG22 " `....` . ` . /`` "
#define RABBIT_LEG23 " `......` "
......省掉一部分
简略起见总共界说了3组动画作用,也便是前腿部分伸长看起来是用力的部分,后腿部分左右移动。
程序完成
完成的过程其实也很简略,首先获取Terminal
的宽度,关闭Terminal
的回显形式,依据Terminal
的宽度一次削减一个,将兔子打印出来。
int main(int argc, char *argv[])
{
int x;
initscr();
signal(SIGINT, SIG_IGN);
noecho();
curs_set(0);
nodelay(stdscr, TRUE);
leaveok(stdscr, TRUE);
scrollok(stdscr, FALSE);
for (x = COLS - 1;; --x)
{
add_rabbit(x);
getch();
refresh();
usleep(50000);
}
mvcur(0, COLS - 1, LINES - 1, 0);
endwin();
}
int add_rabbit(int x)
{
static char *RABBIT[RABBIT_PATTERNS][RABBIT_HIGHT + 1] =
{这里是头文件里界说的小兔子符号,太多了,展现起来不优雅就先不展现了。};
if (x < -RABBIT_LENGTH)
return ERR;
int y, i;
y = (x / 14) + LINES - (COLS / 14) - RABBIT_HIGHT;
for (i = 0; i <= RABBIT_HIGHT; ++i)
{
printstr(y + i, x, RABBIT[(RABBIT_LENGTH + x) % RABBIT_PATTERNS][i]);
}
return OK;
}
程序阐明
initscr
函数是开启curses
形式,获取指向stdscr
结构的指针。
endwin
函数是关闭curses
形式,运转结束后回到命令行交互界面。
signal(SIGINT, SIG_IGN)
疏忽中止信息,让小兔子跑完,不受外界干扰。
curs_set
设置光标不可见。
getch
为非堵塞等候, 即使没有输入程序也能持续履行。
add_rabbit
函数,便是把头文件里界说好的小兔子的符号给输出到Terminal
里。
程序里的for
循环,是在Terminal
里从左到右绘制小兔子图形,每次一循环刷新下小兔子的方位。
程序运转
编译一下,运转看看。
/usr/bin/gcc -fdiagnostics-color=always -g rabbit.c -o rabbit -l curses
编译成功后会生成一个rabbit
可履行文件。
运转文件,直接在Terminal
里./rabbit
就能够履行了,假如把这个文件放到/usr/bin
目录下,能够直接在Terminal
里输入rabbit
也能运转。
总结
一个在Terminal
中输出一个蹦蹦跳跳的兔子,就这样完成了,不过由于完成的有些抽象,细节还有待打磨。
假如你觉得本文有趣就给作者点个赞吧。