Linux下C语言实现贪吃蛇小游戏
本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下
此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的
心得:
1.自己对linux中如何使用vi更加熟悉
如::wqyyppddu等等
2.对c语言的指针,结构体,链表等更加的牢固
3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础
代码展示
#include#include #defineUP1//1与-1的目的是使用abs()函数防止一上一下 #defineDOWN-1 #defineLEFT2 #defineRIGHT-2 structSnake{//创建一个结构体 inthang; intlie; structSnake*next; }; structSnake*head=NULL;//全局定义一个头和尾 structSnake*tail=NULL; intkey;//定义一个按键的整形变量 intdir;//定义一个方向的整形变量 structSnakefood; voidinitFood(){//定义一个食物##可以随机生成 intx=rand()%19; inty=rand()%19; food.hang=x; food.lie=y; } voidinitNcurse(){ initscr(); keypad(stdscr,1); noecho(); } inthasSnakeNode(inti,intj){//显示蛇身体 structSnake*p; p=head; while(p!=NULL){ if(p->hang==i&&p->lie==j){ return1; } p=p->next; } return0; } inthasFood(inti,intj){//有食物 if(food.hang==i&&food.lie==j){ return1; } return0; } voidgamePic(){//游戏图形化展示 inthang; intlie; 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("|"); }elseif(hasSnakeNode(hang,lie)){ printw("[]"); }elseif(hasFood(hang,lie)){ printw("##"); } else{ printw(""); } } printw("\n"); } if(hang==19){ for(lie=0;lie<20;lie++){ printw("--"); } printw("\n"); printw("byricko"); } } } voidaddNode(){//加头并且方向 structSnake*new=(structSnake*)malloc(sizeof(structSnake)); new->next=NULL; switch(dir){ caseUP: new->hang=tail->hang-1; new->lie=tail->lie; break; caseDOWN: new->hang=tail->hang+1; new->lie=tail->lie; break; caseLEFT: new->hang=tail->hang; new->lie=tail->lie-1; break; caseRIGHT: new->hang=tail->hang; new->lie=tail->lie+1; break; } tail->next=new; tail=new; } voidinitSnake(){//初始化蛇 structSnake*p; dir=RIGHT; while(head!=NULL){ p=head; head=head->next; free(p); } initFood(); head=(structSnake*)malloc(sizeof(structSnake)); head->hang=1; head->lie=1; head->next=NULL; tail=head; addNode(); addNode(); addNode(); addNode(); } voiddeleNode(){//删除最后节点 structSnake*p; p=head; head=head->next; free(p); } intifSnakeDie(){//在撞到边界以及自己迟到自己的时候会输出一个1让自己复活 structSnake*p; p=head; if(tail->hang<0||tail->lie==0||tail->hang==20||tail->lie==20){ return1; } while(p->next!=NULL){ if(p->hang==tail->hang&&p->lie==tail->lie){ return1; } p=p->next; } return0; } voidmoveSnake(){//蛇的移动 addNode(); if(hasFood(tail->hang,tail->lie)){//如果吃到食物就不删除最后的节点 initFood(); }else{ deleNode(); } if(ifSnakeDie()){ initSnake(); } } voidrefreshJieMian(){//刷新界面线程 while(1){ moveSnake(); gamePic(); refresh(); usleep(150000);//刷新频率 } } voidturn(intdirection){//防止方向键按了上又按下 if(abs(dir)!=abs(direction)){ dir=direction; } } voidchangeDir(){//改变方向 while(1){ key=getch(); switch(key){ caseKEY_DOWN: turn(DOWN); break; caseKEY_UP: turn(UP); break; caseKEY_LEFT: turn(LEFT); break; caseKEY_RIGHT: turn(RIGHT); break; } } } intmain(){ pthread_tt1;//定义线程1 pthread_tt2; initNcurse();//初始化ncurse initSnake();//初始化蛇 gamePic();//初始化界面 pthread_create(&t1,NULL,refreshJieMian,NULL);//启动线程里面的函数 pthread_create(&t2,NULL,changeDir,NULL); while(1);//线程3 getch(); endwin(); return0; }
对代码进行编译
gccsnake.c-lcurses-lpthread
生成a.out运行文件
运行代码
./a.out
图片展示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。