文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux下的图形库curses写贪吃蛇,酷

2024-12-03 06:33

关注

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

在ubuntu下安装curses图形库命令

  1. sudo apt-get install libncurses5-dev 

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

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

比如下面这段代码 

  1. #include <unistd.h>  
  2. #include <stdlib.h>  
  3. #include <curses.h>  
  4. int main()  
  5.  
  6.     initscr();  
  7.       
  8.     move(5, 15);  
  9.     addstr("Hello World");  
  10.     refresh();  
  11.     sleep(2);  
  12.     endwin();  
  13.     exit(EXIT_SUCCESS);  

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

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

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

使用curses写贪吃蛇代码 

  1. //sudo apt-get install libncurses5-dev  
  2. //gcc -o t tanchishe.c -lncurses && ./t  
  3. #include <curses.h> // Linux 下的图形库  
  4. #include <unistd.h> // usleep()  
  5. #include <stdlib.h> // rand()  
  6. #include <time.h>   // time()  
  7. #define W 40  
  8. #define H 24  
  9. int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0t = 0d = 1, i;  
  10. int main(void) {  
  11.     initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);  
  12.     srand(time(NULL)); 
  13.     for (i = 0; i < W * H; i++)  
  14.         m[i] = !(i / W % (H - 1) && i % W % (W - 1));  
  15.     m[q[t = (t + 1) % (W * H)] = p] = 1;  
  16.     do { a = rand() % (W * H); } while (m[a]);  
  17.     while ((i = getch()) != 27) {  
  18.         if      (i == KEY_UP    && d !=  W) d = -W;  
  19.         else if (i == KEY_DOWN  && d != -W) d =  W 
  20.         else if (i == KEY_LEFT  && d !=  1) d = -1;  
  21.         else if (i == KEY_RIGHT && d != -1) d =  1 
  22.         if (m[p += d]) break;  
  23.         m[q[t = (t + 1) % (W * H)] = p] = 1;  
  24.         if (p == a) do { a = rand() % (W * H); } while (m[a]);  
  25.         else m[q[h = (h + 1) % (W * H)]] = 0;  
  26.         for (i = 0; i < W * H; i++)  
  27.             mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");  
  28.         mvaddstr(a / W, (a % W) * 2, "()");  
  29.         refresh();  
  30.         usleep(100000);  
  31.     }  
  32.     while (getch() == ERR);  
  33.     endwin();  

程序运行

简单解释下 

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

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

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

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

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

碰撞检测 

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

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

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

蛇的初始位置

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

  1. //sudo apt-get install libncurses5-dev  
  2. //gcc -o t tanchishe.c -lncurses && ./t 
  3. #include <curses.h> // Linux 下的图形库  
  4. #include <unistd.h> // usleep()  
  5. #include <stdlib.h> // rand()  
  6. #include <time.h>   // time()  
  7. #define W 40  
  8. #define H 24  
  9. int m[W * H], q[W * H], p = H / 2 * W + (W / 2), a, h = 0t = 0d = 1, i,j=3 
  10. int main(void) {  
  11.     initscr(); noecho(); keypad(stdscr, 1); nodelay(stdscr, 1); curs_set(0);  
  12.     srand(time(NULL));  
  13.     for (i = 0; i < W * H; i++) m[i] = !(i / W % (H - 1) && i % W % (W - 1));  
  14.     m[q[t = (t + 1) % (W * H)] = p] = 1;  
  15.     do { a = rand() % (W * H); } while (m[a]);  
  16.     while ((i = getch()) != 27) {  
  17.         if      (i == KEY_UP    && d !=  W) {d = -W;j=0;}  
  18.         else if (i == KEY_DOWN  && d != -W) {d =  W;j=1;}  
  19.         else if (i == KEY_LEFT  && d !=  1) {d = -1;j=2;}  
  20.         else if (i == KEY_RIGHT && d != -1) {d =  1;j=3;}  
  21.         if (m[p += d]) {  
  22.             switch(j){  
  23.                 case 0:p = p+(H-2)*W; break;  
  24.                 case 1:p = p-(H-2)*W; break;  
  25.                 case 2:p = p+W-2; break;  
  26.                 case 3:p = p-W+2; break;  
  27.                 default: p = H / 2 * W + (W / 2); break;  
  28.             }  
  29.         };  
  30.         m[q[t = (t + 1) % (W * H)] = p] = 1;  
  31.         if (p == a) do { a = rand() % (W * H); } while (m[a]);  
  32.         else m[q[h = (h + 1) % (W * H)]] = 0;  
  33.         for (i = 0; i < W * H; i++){  
  34.             mvaddstr(i / W, (i % W) * 2, m[i] ? "[]" : "  ");  
  35.         }  
  36.         mvaddstr(a / W, (a % W) * 2, "()");  
  37.         refresh(); 
  38.         usleep(100000);  
  39.     }  
  40.     while (getch() == ERR);  
  41.     endwin();  

运行如下:

代码原文:

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

 

来源:良许Linux内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯