細致的C語言寫貪吃蛇教程+詳細思路-適合新手附源碼

#史上最詳細的C語言貪吃蛇教程

#前言

在有用C寫貪吃蛇的一個想法之后,上網查了幾個教程,覺得不是很能看懂。恩。。。或者說不是一下子就能看出來思路+具體怎么實現。所以,我花了早自習的時間想了想如何用最簡單的方法實現,晚上大約兩個小時寫了出來。別說我用兩小時裝逼,有了思路之后就是碼代碼和查細節的問題。

PS:這里補充說一下C語言寫的控制臺游戲的原理是什么,知道的同學直接跳過這一段。實際上就是不斷的用system("cls");清除屏幕再重新打印不一樣的內容,在速度較快的時候就會有一種動畫效果了,當然這是控制臺,就沒法究美觀了(可以改一下控制臺字體和背景顏色相對好看一點,具體百度),晃眼睛也是肯定的。

如圖(中間有一點空白gif抓取的時候沒抓到請忽略):

效果圖

源代碼已經放在了github上感興趣的可以參考一下(順便star一下看官們)

** 這是源碼!!! C-snake-iimT **

#步入正題

我們開始說思路。

  1. 我們需要一張地圖,中間是空的四周有墻體。
  2. 我們需要一條蛇,這條蛇由蛇頭和蛇身組成。
  3. 我們需要食物,并且在蛇吃掉食物之后將蛇的身體變長,而且重新生成一個食物。
  4. 蛇需要移動,這應該是最難實現的。
  5. 蛇撞到墻或者撞到自己的身體就會死亡。
  6. 我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯系。

Balabala我們有這么一大堆問題,我們來想想應該如何用代碼實現。

  1. 整個地圖我們用一個坐標系建立起來,這用一個二維字符數組就能實現了,然后我們的蛇和食物只需要將中間的空格改成蛇的頭或者身體或者食物的樣子就行了。

  2. 這條蛇應該如何描述,我們先區分蛇頭和蛇的身體,然后一組坐標來將這個蛇的頭、頭后面第一節、第二節、第三節。。。。以此類推。我現在是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表示某一節)。這樣我們就用一個數組將蛇描述出來了,在后面我們生成視圖的時候將該點的空格換成'#'或者'@'就好了。

  3. 生成食物我們需要產生隨機數作為食物的坐標,而且這個隨機數要在一定的范圍內不能在圍墻上,也不能和蛇的坐標一樣。生成隨機數用

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會不會同時相同,如果相同就重新生成一個知道不相同為止。這樣我們就生成了一個食物的坐標。

  1. 蛇的移動,就是不斷的變化那個坐標集合,我們將蛇頭移動到下一個坐標之后,后面的節一次覆蓋前一個就完成了一個單位的移動。這樣的話,我們的方向只需要對蛇頭作用就行了。現在我們設定一個direct=1即向上,direct的值1/2/3/4分別代表上下左右。現在蛇向上走,蛇頭向上的話,X不變,Y-1就好了。
    (注意我們這里的坐標系是類似數學上第四象限的坐標系,所以X軸在最上面。)
    然后我們將第二個節換成前一次蛇頭所在的坐標,第三個坐標變成前一次第二個的坐標,以此類推,蛇就往前移動了一個單位。

  2. 蛇頭撞到墻或者撞到自己的身體,我們只需要判斷蛇頭的坐標是否和墻的坐標重合或者和蛇的某一節重合。所以在蛇移動之后我們用蛇頭的坐標去遍歷蛇自己的所有坐標并且判斷蛇的X或者Y是否大于或者小于地圖邊界了,這樣就能知道是否發生碰撞,發生碰撞之后直接break不在刷新視圖就好。

  3. 當鍵盤有輸入的時候判斷是上或者下后者左或者右,然后重置direct的值,就將方向重置了。當然在向上走的時候按下鍵是不行的其他也是類似,所以還要判斷一下。鍵盤讀入事件我們需要用到一個函數_kbhit();如果有鍵盤敲擊,這個函數就會返回一個非0的數。所以我們可以在每一次刷新的時候

char ch;
if(_kbhit())  //有鍵盤敲擊
{
  ch = _getchar();
}
switch(ch)
{
    //判斷用戶按下了哪個鍵
    case 'H':   
    //按下鍵盤的上鍵_getchar()得到的是H
    //可以自己寫一個程序看看上下左右分別是哪幾個字符然后用來判斷就行了
      if(direct!=2) 
      //如果當前的方向不是向下  就將方向重新定義為向上 其他的類似
        direct=1;
}

這樣我們就通過讀取鍵盤重新設置了方向。

  1. 這些問題我們都一一解決了,現在我們來想一下程序運行的順序是什么。
1)初始化,將地圖造出來。
2)如果有鍵盤輸入的話,就重新設置運動方向。
3)制造食物。
4)讓蛇移動,如果吃掉食物就重新生成一個食物,如果會死亡就break。
5)用蛇的坐標將地圖中的空格替換為'#'和'@',將食物所在的坐標設置為'O'。
6)輸出視圖,即將最終生成的地圖打印出來。
7)Sleep(200) 暫停200毫秒之后在進行上面的。

我們將上面這些都放在一個while(1)循環里面,只有死了才會跳出循環不在清屏打印(清屏打印其實就是刷新視圖),然后輸出游戲結束得分就好。

#將上述的代碼實現方法寫成一個一個函數,然后按照順序放在循環體,就完成了貪吃蛇的制作。

#理解思路,模仿一下代碼,寫一個你自己的貪吃蛇,并且自己DIY一點其他的小創意,動手折騰吧。

我叫掏糞,如果喜喜歡我的文章請點個喜歡~歡迎關注我的的博客www.iimt.me和新浪微博。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容