細緻的C語言寫貪吃蛇教程+詳細思路-適合新手附原始碼
#史上最詳細的C語言貪吃蛇教程
#前言
在有用C寫貪吃蛇的一個想法之後,上網查了幾個教程,覺得不是很能看懂。恩。。。或者說不是一下子就能看出來思路+具體怎麼實現。所以,我花了早自習的時間想了想如何用最簡單的方法實現,晚上大約兩個小時寫了出來。別說我用兩小時裝逼,有了思路之後就是碼程式碼和查細節的問題。
PS:這裡補充說一下C語言寫的控制檯遊戲的原理是什麼,知道的同學直接跳過這一段。實際上就是不斷的用system("cls");
清除螢幕再重新列印不一樣的內容,在速度較快的時候就會有一種動畫效果了,當然這是控制檯,就沒法究美觀了(可以改一下控制檯字型和背景顏色相對好看一點,具體百度),晃眼睛也是肯定的。
如圖(中間有一點空白gif抓取的時候沒抓到請忽略):
原始碼已經放在了github上感興趣的可以參考一下(順便star一下看官們)
#步入正題
我們開始說思路。
- 我們需要一張地圖,中間是空的四周有牆體。
- 我們需要一條蛇,這條蛇由蛇頭和蛇身組成。
- 我們需要食物,並且在蛇吃掉食物之後將蛇的身體變長,而且重新生成一個食物。
- 蛇需要移動,這應該是最難實現的。
- 蛇撞到牆或者撞到自己的身體就會死亡。
- 我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯絡。
Balabala我們有這麼一大堆問題,我們來想想應該如何用程式碼實現。
整個地圖我們用一個座標系建立起來,這用一個二維字元陣列就能實現了,然後我們的蛇和食物只需要將中間的空格改成蛇的頭或者身體或者食物的樣子就行了。
這條蛇應該如何描述,我們先區分蛇頭和蛇的身體,然後一組座標來將這個蛇的頭、頭後面第一節、第二節、第三節。。。。以此類推。我現在是20*50的地圖,所以我用一個
snake[1000][3]
來描述,這裡面的1000是20*50就是現在有1000個空(假如有人就玩到將整個地圖霸佔了呢)座標,snake[i][0]
的值用來描述這個座標是頭·snake[i][0]=1
還是身體snake[i][0]=0
,然後snake[i][1] snake[i][2]
分別用來描述所在的X座標和Y座標(i表示某一節)。這樣我們就用一個數組將蛇描述出來了,在後面我們生成檢視的時候將該點的空格換成’#’或者’@’就好了。生成食物我們需要產生隨機數作為食物的座標,而且這個隨機數要在一定的範圍內不能在圍牆上,也不能和蛇的座標一樣。生成隨機數用
srand(time(0)); int a = rand()%10+1;
這樣我們就能得到1-10的數,這裡的
srand(time(0));
初始化一下時間函式,然後rand會給我們一個很大的秒數,這個秒數在不斷的變化,%10之後得到的數就在0-9,然後+1得到1-10的數。根據這個原理,生成一個在固定範圍內的X座標和Y座標,然後用這個x座標和y座標去遍歷snake陣列看看x、y會不會同時相同,如果相同就重新生成一個知道不相同為止。這樣我們就生成了一個食物的座標。蛇的移動,就是不斷的變化那個座標集合,我們將蛇頭移動到下一個座標之後,後面的節一次覆蓋前一個就完成了一個單位的移動。這樣的話,我們的方向只需要對蛇頭作用就行了。現在我們設定一個
direct=1
即向上,direct的值1/2/3/4分別代表上下左右。現在蛇向上走,蛇頭向上的話,X不變,Y-1就好了。
(注意我們這裡的座標系是類似數學上第四象限的座標系,所以X軸在最上面。)
然後我們將第二個節換成前一次蛇頭所在的座標,第三個座標變成前一次第二個的座標,以此類推,蛇就往前移動了一個單位。蛇頭撞到牆或者撞到自己的身體,我們只需要判斷蛇頭的座標是否和牆的座標重合或者和蛇的某一節重合。所以在蛇移動之後我們用蛇頭的座標去遍歷蛇自己的所有座標並且判斷蛇的X或者Y是否大於或者小於地圖邊界了,這樣就能知道是否發生碰撞,發生碰撞之後直接break不在重新整理檢視就好。
當鍵盤有輸入的時候判斷是上或者下後者左或者右,然後重置direct的值,就將方向重置了。當然在向上走的時候按下鍵是不行的其他也是類似,所以還要判斷一下。鍵盤讀入事件我們需要用到一個函式
_kbhit();
如果有鍵盤敲擊,這個函式就會返回一個非0的數。所以我們可以在每一次重新整理的時候char ch; if(_kbhit()) //有鍵盤敲擊 { ch = _getchar(); } switch(ch) { //判斷使用者按下了哪個鍵 case 'H': //按下鍵盤的上鍵_getchar()得到的是H //可以自己寫一個程式看看上下左右分別是哪幾個字元然後用來判斷就行了 if(direct!=2) //如果當前的方向不是向下 就將方向重新定義為向上 其他的類似 direct=1; }
這樣我們就通過讀取鍵盤重新設定了方向。
這些問題我們都一一解決了,現在我們來想一下程式執行的順序是什麼。
1)初始化,將地圖造出來。
2)如果有鍵盤輸入的話,就重新設定運動方向。
3)製造食物。
4)讓蛇移動,如果吃掉食物就重新生成一個食物,如果會死亡就break。
5)用蛇的座標將地圖中的空格替換為’#’和’@’,將食物所在的座標設定為’O’。
6)輸出檢視,即將最終生成的地圖打印出來。
7)Sleep(200) 暫停200毫秒之後在進行上面的。
我們將上面這些都放在一個while(1)
迴圈裡面,只有死了才會跳出迴圈不在清屏列印(清屏列印其實就是重新整理檢視),然後輸出遊戲結束得分就好。