C语言实现贪吃蛇代码
本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下
#include"stdafx.h" #include#include #include #include #include #defineU1 #defineD2 #defineL3 #defineR4//蛇的状态U:上D:下L:左R:右 typedefstructsnake//蛇身的一个节点 { intx;//节点的x坐标 inty;//节点的y坐标 structsnake*next;//蛇身的下一个节点 }snake; intscore=0,add=10;//总得分和每吃一次食物的得分 inthighscore=0;//最高分 intstatus,sleeptime=200;//蛇前进状态,每次运行的时间间隔 snake*head,*food;//蛇头指针,食物指针 snake*q;//遍历蛇时用的指针 intendgamestatus=0;//游戏结束时的状态 HANDLEhOut;//控制台句柄 voidgotoxy(intx,inty); intcolor(intc); voidprintsnake(); voidwlcome(); voidcreatemap(); voidscoreandtips(); voidinitsnake(); voidcreatefood(); intbiteself(); voidcantcrosswall(); voidspeedup(); voidspeeddown(); voidsnakemove(); voidkeyboardcontrol(); voidlostdraw(); voidendgame(); voidchoose(); voidfile_out(); voidfile_in(); voidexplation(); main() { system("modeconcols=100lines=30"); printsnake(); wlcome(); file_out(); keyboardcontrol(); endgame(); } voidgotoxy(intx,inty)//设置光标位置 {COORDc; c.X=x; c.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);//定位光标的位置 } intcolor(intc)//设置颜色 { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); return0; } voidprintsnake()//打印字符蛇 { gotoxy(2,5); color(3); printf("姓名:张小艾"); gotoxy(2,6); color(3); printf("学号:1910101099"); gotoxy(35,1); color(6); printf("/^\\/^\\"); gotoxy(34,2); printf("|_|o|"); gotoxy(33,2); color(2); printf("_"); gotoxy(25,3); color(12); printf("\\/"); gotoxy(31,3); color(2); printf("/"); gotoxy(37,3); color(6); printf("\\_/"); gotoxy(41,3); color(10); printf("\\"); gotoxy(26,4); color(12); printf("\\____"); gotoxy(32,4); printf("_________"); gotoxy(31,4); color(2); printf("|"); gotoxy(43,4); color(10); printf("\\"); gotoxy(32,5); color(2); printf("\\_______"); gotoxy(44,5); color(10); printf("\\"); gotoxy(39,6); printf("||\\"); gotoxy(38,7); printf("//\\"); gotoxy(37,8); printf("//\\\\"); gotoxy(35,9); printf("//\\\\"); gotoxy(34,10); printf("//\\\\"); gotoxy(33,11); printf("//_----_\\\\"); gotoxy(32,12); printf("//_-~~-_||"); gotoxy(31,13); printf("((_-~_--_~-__/|"); gotoxy(32,14); printf("\\~-____-~_-~~-_~-_-~/"); gotoxy(33,15); printf("~-__-~~-__-~"); gotoxy(35,16); printf("~--____-~~-___-~"); } voidwlcome()//欢迎界面 {intn; inti,j=1; gotoxy(43,18); color(11); printf("贪吃蛇大作战"); color(14); for(i=20;i<=26;i++) { for(j=27;j<=74;j++) { gotoxy(j,i); if(i==20||i==26) { printf("-"); } elseif(j==27||j==74) { printf("|"); } } } color(12); gotoxy(35,22); printf("1.开始游戏"); gotoxy(55,22); printf("2.游戏说明"); gotoxy(35,24); printf("3.退出游戏"); gotoxy(29,27); color(3); printf("请选择123\n"); color(14); scanf("%d",&n); switch(n) { case1: system("cls");//清屏 createmap(); initsnake(); createfood(); keyboardcontrol(); break; case2: explation(); break; break; case3: exit(0); break; } } voidcreatemap()//创建地图 { inti,j; for(i=0;i<58;i+=2) { gotoxy(i,0); color(5); printf("□"); gotoxy(i,26); printf("□"); } for(i=0;i<26;i++) { gotoxy(0,i); printf("□"); gotoxy(56,i); printf("□"); } for(i=2;i<56;i+=2) { for(j=1;j<26;j++) { gotoxy(i,j); color(3); printf("■\n\n"); } } } voidscoreandtips()//游戏界面右侧的得分和小提示 { file_out(); gotoxy(64,4); color(11); printf("*最高纪录*:%d",highscore); gotoxy(64,8); color(14); printf("得分:%d",score); color(13); gotoxy(73,11); printf("小提示"); gotoxy(60,13); color(6); printf("+---------------------+"); gotoxy(60,25); printf("+---------------------+"); color(3); gotoxy(64,14); printf("每个食物得分:%d分",add); gotoxy(64,16); printf("不能穿墙,不能咬到自己"); gotoxy(64,18); printf("用↑↓←→分别控制蛇的移动"); gotoxy(64,20); printf("F1为加速,F2为减速"); gotoxy(64,22); printf("space:暂停游戏"); gotoxy(64,24); printf("ESC:退出游戏"); } voidfile_out()//打开文件记录最高分 { FILE*fp; fp=fopen("save.txt","a+"); fscanf(fp,"%d",&highscore); fclose(fp); } voidinitsnake() { snake*tail; inti; tail=(snake*)malloc(sizeof(snake)); tail->x=24; tail->y=5; tail->next=NULL; for(i=1;i<=4;i++) { head=(snake*)malloc(sizeof(snake)); head->next=tail; head->x=24+2*i; head->y=5; tail=head; } while(tail!=NULL) {gotoxy(tail->x,tail->y); color(14); printf("★");//蛇身由★组成 tail=tail->next; } } voidcreatefood()//随机出现食物 { snake*food_1; srand((unsigned)time(NULL)); food_1=(snake*)malloc(sizeof(snake)); while((food_1->x%2!=0)) { food_1->x=rand()%52+2; } food_1->y=rand()%24+1; q=head; while(q->next==NULL) { if(q->x==food_1->x&&q->y==food_1->y) { free(food_1); createfood(); } q=q->next; } gotoxy(food_1->x,food_1->y); food=food_1; color(12); printf("@"); } intbiteself() { snake*self;//定义self为蛇身上除蛇头以外的节点 self=head->next; while(self!=NULL) { if(self->x==head->x&&self->y==head->y) { return1; } self=self->next; } return0; } voidcantcrosswall() { if(head->x==0||head->x==56||head->y==0||head->y==26) { endgamestatus=1; endgame(); } } voidspeedup()//加速 { if(sleeptime>=50) { sleeptime=sleeptime-10; add=add+2; } } voidspeeddown()//减速 { if(sleeptime<350) { sleeptime=sleeptime+30; add=add-2; if(sleeptime==350) { add=1; } } } voidsnakemove()//控制方向 { snake*nexthead; cantcrosswall(); nexthead=(snake*)malloc(sizeof(snake)); if(status==U)//上 { nexthead->x=head->x;//向上前进时,x不变,y-1 nexthead->y=head->y-1; nexthead->next=head; head=nexthead; q=head; //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 if(nexthead->x==food->x&&nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } score=score+add; speedup(); createfood(); } else { while(q->next->next!=NULL)//如果没有遇见食物 { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } //经过上面的循环,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 gotoxy(q->next->x,q->next->y); color(3); printf("■");//恢复走过的位置 free(q->next); q->next=NULL; } } if(status==D) { nexthead->x=head->x;//向下前进时,x不变,y+1 nexthead->y=head->y+1; nexthead->next=head; head=nexthead; q=head; //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 if(nexthead->x==food->x&&nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } score=score+add; speedup(); createfood(); } else { while(q->next->next!=NULL)//如果没有遇见食物 { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } //经过上面的循环,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 gotoxy(q->next->x,q->next->y); color(3); printf("■");//恢复走过的位置 free(q->next); q->next=NULL; } } if(status==L)//左 { nexthead->x=head->x-2;//向左前进时,x不变,y+1 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 if(nexthead->x==food->x&&nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y);//食物变成蛇身上的一部分 color(14); printf("★"); q=q->next; } score=score+add; speedup(); createfood(); } else { while(q->next->next!=NULL)//如果没有遇见食物 { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } //经过上面的循环,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 gotoxy(q->next->x,q->next->y); color(3); printf("■");//恢复走过的位置 free(q->next); q->next=NULL; } } if(status==R) { nexthead->x=head->x+2;//向上前进时,x不变,y-1 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同 if(nexthead->x==food->x&&nexthead->y==food->y) { while(q!=NULL) { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } score=score+add; speedup(); createfood(); } else { while(q->next->next!=NULL)//如果没有遇见食物 { gotoxy(q->x,q->y); color(14); printf("★"); q=q->next; } //经过上面的循环,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 gotoxy(q->next->x,q->next->y); color(3); printf("■");//恢复走过的位置 free(q->next); q->next=NULL; } } if(biteself()==1) { endgamestatus=2; endgame(); } } voidkeyboardcontrol() { status=R; while(1) { scoreandtips(); //GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态 if(GetAsyncKeyState(VK_UP)&&status!=D) { status=U; } elseif(GetAsyncKeyState(VK_DOWN)&&status!=U) { status=D; } elseif(GetAsyncKeyState(VK_LEFT)&&status!=R) { status=L; } elseif(GetAsyncKeyState(VK_RIGHT)&&status!=L) { status=R; } if(GetAsyncKeyState(VK_SPACE)) { while(1) { //调用sleep函数,令进程停止,直到达到其中设定的参数时间 Sleep(300); if(GetAsyncKeyState(VK_SPACE)) { break; } } } elseif(GetAsyncKeyState(VK_ESCAPE)) { endgamestatus=3; break; } elseif(GetAsyncKeyState(VK_F1)) { speedup(); } elseif(GetAsyncKeyState(VK_F2)) { if(sleeptime<350) { sleeptime=sleeptime+30; add=add-2; if(sleeptime==350) { add=1; } } } Sleep(sleeptime); snakemove(); } } voidlostdraw() { system("cls"); inti,j; gotoxy(17,5); color(11); printf("+------------------------"); gotoxy(35,5); color(14); printf("o00o"); gotoxy(39,5); color(11); printf("----------"); gotoxy(48,5); color(14); printf("---"); gotoxy(51,5); color(11); printf("----------"); gotoxy(61,5); color(14); printf("o00o"); gotoxy(65,5); color(11); printf("-----------------+"); for(i=6;i<=19;i++) { gotoxy(17,i); printf("|"); gotoxy(82,i); printf("|"); } gotoxy(17,20); printf("+----------------------------------"); gotoxy(52,20); color(11); printf("-----------------------------+"); } voidendgame() { system("cls"); if(endgamestatus==1) { lostdraw(); gotoxy(35,9); color(12); printf("对不起,您撞到墙了。游戏结束!"); } elseif(endgamestatus==2) { lostdraw(); gotoxy(35,9); color(12); printf("对不起,您咬到自己了。游戏结束!"); } elseif(endgamestatus==3) { lostdraw(); gotoxy(40,9); color(12); printf("您结束了游戏。"); } gotoxy(43,12); color(13); printf("您的得分是%d",score); if(score>=highscore) { color(10); gotoxy(33,16); printf("创新纪录啦!你真棒!!!"); file_in(); } choose(); } voidfile_in()//将最高分存储到文件中 { FILE*fp; fp=fopen("save.txt","w+");//以读写的方式建立文件 fprintf(fp,"%d",score); fclose(fp); } voidchoose() { intn; gotoxy(25,23); color(12); printf("重玩一局-------1"); gotoxy(52,23); printf("不玩了,退出-------2"); gotoxy(46,25); color(11); printf("选择:"); scanf("%d",&n); switch(n) { case1: system("cls"); score=0; sleeptime=200; add=10; printsnake(); wlcome(); break; case2: exit(0); break; default: gotoxy(35,27); color(12); printf("您输入有误,请重新输入"); system("pause>nul");//按任意键 endgame(); choose(); break; } } voidexplation() { inti,j=1; system("cls"); color(13); gotoxy(44,3); printf("游戏说明"); color(2); for(i=6;i<=22;i++) { for(j=20;j<=75;j++) { gotoxy(j,i); if(i==6||i==22)printf("="); elseif(j==20||j==75)printf("||"); } } color(3); gotoxy(30,8); printf("1、不能穿墙,不能咬到自己"); color(3); gotoxy(30,8); printf("1、不能穿墙,不能咬到自己"); color(10); gotoxy(30,11); printf("2、用↑↓←→分别控制蛇的移动"); color(14); gotoxy(30,14); printf("3、F1为加速,F2为减速"); color(11); gotoxy(30,17); printf("4、按空格键暂停游戏,再按空格键继续"); color(4); gotoxy(30,20); printf("5、ESC:退出游戏,space:暂停游戏"); getch();//按任意键返回主界面 system("cls"); printsnake(); wlcome(); }
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。