這篇文章主要為大家詳細介紹了C語言實現——《進化版貪吃蛇項目》,也就是在我們上一個發布的文章項目分享的基礎上,實現貪吃蛇的自動行動,你可以按鍵也可以不按鍵,讓蛇自己找食物!還是挺好玩的,一起來看看吧!
文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下!
項目實現要求:
1.學過C語言
2.熟悉C語言數組
3.熟悉結構體
4.按鍵交互 程序:1.按鍵交互 2.鼠標交互
5.創建圖形窗口
6.基本繪圖
但是這些在我們項目源碼里面都會有注釋,大家到時候學習的時候千萬不要忽略注釋,注釋可以更好地幫你理解代碼,尤其是C語言初學者。
本項目編譯環境:VS2019/VS2013;
插件:圖形庫插件easyX;
本案例配套學習教程:進化版貪吃蛇——嗶哩嗶哩
源代碼示例:
/*1.學過C語言2.熟悉C語言數組3.熟悉結構體4.按鍵交互 程序:1.按鍵交互 2.鼠標交互5.創建圖形窗口6.基本繪圖*///1.把程序所要用的數據抽象出來typedef struct pointXY{int x;int y;}MYPOINT;HWND hwnd = NULL;//蛇struct mySnake{int num;MYPOINT xy[MAX];char postion; //表示方向,標記}snake;//食物struct myFood{MYPOINT foodxy;int flag;int eatGrade;}food;//把方向枚舉出來enum movPostion{right=1,left=2,down=3,up=4};//整個項目劃分//1.初始化蛇void initSnake(){snake.xy[2].x = 0;snake.xy[2].y = 0;snake.xy[1].x = 10;snake.xy[1].y = 0;snake.xy[0].x = 20;snake.xy[0].y = 0;snake.num = 3;snake.postion = right;food.flag = 0;}//2.繪制蛇void drawSnake(){for (int i = 0; i < snake.num; i++){setlinecolor(RED);setfillcolor(GREEN);fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);}}//3.移動蛇void moveSnake(){//除了第一節之外,后面的坐標都是前一節坐標for (int i = snake.num - 1; i > 0; i--){snake.xy[i].x = snake.xy[i - 1].x;snake.xy[i].y = snake.xy[i - 1].y;}//蛇頭怎么走,要根據方向標志去做移動switch (snake.postion){case right:snake.xy[0].x += 10;break;case left:snake.xy[0].x -= 10;break;case down:snake.xy[0].y += 10;break;case up:snake.xy[0].y -= 10;break;}}//4.按鍵用戶:人玩蛇void keyDown(){static char userkey = ''; //VC getch不需要加下劃線//userkey=_getch(); //不可見輸入//自己生成按鍵switch (snake.postion){case right:case left:if (food.foodxy.y >= snake.xy[0].y){userkey = 80;}else if (food.foodxy.y0 ].y){userkey = 72;}break;case up:case down:if (food.foodxy.x >= snake.xy[0].x){userkey = 77;}else if (food.foodxy.x < snake.xy[0].x){userkey = 75;}break;}switch (userkey){case 'w':case 'W':case 72: //上if (snake.postion != down){//蛇往上走,你要排除掉蛇本來是朝下snake.postion = up;}break;case 's':case 'S':case 80: //下if (snake.postion != up){snake.postion = down;}break;case 'a':case 'A':case 75: //左if (snake.postion != right){snake.postion = left;}break;case 'd':case 'D':case 77: //右if (snake.postion != left){snake.postion = right;}}}//初始化食物void initFood(){//0,63 630 640//0,47 470 480food.foodxy.x = rand() % 64 * 10; //只能是10的整數倍,蛇頭才能對齊食物food.foodxy.y = rand() % 48 * 10;food.flag = 1;//食物不能出現在蛇身上for (int i = 0; i < snake.num; i++){if (food.foodxy.x == snake.xy[i].x&&food.foodxy.y == snake.xy[i].y){food.foodxy.x = rand() % 64 * 10; //只能是10的整數倍,蛇頭才能對齊食物food.foodxy.y = rand() % 48 * 10;}}}//繪制食物void drawFood(){fillrectangle(food.foodxy.x, food.foodxy.y, food.foodxy.x + 10, food.foodxy.y + 10);}//蛇吃食物void eatFood(){if (snake.xy[0].x == food.foodxy.x && snake.xy[0].y == food.foodxy.y){snake.num++;food.eatGrade += 10;food.flag = 0;}}//蛇死亡判斷int snakeDie(){//顯示分數char grade[100] = { 0 };sprintf(grade, "%d", food.eatGrade);setbkmode(TRANSPARENT);settextcolor(RED);outtextxy(580, 20, "分數:"); //loadimageouttextxy(620, 20, grade); ////判斷蛇是否死亡//撞墻if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0){MessageBox(hwnd, "游戲結束!", "撞墻死亡!", 0);return 1;}//撞自己for (int i = 1; i < snake.num; i++){if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y){MessageBox(hwnd, "游戲結束!", "撞自己!", 0);return 1;}}return 0;}int main(){srand((unsigned int)time(NULL));hwnd=initgraph(640, 480);setbkcolor(WHITE);cleardevice();initSnake();while (1){cleardevice(); //刷掉路徑if (food.flag == 0){initFood();}drawFood();drawSnake();if (snakeDie()){break;}eatFood();moveSnake();Sleep(100); //控制速度//while (_kbhit()) //kbhit() 存在按鍵操作,返回非零//{// keyDown();//}keyDown();}closegraph();printf("GameOver!!!");system("pause");return 0;}
寫在最后:對于準備學習C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內功)不妨從現在開始!
責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
183文章
7644瀏覽量
145598 -
代碼
+關注
關注
30文章
4968瀏覽量
73968
原文標題:C語言項目實戰:《自動版貪吃蛇》零基礎項目!源碼 + 注釋
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
C語言來實現萬年歷
C語言實現萬年歷程序的代碼如下:#include
int year(int y)
{
if ((y%4==0) (y%100!=0) || y%400==0)
return 366
發表于 01-16 08:02
C語言主要特點
指針類型數據,使用十分靈活和多樣化,能用來實現各種復雜的數據結構(如鏈表、樹、棧等)的運算。
4.具有結構化的控制語句。用函數作為程序的模塊單位,便于實現程序的模塊化。C語言是完全模塊
發表于 01-05 07:41
如何用好 C 語言函數的返回值?
基本上,沒有人會將大段的C語言代碼全部塞入 main() 函數。更好的做法是按照復用率高、耦合性低的原則,盡可能的將代碼拆分不同的功能模塊,并封裝成函數。
C語言代碼的組合千變萬化,因
發表于 12-25 07:17
單片機C語言編程的心得
規范程序結構化設計的需要,既可以實現大型程序的模塊化,又可以實現根各模塊的連接調試。
1、.H文件介紹:
在單片機C程序設計中,項目一般按功能模塊化進行結構化設計。將一個
發表于 12-08 07:44
為什么單片機還在用C語言編程?
的缺陷
高級語言存在的目的是可以實現更為優化的算法,更多的是為了方便的執行方案,但是,高級語言對程序存儲空間的占用要比匯編和C語言多很多。
發表于 11-28 07:37
單片機C語言實例(350+例)
350+單片機C語言實例!
純分享帖,需要者可點擊附件免費獲取完整資料~~~【免責聲明】本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容!
發表于 05-22 21:47
深入理解C語言:C語言循環控制
在C語言編程中,循環結構是至關重要的,它可以讓程序重復執行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環,C語言提供了多種循環控制語句,如break、continue和
為什么學了C語言,卻寫不出像樣的項目?
在學習編程的路上,C語言幾乎是每個程序員的“必修課”。不管你是打算從事嵌入式開發、系統編程,還是想要深入理解操作系統的底層原理,C語言都是一塊重要的基石。然而許多人在學習
單片機C語言編程寶典大全,初學必備【強推下載!】
資料介紹:包含
1. 51單片機入門教程
2. 初學者適用:單片機C語言實例100例(代碼及釋義)
3. 51單片機C語言快速上手
4. 51單片機
發表于 03-14 11:03
如何用C語言實現進化版貪吃蛇項目
評論