当前位置: 编程技术>c/c++/嵌入式
基于C语言实现的贪吃蛇游戏完整实例代码
来源: 互联网 发布时间:2014-10-26
本文导语: 本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助。 贪吃蛇完整实现代码如下: #include #include #include #include #define NULL 0 #define...
本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助。
贪吃蛇完整实现代码如下:
#include #include #include #include #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #define RIGHT 19712 #define ESC 283 #define ENTER 7181 struct snake {int centerx; int centery; int newx; int newy; struct snake *next; }; struct snake *head; int grade=60; /*控制速度的*******/ int a,b; /* 背静遮的 位置*/ void *far1,*far2,*far3,*far4; /* 蛇身指针 背静遮的指针 虫子*/ int size1,size2,size3,size4; /* **全局变量**/ int ch=RIGHT; /**************存按键 开始蛇的方向为RIGHT***********/ int chy=RIGHT; int flag=0; /*********判断是否退出游戏**************/ int control=4; /***********判断上次方向和下次方向不冲突***/ int nextshow=1; /*******控制下次蛇身是否显示***************/ int scenterx; /***************随即矩形中心坐标***************/ int scentery; int sx; /*******在a b 未改变前 得到他们的值 保证随机矩形也不在此出现*******/ int sy; /************************蛇身初始化**************************/ void snakede() { struct snake *p1,*p2; head=p1=p2=(struct snake *)malloc(sizeof(struct snake)); p1->centerx=80; p1->newx=80; p1->centery=58; p1->newy=58; p1=(struct snake *)malloc(sizeof(struct snake)); p2->next=p1; p1->centerx=58; p1->newx=58; p1->centery=58; p1->newy=58; p1->next=NULL; } /*******************end*******************/ void welcome() /*************游戏开始界面 ,可以选择 速度**********/ { int key; int size; int x=240; int y=300; int f; void *buf; setfillstyle(SOLID_FILL,BLUE); bar(98,100,112,125); setfillstyle(SOLID_FILL,RED); bar(98,112,112,114); setfillstyle(SOLID_FILL,GREEN); bar(100,100,110,125); size=imagesize(98,100,112,125); buf=malloc(size); getimage(98,100,112,125,buf); cleardevice(); setfillstyle(SOLID_FILL,BLUE); bar(240,300,390,325); outtextxy(193,310,"speed:"); setfillstyle(SOLID_FILL,RED); bar(240,312,390,314); setcolor(YELLOW); outtextxy(240,330,"DOWN"); outtextxy(390,330,"UP"); outtextxy(240,360,"ENTER to start..." ); outtextxy(270,200,"SNAKE"); fei(220,220); feiyang(280,220); yang(340,220); putimage(x,y,buf,COPY_PUT); setcolor(RED); rectangle(170,190,410,410); while(1) { if(bioskey(1)) /********8选择速度部分************/ key=bioskey(0); switch(key) { case ENTER: f=1; break; case DOWN: if(x>=240) { putimage(x-=2,y,buf,COPY_PUT); grade++; key=0; break; } case UP: if(xcenterx&&scentery==p->centery||scenterx==sx&&scentery==sy) {show=0; jump=1; break; } else p=p->next; if(jump==1) break; } if(show==1) {putimage(scenterx-11,scentery-11,far3,COPY_PUT); nextshow=0; break; } } } /***********过关动画**************/ void donghua() { int i; cleardevice(); setbkcolor(BLACK); randomize(); while(1) {for(i=0;inewy; /************记录最后节点的坐标************/ sx=a; sy=b; } p1->newx=p2->centerx; p1->newy=p2->centery; p2=p1; } p1=head; while(p1!=NULL) {p1->centerx=p1->newx; p1->centery=p1->newy; p1=p1->next; } /********判断按键方向*******/ if(bioskey(1)) { ch=bioskey(0); if(ch!=RIGHT&&ch!=LEFT&&ch!=UP&&ch!=DOWN&&ch!=ESC) /********chy为上一次的方向*********/ ch=chy; } switch(ch) { case LEFT: if(control!=4) {head->newx=head->newx-22; head->centerx=head->newx; control=2; if(head->newxnewx=head->newx+22; head->centerx=head->newx; control=4; if(head->newx>377) gameover(); } chy=ch; break; case DOWN: if(control!=1) { head->newy=head->newy+22; head->centery=head->newy; control=3; if(head->newy>377) gameover(); } else { head->newy=head->newy-22; head->centery=head->newy; control=1; if(head->newynewx=head->newx+22; head->centerx=head->newx; control=4; if(head->newx>377) gameover(); } else { head->newx=head->newx-22; head->centerx=head->newx; control=2; if(head->newxnewy=head->newy-22; head->centery=head->newy; control=1; if(head->newynewy=head->newy+22; head->centery=head->newy; control=3; if(head->newy>377) gameover(); } chy=ch; break; case ESC: flag=1; break; } /* if 判断是否吃蛇*/ if(flag!=1) { if(head->newx==scenterx&&head->newy==scentery) { p3=head; while(p3!=NULL) { p4=p3; p3=p3->next; } p3=(struct snake *)malloc(sizeof(struct snake)); p4->next=p3; p3->centerx=a; p3->newx=a; p3->centery=b; p3->newy=b; p3->next=NULL; a=500; b=500; putimage(409,62,far4,COPY_PUT); /********** 分数框挡住**************/ putimage(500,62,far4,COPY_PUT); /*********把以前的剩下虫子的框挡住********/ score=(++n)*100; left--; itoa(score,sscore,10); itoa(left,sleft,10); setcolor(RED); outtextxy(415,70,sscore); outtextxy(512,70,sleft); nextshow=1; if(left==0) /************判断是否过关**********/ donghua(); /*******如果过关,播放过关动画*********************/ } p5=head; /*********************判断是否自杀***************************/ p5=p5->next; p5=p5->next; p5=p5->next; p5=p5->next; /****从第五个节点判断是否自杀************/ while(p5!=NULL) {if(head->newx==p5->centerx&&head->newy==p5->centery) { gameover(); break; } else p5=p5->next; } } } /************snakechange()函数结束*******************/ /*****************************主函数******************************************/ int main() { int i; init(); /**********初始化图形系统**********/ welcome(); /*********8欢迎界面**************/ bort(); /*********主场景***************/ snakede(); /**********连表初始化**********/ while(1) { snakechange(); if(flag==1) break; snakepaint(); ran(); for(i=0;i