C語言程式設計小遊戲——貪吃蛇,覺得不錯請關注點贊加轉發!
阿新 • • 發佈:2018-12-08
C/C++企業實戰級課程資源(素材+原始碼+視訊)、編譯大禮包免費分享,需要的加學習群892643663。
#define N 200 #include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b int i,key; int score=0;/*得分*/ int gamespeed=50000;/*遊戲速度自己調整*/ struct Food { int x;/*食物的橫座標*/ int y;/*食物的縱座標*/ int yes;/*判斷是否要出現食物的變數*/ }food;/*食物的結構體*/ struct Snake { int x[N]; int y[N]; int node;/*蛇的節數*/ int direction;/*蛇移動方向*/ int life;/* 蛇的生命,0活著,1死亡*/ }snake; void Init(void);/*圖形驅動*/ void Close(void);/*圖形結束*/ void DrawK(void);/*開始畫面*/ void GameOver(void);/*結束遊戲*/ void GamePlay(void);/*玩遊戲具體過程*/ void PrScore(void);/*輸出成績*/ /*主函式*/ void main(void) { Init();/*圖形驅動*/ DrawK();/*開始畫面*/ GamePlay();/*玩遊戲具體過程*/ Close();/*圖形結束*/ } /*圖形驅動*/ void Init(void) { intgd=DETECT,gm; initgraph(&gd,&gm,"c:\\tc"); cleardevice(); } /*開始畫面,左上角座標為(50,40),右下角座標為(610,460)的圍牆*/ void DrawK(void) { /*setbkcolor(LIGHTGREEN);*/ setcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設定線型*/ for(i=50;i<=600;i+=10)/*畫圍牆*/ { rectangle(i,40,i+10,49); /*上邊*/ rectangle(i,451,i+10,460);/*下邊*/ } for(i=40;i<=450;i+=10) { rectangle(50,i,59,i+10); /*左邊*/ rectangle(601,i,610,i+10);/*右邊*/ } } /*玩遊戲具體過程*/ void GamePlay(void) { randomize();/*隨機數發生器*/ food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/ snake.life=0;/*活著*/ snake.direction=1;/*方向往右*/ snake.x[0]=100;snake.y[0]=100;/*蛇頭*/ snake.x[1]=110;snake.y[1]=100; snake.node=2;/*節數*/ PrScore();/*輸出得分*/ while(1)/*可以重複玩遊戲,壓ESC鍵結束*/ { while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/ { if(food.yes==1)/*需要出現新食物*/ { food.x=rand()%400+60; food.y=rand()%350+60; while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/ food.x++; while(food.y%10!=0) food.y++; food.yes=0;/*畫面上有食物了*/ } if(food.yes==0)/*畫面上有食物了就要顯示*/ { setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); } for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/ { snake.x=snake.x[i-1]; snake.y=snake.y[i-1]; } /*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/ switch(snake.direction) { case 1:snake.x[0]+=10;break; case 2: snake.x[0]-=10;break; case 3: snake.y[0]-=10;break; case 4: snake.y[0]+=10;break; } for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/ { if(snake.x==snake.x[0]&&snake.y==snake.y[0]) { GameOver();/*顯示失敗*/ snake.life=1; break; } } if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到牆壁*/ { GameOver();/*本次遊戲結束*/ snake.life=1; /*蛇死*/ } if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內迴圈,重新開始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/ { setcolor(0);/*把畫面上的食物東西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*新的一節先放在看不見的位置,下次迴圈就取前一節的位置*/ snake.node++;/*蛇的身體長一節*/ food.yes=1;/*畫面上需要出現新的食物*/ score+=10; PrScore();/*輸出新得分*/ } setcolor(4);/*畫出蛇*/ for(i=0;i<snake.node;i++) rectangle(snake.x,snake.y,snake.x+10, snake.y-10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的的最後一節*/ rectangle(snake.x[snake.node-1],snake.y[snake.node-1], snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } /*endwhile(!kbhit)*/ if(snake.life==1)/*如果蛇死就跳出迴圈*/ break; key=bioskey(0);/*接收按鍵*/ if(key==ESC)/*按ESC鍵退出*/ break; else if(key==UP&&snake.direction!=4) /*判斷是否往相反的方向移動*/ snake.direction=3; else if(key==RIGHT&&snake.direction!=2) snake.direction=1; else if(key==LEFT&&snake.direction!=1) snake.direction=2; else if(key==DOWN&&snake.direction!=3) snake.direction=4; }/*endwhile(1)*/ } /*遊戲結束*/ void GameOver(void) { cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAME OVER"); getch(); } /*輸出成績*/ void PrScore(void) { char str[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,"score:%d",score); outtextxy(55,20,str); } /*圖形結束*/ void Close(void) { getch(); closegraph(); }
C/C++企業實戰級課程資源(素材+原始碼+視訊)、編譯大禮包免費分享,需要的加學習群892643663。