基於C說話完成的貪吃蛇游戲完全實例代碼。本站提示廣大學習愛好者:(基於C說話完成的貪吃蛇游戲完全實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是基於C說話完成的貪吃蛇游戲完全實例代碼正文
本文以實例的情勢講述了基於C說話完成的貪吃蛇游戲代碼,這是一個比擬罕見的游戲,代碼備有比擬具體的正文,關於讀者懂得有必定的贊助。
貪吃蛇完全完成代碼以下:
#include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #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(x<=375) { putimage(x+=2,y,buf,COPY_PUT); grade--; key=0; break; } } if (f==1) break; } /********** end ****************/ free(buf); } /*************************隨即矩形*****************/ /***********當nextshow 為1的時刻才挪用此函數**********/ void ran() { int nx; int ny; int show; /**********掌握能否顯示***********/ int jump=0; struct snake *p; p=head; if(nextshow==1) /***********能否開端隨機發生***************/ while(1) {show=1; randomize(); nx=random(14); ny=random(14); scenterx=nx*22+58; scentery=ny*22+58; while(p!=NULL) { if(scenterx==p->centerx&&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;i<=5;i++) {putpixel(random(640),random(80),13); putpixel(random(640),random(80)+80,2); putpixel(random(640),random(80)+160,3); putpixel(random(640),random(80)+240,4); putpixel(random(640),random(80)+320,1); putpixel(random(640),random(80)+400,14); } setcolor(YELLOW); settextstyle(0,0,4); outtextxy(130,200,"Wonderful!!"); setfillstyle(SOLID_FILL,10); bar(240,398,375,420); feiyang(300,400); fei(250,400); yang(350,400); if(bioskey(1)) if(bioskey(0)==ESC) { flag=1; break; } } } /*************************end************************/ /***********************初始化圖形體系*********************/ void init() {int a=DETECT,b; int i,j; initgraph(&a,&b,""); } /***************************end****************************/ /***畫平面邊框後果函數******/ void tline(int x1,int y1,int x2,int y2,int white,int black) { setcolor(white); line(x1,y1,x2,y1); line(x1,y1,x1,y2); setcolor(black); line(x2,y1,x2,y2); line(x1,y2,x2,y2); } /****end*********/ /*************飛洋標記**********/ int feiyang(int x,int y) {int feiyang[18][18]={ {0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0}, {0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0}, {0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0}, {0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0}, {0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0}, {0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0}, {0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0}, {0,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0}, {0,0,1,1,1,0,0,0,0,1,0,1,1,1,0,0,0,0}, {0,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0}, {0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, {0,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0}, {0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1,0,0}, {0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0}, {0,0,0,1,1,1,0,1,1,1,1,1,0,0,1,0,0,0}, {0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0}, {0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0}, {0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0}}; int i,j; for(i=0;i<=17;i++) for(j=0;j<=17;j++) {if (feiyang[i][j]==1) putpixel(j+x,i+y,RED); } } /********"飛"字*************/ int fei(int x,int y) {int fei[18][18]={{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, {0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0}}; int i,j; for(i=0;i<=17;i++) for(j=0;j<=17;j++) {if (fei[i][j]==1) putpixel(j+x,i+y,BLUE); } } /*********"洋"字**************/ int yang(int x,int y) { int yang[18][18]={{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0}, {1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0}, {0,1,1,1,0,0,0,1,1,1,0,1,1,0,0,0,0,0}, {0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,0}, {0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0}, {0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0}, {0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0}, {0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0}, {0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0}, {1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, {0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}}; int i,j; for(i=0;i<=17;i++) for(j=0;j<=17;j++) {if (yang[i][j]==1) putpixel(j+x,i+y,BLUE); } } /******************主場景**********************/ int bort() { int a; setfillstyle(SOLID_FILL,15); bar(49,49,71,71); setfillstyle(SOLID_FILL,BLUE); bar(50,50,70,70); size1=imagesize(49,49,71,71); far1=(void *)malloc(size1); getimage(49,49,71,71,far1); cleardevice(); setfillstyle(SOLID_FILL,12); bar(49,49,71,71); size2=imagesize(49,49,71,71); far2=(void *)malloc(size2); getimage(49,49,71,71,far2); setfillstyle(SOLID_FILL,12); bar(49,49,71,71); setfillstyle(SOLID_FILL,GREEN); bar(50,50,70,70); size3=imagesize(49,49,71,71); far3=(void *)malloc(size3); getimage(49,49,71,71,far3); cleardevice(); /*取蛇身節點 配景節點 蟲子節點end*/ setbkcolor(8); setfillstyle(SOLID_FILL,GREEN); bar(21,23,600,450); tline(21,23,600,450,15,8); /***開端游戲場景邊框 平面後果*******/ tline(23,25,598,448,15,8); tline(45,45,379,379,8,15); tline(43,43,381,381,8,15); tline(390,43,580,430,8,15); tline(392,45,578,428,8,15); tline(412,65,462,85,15,8); tline(410,63,464,87,15,8); tline(410,92,555,390,15,8); tline(412,94,553,388,15,8); tline(431,397,540,420,15,8); tline(429,395,542,422,15,8); tline(46,386,377,428,8,15); tline(44,384,379,430,8,15); setcolor(8); outtextxy(429,109,"press ENTER "); outtextxy(429,129,"---to start"); /*鍵盤掌握解釋*/ outtextxy(429,169,"press ESC "); outtextxy(429,189,"---to quiet"); outtextxy(469,249,"UP"); outtextxy(429,289,"LEFT"); outtextxy(465,329,"DOWN"); outtextxy(509,289,"RIGHT"); setcolor(15); outtextxy(425,105,"press ENTER "); outtextxy(425,125,"---to start"); outtextxy(425,165,"press ESC "); outtextxy(425,185,"---to quiet"); outtextxy(465,245,"UP"); outtextxy(425,285,"LEFT"); outtextxy(461,325,"DOWN"); outtextxy(505,285,"RIGHT"); /*******end*************/ setcolor(8); outtextxy(411,52,"score"); outtextxy(514,52,"left"); setcolor(15); outtextxy(407,48,"score"); outtextxy(510,48,"left"); size4=imagesize(409,62,465,88); /****分數框放到內存********/ far4=(void *)malloc(size4); getimage(409,62,465,88,far4); putimage(500,62,far4,COPY_PUT); /*******輸入性命框***********/ setfillstyle(SOLID_FILL,12); setcolor(RED); outtextxy(415,70,"0"); /***************輸出分數為零**********/ outtextxy(512,70,"20"); /*************顯示還要吃 的蟲子的數量*********/ bar(46,46,378,378); feiyang(475,400); fei(450,400); yang(500,400); outtextxy(58,390,"mailto:[email protected]"); outtextxy(58,410,"snake game"); outtextxy(200,410,"made by yefeng"); while(1) { if(bioskey(1)) a=bioskey(0); if(a==ENTER) break; } } /******************gameover()******************/ void gameover() { char *p="GAME OVER"; int cha; setcolor(YELLOW); settextstyle(0,0,6); outtextxy(100,200,p); while(1) {if(bioskey(1)) cha=bioskey(0); if(cha==ESC) {flag=1; break; } } } /***********顯示蛇身**********************/ void snakepaint() {struct snake *p1; p1=head; putimage(a-11,b-11,far2,COPY_PUT); while(p1!=NULL) {putimage(p1->newx-11,p1->newy-11,far1,COPY_PUT); p1=p1->next; } } /****************end**********************/ /*********************蛇身刷新變更 游戲症結部門 *******************/ void snakechange() {struct snake *p1,*p2,*p3,*p4,*p5; int i,j; static int n=0; static int score; static int left=20; char sscore[5]; char sleft[1]; p2=p1=head; while(p1!=NULL) { p1=p1->next; if(p1->next==NULL) {a=p1->newx; b=p1->newy; /************記載最初節點的坐標************/ 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->newx<47) gameover(); } else { head->newx=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->newy<47) gameover(); } chy=ch; break; case RIGHT: if(control!=2) { head->newx=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->newx<47) gameover(); } chy=ch; break; case UP: if(control!=3) { head->newy=head->newy-22; head->centery=head->newy; control=1; if(head->newy<47) gameover(); } else { head->newy=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<=grade;i++) delay(3000); } free(far1); free(far2); free(far3); free(far4); closegraph(); return 0; }