Linux下的图形库curses写贪吃蛇,酷
发布日期:2021-06-30 18:50:53 浏览次数:2 分类:技术文章

本文共 4272 字,大约阅读时间需要 14 分钟。

最近看到大神在Linux下写的贪吃蛇代码,用到了curses图形库,可能很多人都没有用过,分享出来给大家。

在ubuntu下安装curses图形库命令

sudo apt-get install libncurses5-dev

双buff是一个非常优秀的机制,之前写贪吃蛇的时候,如果不使用双buff屏幕跳动会很剧烈,使用了双buff后体验就非常好。

我们使用curses图形库也是一样,如果没有调用refresh()函数之前,显示的屏幕是不会进行更新的。

比如下面这段代码

#include 
#include 
#include 
int main(){    initscr();    /* We move the cursor to the point (5,15) on the logical screen,       print "Hello World" and refresh the actual screen.       Lastly, we use the call sleep(2) to suspend the program for two seconds,       so we can see the output before the program ends. */    move(5, 15);    addstr("Hello World");    refresh();    sleep(2);    endwin();    exit(EXIT_SUCCESS);}

使用下面的命令编译并运行

gcc -o t screen1.c -lncurses && ./t

首先初始化一个屏幕,然后移动到屏幕的 5,15位置,在输出字符串 Hello World。之后休眠 2秒后,程序退出。

使用curses写贪吃蛇代码

//sudo apt-get install libncurses5-dev//gcc -o t tanchishe.c -lncurses && ./t#include 
 // Linux 下的图形库#include 
 // usleep()#include 
 // rand()#include 
   // time()#define W 40#define H 24int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0, t = 0, d = 1, i;int main(void) {    initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);    srand(time(NULL));    for (i = 0; i < W * H; i++)        m[i] = !(i / W % (H - 1) && i % W % (W - 1));    m[q[t = (t + 1) % (W * H)] = p] = 1;    do { a = rand() % (W * H); } while (m[a]);    while ((i = getch()) != 27) {        if      (i == KEY_UP    && d !=  W) d = -W;        else if (i == KEY_DOWN  && d != -W) d =  W;        else if (i == KEY_LEFT  && d !=  1) d = -1;        else if (i == KEY_RIGHT && d != -1) d =  1;        if (m[p += d]) break;        m[q[t = (t + 1) % (W * H)] = p] = 1;        if (p == a) do { a = rand() % (W * H); } while (m[a]);        else m[q[h = (h + 1) % (W * H)]] = 0;        for (i = 0; i < W * H; i++)            mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");        mvaddstr(a / W, (a % W) * 2, "()");        refresh();        usleep(100000);    }    while (getch() == ERR);    endwin();}

程序运行

简单解释下

for (i = 0; i < W * H; i++)            mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");

构建边框和蛇身的代码,边框是用 [] 构建的,用这个字符从视觉上看会比较舒服。

mvaddstr(a / W, (a % W) * 2, "()");

随机生成的食物,之前已经用时间srand(time(NULL));作为种子设置了随机数。

if (m[p += d]) break;

碰撞检测

if (p == a) do { a = rand() % (W * H); } while (m[a]);        else m[q[h = (h + 1) % (W * H)]] = 0;

如果碰撞到了食物,就增加蛇长度,m[]里面同时保存蛇的数据和边框的数据,并且蛇移动的时候,需要把后面的数值设置为0。

p = H / 2 * W + (W / 2)

蛇的初始位置

自己修改的代码,可以实现穿墙效果

//sudo apt-get install libncurses5-dev//gcc -o t tanchishe.c -lncurses && ./t#include 
 // Linux 下的图形库#include 
 // usleep()#include 
 // rand()#include 
   // time()#define W 40#define H 24int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0, t = 0, d = 1, i,j=3;int main(void) {    initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);    srand(time(NULL));    for (i = 0; i < W * H; i++) m[i] = !(i / W % (H - 1) && i % W % (W - 1));    m[q[t = (t + 1) % (W * H)] = p] = 1;    do { a = rand() % (W * H); } while (m[a]);    while ((i = getch()) != 27) {        if      (i == KEY_UP    && d !=  W) {d = -W;j=0;}        else if (i == KEY_DOWN  && d != -W) {d =  W;j=1;}        else if (i == KEY_LEFT  && d !=  1) {d = -1;j=2;}        else if (i == KEY_RIGHT && d != -1) {d =  1;j=3;}        if (m[p += d]) {            switch(j){                case 0:p = p+(H-2)*W; break;                case 1:p = p-(H-2)*W; break;                case 2:p = p+W-2; break;                case 3:p = p-W+2; break;                default: p = H / 2 * W + (W / 2); break;            }        };        m[q[t = (t + 1) % (W * H)] = p] = 1;        if (p == a) do { a = rand() % (W * H); } while (m[a]);        else m[q[h = (h + 1) % (W * H)]] = 0;        for (i = 0; i < W * H; i++){            mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");        }        mvaddstr(a / W, (a % W) * 2, "()");        refresh();        usleep(100000);    }    while (getch() == ERR);    endwin();}

运行如下:

代码原文:

https://www.zhihu.com/question/360814879/answer/1013986215

公众号后台回复「curse」获取curse图形库资料


推荐阅读:

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

转载地址:https://linus.blog.csdn.net/article/details/115649061 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:在Ubuntu下安装jdk解压出现问题:./jdk-6u30-linux-i586.bin: 113: ./install.sfx.3631: not found
下一篇:基于STC89C52的韦根数据接收

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月10日 17时00分16秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Boundary loss 损失函数 2019-04-30
神经网络调参实战(一)—— 训练更多次数 & tensorboard & finetune 2019-04-30
tensorflow使用tensorboard进行可视化 2019-04-30
神经网络调参实战(二)—— activation & initializer & optimizer 2019-04-30
凸优化 convex optimization 2019-04-30
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度 2019-04-30
IEEE与APA引用格式 2019-04-30
research gap 2019-04-30
pytorch训练cifar10数据集查看各个种类图片的准确率 2019-04-30
Python鼠标点击图片,获取点击点的像素坐标 2019-04-30
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT)) 2019-04-30
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼) 2019-04-30
RRT算法(快速拓展随机树)的Python实现 2019-04-30
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习) 2019-04-30
D*算法 2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code 2019-04-30
RESTful API 2019-04-30
优化算法(四)——粒子群优化算法(PSO) 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(2)——回归分析(最小二乘法&决定系数&残差不相关)&主成分分析&奇异值分解 2019-04-30