我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

前语

本文介绍如何用C言语在LinuxTerminal上输出一只奔驰的兔子Mac体系也能够。

作为一名Java程序员,多多少少会一点C言语,那就用C言语编译打印出一只兔子吧,还不是分分钟的事,嗯…还真不是分分钟的事。

废话不多说,先看个作用图。

快看!他电脑的Terminal上飘过一只兔子!

什么?这个兔子有点抽象?先凑合着看吧,究竟是一个符号一个符号打印出来的,光用字符拼出这个小兔子就花了好几个小时,究竟想象力有限。。。。

完成思路

兔子原型

先找到一只兔子的原型,呐,下面这张图便是兔子的原型,怎么样?和我打印的像不像?嗯……不能说一模一样,只能说毫不相干!

快看!他电脑的Terminal上飘过一只兔子!

符号转化

找到图片后,盯着图片看了大半天,构思兔子的结构,开始用符号把兔子的姿态给表现出来。

先预备一个空白文档,按照图片的姿态尝试画出来,下面是我画的姿态。

快看!他电脑的Terminal上飘过一只兔子!

程序预备

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中输出一个蹦蹦跳跳的兔子,就这样完成了,不过由于完成的有些抽象,细节还有待打磨。

假如你觉得本文有趣就给作者点个赞吧。