#史上最詳細的C語言貪吃蛇教程
#前言
在有用C寫貪吃蛇的一個想法之后,上網查了幾個教程,覺得不是很能看懂。恩。。。或者說不是一下子就能看出來思路+具體怎么實現。所以,我花了早自習的時間想了想如何用最簡單的方法實現,晚上大約兩個小時寫了出來。別說我用兩小時裝逼,有了思路之后就是碼代碼和查細節的問題。
PS:這里補充說一下C語言寫的控制臺游戲的原理是什么,知道的同學直接跳過這一段。實際上就是不斷的用system("cls");
清除屏幕再重新打印不一樣的內容,在速度較快的時候就會有一種動畫效果了,當然這是控制臺,就沒法究美觀了(可以改一下控制臺字體和背景顏色相對好看一點,具體百度),晃眼睛也是肯定的。
如圖(中間有一點空白gif抓取的時候沒抓到請忽略):
源代碼已經放在了github上感興趣的可以參考一下(順便star一下看官們)
** 這是源碼!!! C-snake-iimT **
#步入正題
我們開始說思路。
- 我們需要一張地圖,中間是空的四周有墻體。
- 我們需要一條蛇,這條蛇由蛇頭和蛇身組成。
- 我們需要食物,并且在蛇吃掉食物之后將蛇的身體變長,而且重新生成一個食物。
- 蛇需要移動,這應該是最難實現的。
- 蛇撞到墻或者撞到自己的身體就會死亡。
- 我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯系。
Balabala我們有這么一大堆問題,我們來想想應該如何用代碼實現。
整個地圖我們用一個坐標系建立起來,這用一個二維字符數組就能實現了,然后我們的蛇和食物只需要將中間的空格改成蛇的頭或者身體或者食物的樣子就行了。
這條蛇應該如何描述,我們先區分蛇頭和蛇的身體,然后一組坐標來將這個蛇的頭、頭后面第一節、第二節、第三節。。。。以此類推。我現在是2050的地圖,所以我用一個
snake[1000][3]
來描述,這里面的1000是2050就是現在有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)
循環里面,只有死了才會跳出循環不在清屏打印(清屏打印其實就是刷新視圖),然后輸出游戲結束得分就好。
#將上述的代碼實現方法寫成一個一個函數,然后按照順序放在循環體,就完成了貪吃蛇的制作。
#理解思路,模仿一下代碼,寫一個你自己的貪吃蛇,并且自己DIY一點其他的小創意,動手折騰吧。
我叫掏糞,如果喜喜歡我的文章請點個喜歡~歡迎關注我的的博客www.iimt.me和新浪微博。