在Linux终端使用C语言来玩Flappybird

        世界上有一种鸟是没有脚的,它只能不停的飞呀飞。累了,就睡在风里。它一生只能落地一次,就是它死的时候……
                                                                    ——对Flappybird的说法

Flappybird游戏,相信从事互联网都知道,毫无征兆地突然之间一夜火起来,然后迅速的被抄袭改编……近期自己使用C语言在linux终端下模仿制作Flappybird(真正像素级:D),记录一下整个实现过程的思路,代码附在文末。

Flappybird最重要的

对于像Templerun与Flappybird这类游戏,最大的特点是:游戏的场景与障碍似乎是无尽的,只要你不损失掉生命就可以一直玩下去获得更高的积分。这里的实现方式是准备两块“屏幕”做切换。开始使用主屏,然后对主屏内容进行偏移,完全偏移至辅屏后再对主频重新初始化,这样循环下去。参考图示:

flybird_s

终端相关

涉及到二个问题:光标控制,输入控制。光标控制,首先是隐藏光标,linux终端默认情况下会在输出末端显示光标表示当前输出的位置;其次是光标的移动,Flappybird是在固定的行列进行游戏的,我们得控制光标达到重复利用行列的目的。

这里有一篇参考博文,其核心思想是利用printf(“\033[xxx”),来解决光标控制的二个问题。

输入控制,需要做的是:一、输入不回显;二、输入非阻塞。这两点都是比较好解决的。利用linux的struct termios term与设置STDIN_FILENO属性O_NONBLOCK可以完美解决。适配与本游戏的设置代码:

static struct termios oterm;
int set_term_mode(int fd)
{
    struct termios term;
    if (tcgetattr(fd, &term) == -1 || tcgetattr(fd, &oterm) == -1) {
        printf("Cannot get the attribution of the terminal");
        return -1;
    }

    term.c_lflag &= ~(ECHO | ICANON);

    if (tcsetattr(fd, TCSAFLUSH, &term) == -1) {
        printf("Cannot set the attribution of the terminal");
        return -1;
    }

    /* set stdin nonblock */
    int flag = fcntl(STDIN_FILENO, F_GETFL);
    flag |= O_NONBLOCK;
    if (fcntl(STDIN_FILENO, F_SETFL, flag) == -1) {
        printf("Cannot set the O_NONBLOCK of the STDIN_FILENO");
        return -1;
    }
    return 0;
}

int resume_term_mode(int fd)
{
    if (tcsetattr(fd, TCSAFLUSH, &oterm) == -1) {
        printf("Cannot resume the attribution of the terminal");
        return -1;
    }
    return 0;
}

Bird相关

原则是不移动x轴(横轴),只移动y轴(纵轴),在终端上只用一个字符显示,这样的话我们每次跳跃与下落只需计算y轴的偏移坐标。检测碰撞有三处:上边界、下边界、障碍物,也可以考虑重力相关(本文未考虑)。

最后附上代码 – 请点击这里

(全文结束)


转载文章请注明出处:漫漫路 - lanindex.com

Leave a Comment

Your email address will not be published.