Linux下C语言实现贪吃蛇小游戏
更新时间:2021年3月14日 15:00 点击:1849
本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下
此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的
心得:
1.自己对linux中如何使用vi更加熟悉
如::wq yy pp dd u 等等
2.对c语言的指针,结构体,链表等更加的牢固
3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础
代码展示
#include<curses.h> #include<stdlib.h> #define UP 1 //1与-1的目的是使用abs()函数防止一上一下 #define DOWN -1 #define LEFT 2 #define RIGHT -2 struct Snake{ //创建一个结构体 int hang; int lie; struct Snake *next; }; struct Snake *head = NULL; //全局定义一个头和尾 struct Snake *tail= NULL; int key; //定义一个按键的整形变量 int dir;//定义一个方向的整形变量 struct Snake food; void initFood(){ //定义一个食物## 可以随机生成 int x = rand()%19; int y = rand()%19; food.hang = x; food.lie = y; } void initNcurse(){ initscr(); keypad(stdscr,1); noecho(); } int hasSnakeNode(int i, int j){ //显示蛇身体 struct Snake *p; p = head; while(p != NULL){ if(p->hang == i && p ->lie == j){ return 1; } p = p->next; } return 0; } int hasFood(int i,int j){ //有食物 if(food.hang == i && food.lie == j){ return 1; } return 0; } void gamePic(){ //游戏图形化展示 int hang; int lie; move(0,0); for(hang=0;hang<20;hang++){ if(hang == 0){ for(lie=0;lie<20;lie++){ printw("--"); } printw("\n"); } if(hang >=0 && hang<=19 ){ for(lie=0;lie<=20;lie++){ if(lie == 0 || lie == 20){ printw("|"); }else if(hasSnakeNode(hang,lie)){ printw("[]"); }else if(hasFood(hang,lie)){ printw("##"); } else{ printw(" "); } } printw("\n"); } if(hang == 19){ for(lie=0;lie<20;lie++){ printw("--"); } printw("\n"); printw("by ricko"); } } } void addNode(){ //加头并且方向 struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake)); new->next = NULL; switch(dir){ case UP: new->hang = tail->hang-1; new->lie = tail->lie; break; case DOWN: new->hang = tail->hang+1; new->lie = tail->lie; break; case LEFT: new->hang = tail->hang; new->lie = tail->lie-1; break; case RIGHT: new->hang = tail->hang; new->lie = tail->lie+1; break; } tail->next = new; tail = new; } void initSnake(){ //初始化蛇 struct Snake *p; dir = RIGHT; while(head != NULL){ p = head; head = head->next; free(p); } initFood(); head = (struct Snake *)malloc(sizeof(struct Snake)); head->hang = 1; head->lie = 1; head->next = NULL; tail = head; addNode(); addNode(); addNode(); addNode(); } void deleNode(){ //删除最后节点 struct Snake *p; p = head; head = head->next; free(p); } int ifSnakeDie(){ //在撞到边界以及自己迟到自己的时候会输出一个1让自己复活 struct Snake *p; p = head; if(tail->hang < 0 || tail->lie == 0 || tail->hang == 20 || tail->lie == 20){ return 1; } while(p->next != NULL){ if(p->hang == tail->hang && p->lie == tail->lie){ return 1; } p = p->next; } return 0; } void moveSnake(){ //蛇的移动 addNode(); if(hasFood(tail->hang,tail->lie)){ //如果吃到食物就不删除最后的节点 initFood(); }else{ deleNode(); } if(ifSnakeDie()){ initSnake(); } } void refreshJieMian(){ //刷新界面 线程 while(1){ moveSnake(); gamePic(); refresh(); usleep(150000); //刷新频率 } } void turn(int direction){ //防止方向键按了上又按下 if(abs(dir) != abs(direction)){ dir = direction; } } void changeDir(){ //改变方向 while(1){ key = getch(); switch(key){ case KEY_DOWN: turn(DOWN); break; case KEY_UP: turn(UP); break; case KEY_LEFT: turn(LEFT); break; case KEY_RIGHT: turn(RIGHT); break; } } } int main(){ pthread_t t1; //定义线程1 pthread_t t2; initNcurse(); //初始化ncurse initSnake(); //初始化蛇 gamePic(); //初始化界面 pthread_create(&t1,NULL,refreshJieMian,NULL);//启动线程里面的函数 pthread_create(&t2,NULL,changeDir,NULL); while(1);//线程3 getch(); endwin(); return 0; }
对代码进行编译
gcc snake.c -lcurses -lpthread
生成a.out运行文件
运行代码
./a.out
图片展示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- 网上文章中,在linux下安装node.js都是使用源码编译,其实node的github上已经提供了各个系统下使用各自的包管理器(package manager)安装node.js的方法。...2015-03-15
- grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了linux服务器快速卸载安装node环境(简单上手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
- 这篇文章主要介绍了Linux环境变量配置全攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-03-31
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
Linux下升级安装python3.8并配置pip及yum的教程
这篇文章主要介绍了Linux下升级安装python3.8并配置pip及yum的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-02- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了Linux下安装mysql8.0.20的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-25