C語言開發實現貪吃蛇遊戲
阿新 • • 發佈:2020-07-28
本文例項為大家分享了C語言實現貪吃蛇遊戲的具體程式碼,供大家參考,具體內容如下
1、最好用VS執行
2、用到的函式有:_kbhit _getch EasyX圖形庫內一系列函式
3、蛇身與食物用矩形畫的
程式碼如下:
#include<stdio.h> #include<graphics.h> //easyx標頭檔案 #include<conio.h> #include<time.h> /********************設定各種屬性**********************/ //座標屬性 typedef struct point { int x,y; }PYINT; //蛇 struct snake { PYINT xy[100]; //蛇的每節座標放到陣列中 int position; //方向 int num; //長度 }SNAKE; //食物 struct food{ PYINT fdxy; int flag; //是否存在 int grade; //成績 }FOOD; //列舉:方向 //也可用巨集 #define enum position { up,down,left,right }; /**********************對蛇的操作*****************************/ //初始化蛇 //蛇的每節為 10x10填充的矩形 void initsnake() { SNAKE.xy[0].x = 0; SNAKE.xy[0].y = 0; //陣列第一個元素為蛇頭 SNAKE.xy[1].x = 10; SNAKE.xy[1].y = 0; SNAKE.xy[2].x = 20; SNAKE.xy[2].y = 0; SNAKE.position = right; //方向 (隨便給) SNAKE.num = 3; //數量 (隨便給) } //畫蛇 void Drawsnake() { for (int i = 0; i < SNAKE.num; i++) { setlinecolor(BLACK); setfillcolor(RGB(rand() % 255,rand() % 255,rand() % 255)); fillrectangle(SNAKE.xy[i].x,SNAKE.xy[i].y,SNAKE.xy[i].x + 10,SNAKE.xy[i].y + 10); } } //使蛇動起來 /* 蛇頭每向前動一格,其後緊隨蛇頭: 我們把蛇的每節座標放到數組裡(蛇頭座標放在陣列的第一個),移動時,只需使蛇頭(陣列第一個元素)改變,其後與前面交換; */ void Movesnake() { for (int i = SNAKE.num; i > 0; i--) { SNAKE.xy[i].x = SNAKE.xy[i - 1].x; SNAKE.xy[i].y = SNAKE.xy[i - 1].y; //使每個元素向前移動 } switch (SNAKE.position) { case up: SNAKE.xy[0].y -= 10; break; case down: SNAKE.xy[0].y += 10; break; //上下移動 X座標不發生改變 case left: SNAKE.xy[0].x -= 10; break; case right: SNAKE.xy[0].x += 10; break; //左右移動 Y座標不發生改變 } } /******************************按鍵操作*****************************************/ //當蛇向上運動時,按向下鍵無效(其他三個相同) void Keydown() { char ch = _getch(); switch (ch) { case 'W': case 'w': case 72: //小鍵盤上的“向上” if (SNAKE.position != down) //是否向下 SNAKE.position = up; break; case 'S': case 's': case 80: //小鍵盤上的“向下” if (SNAKE.position != up) //是否向上 SNAKE.position = down; break; case 'A': case 'a': case 75: //小鍵盤上的“向左” if (SNAKE.position != right) //是否向右 SNAKE.position = left; break; case 'D': case 'd': case 77: //小鍵盤上的“向右” if (SNAKE.position != left) //是否向左 SNAKE.position = right; break; } } /******************************食物操作**************************************/ //初始化食物 void initfood() { FOOD.fdxy.x = rand() % 60 * 10; FOOD.fdxy.y = rand() % 40 * 10; //把食物的座標控制在遊戲介面內 FOOD.flag = 1; //1代表存在食物 //FOOD.grade = 0; for (int i = 0; i < SNAKE.num; i++) { if (FOOD.fdxy.x == SNAKE.xy[i].x&&FOOD.fdxy.y == SNAKE.xy[i].y) //如果食物出現在蛇身上,重新產生X Y的值 { FOOD.fdxy.x = rand() % 60 * 10; FOOD.fdxy.y = rand() % 40 * 10; } } } //畫食物 void Drawfood() { setlinecolor(BLACK); setfillcolor(RGB(rand() % 255,rand() % 255)); fillrectangle(FOOD.fdxy.x,FOOD.fdxy.y,FOOD.fdxy.x + 10,FOOD.fdxy.y + 10); } /*************************************吃食物*************************************************/ void eatfood() { if (SNAKE.xy[0].x == FOOD.fdxy.x&&SNAKE.xy[0].y == FOOD.fdxy.y) { SNAKE.num++; FOOD.flag = 0; //食物存在的標記(1:存在 0;不存在) FOOD.grade += 10; //每吃一個食物分數加10 (每個食物是10分,可隨意改變) } } /*************************************顯示分數*************************************************/ void putgrade() { char str[20] = " "; sprintf_s(str,"greade: %d",FOOD.grade); settextcolor(RED); //設定字型顏色 outtextxy(500,50,str); } /***********************************遊戲結束***************************************************/ //當蛇頭撞牆(蛇頭撞上自身) //只分析一種情況 int gameover() { if (SNAKE.xy[0].x > 600 || SNAKE.xy[0].x < 0 | SNAKE.xy[0].y>400 || SNAKE.xy[0].y < 0) //撞牆 { initgraph(800,600); settextcolor(RED); outtextxy(600,400,"你撞牆了"); settextcolor(YELLOW); settextstyle(50,"楷體"); //字型樣式 outtextxy(200,250,"GAME OVER"); //指定位置輸出字串 return 1; } return 0; } /*****************************************************************************************/ int main() { initgraph(600,400); setbkcolor(BLACK); //背景顏色 cleardevice(); //清屏:重新整理螢幕 srand((unsigned int)time(NULL)); //隨機數種子 initsnake(); Drawsnake(); while (1) { cleardevice(); //清屏 Movesnake(); Drawsnake(); if (FOOD.flag == 0) { initfood(); } Drawfood(); if (_kbhit()) { //_kbhit: 檢測是否有按鍵動作 Keydown(); } if (gameover()) { //若函式返回1:結束遊戲 break; } eatfood(); putgrade(); Sleep(100); //延長時間 (即蛇移動的速度) } _getch(); //防止閃屏 closegraph(); //關閉視窗 return 0; } /**********************************************************/ //RGB(rand() % 255,rand() % 255) 在三基色範圍內隨機產生 //記得安裝EasyX外掛
更多有趣的經典小遊戲實現專題,分享給大家:
C++經典小遊戲彙總
python經典小遊戲彙總
python俄羅斯方塊遊戲集合
JavaScript經典遊戲 玩不停
java經典小遊戲彙總
javascript經典小遊戲彙總
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。