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

#史上最詳細(xì)的C語言貪吃蛇教程

#前言

在有用C寫貪吃蛇的一個(gè)想法之后梅忌,上網(wǎng)查了幾個(gè)教程狰腌,覺得不是很能看懂。恩牧氮。琼腔。□飧穑或者說不是一下子就能看出來思路+具體怎么實(shí)現(xiàn)丹莲。所以光坝,我花了早自習(xí)的時(shí)間想了想如何用最簡(jiǎn)單的方法實(shí)現(xiàn),晚上大約兩個(gè)小時(shí)寫了出來甥材。別說我用兩小時(shí)裝逼盯另,有了思路之后就是碼代碼和查細(xì)節(jié)的問題。

PS:這里補(bǔ)充說一下C語言寫的控制臺(tái)游戲的原理是什么洲赵,知道的同學(xué)直接跳過這一段鸳惯。實(shí)際上就是不斷的用system("cls");清除屏幕再重新打印不一樣的內(nèi)容,在速度較快的時(shí)候就會(huì)有一種動(dòng)畫效果了叠萍,當(dāng)然這是控制臺(tái)芝发,就沒法究美觀了(可以改一下控制臺(tái)字體和背景顏色相對(duì)好看一點(diǎn),具體百度)苛谷,晃眼睛也是肯定的辅鲸。

如圖(中間有一點(diǎn)空白gif抓取的時(shí)候沒抓到請(qǐng)忽略):

效果圖

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

** 這是源碼!3弧瓢湃! C-snake-iimT **

#步入正題

我們開始說思路。

  1. 我們需要一張地圖赫蛇,中間是空的四周有墻體绵患。
  2. 我們需要一條蛇,這條蛇由蛇頭和蛇身組成悟耘。
  3. 我們需要食物落蝙,并且在蛇吃掉食物之后將蛇的身體變長(zhǎng),而且重新生成一個(gè)食物暂幼。
  4. 蛇需要移動(dòng)筏勒,這應(yīng)該是最難實(shí)現(xiàn)的。
  5. 蛇撞到墻或者撞到自己的身體就會(huì)死亡旺嬉。
  6. 我們需要能用鍵盤控制蛇的運(yùn)動(dòng)方向管行,這個(gè)會(huì)和蛇的移動(dòng)有一些聯(lián)系。

Balabala我們有這么一大堆問題邪媳,我們來想想應(yīng)該如何用代碼實(shí)現(xiàn)捐顷。

  1. 整個(gè)地圖我們用一個(gè)坐標(biāo)系建立起來,這用一個(gè)二維字符數(shù)組就能實(shí)現(xiàn)了雨效,然后我們的蛇和食物只需要將中間的空格改成蛇的頭或者身體或者食物的樣子就行了迅涮。

  2. 這條蛇應(yīng)該如何描述,我們先區(qū)分蛇頭和蛇的身體徽龟,然后一組坐標(biāo)來將這個(gè)蛇的頭叮姑、頭后面第一節(jié)、第二節(jié)据悔、第三節(jié)传透。耘沼。。旷祸。以此類推耕拷。我現(xiàn)在是2050的地圖,所以我用一個(gè)snake[1000][3]來描述托享,這里面的1000是2050就是現(xiàn)在有1000個(gè)空(假如有人就玩到將整個(gè)地圖霸占了呢)坐標(biāo),snake[i][0]的值用來描述這個(gè)坐標(biāo)是頭·snake[i][0]=1還是身體snake[i][0]=0浸赫,然后snake[i][1] snake[i][2]分別用來描述所在的X坐標(biāo)和Y坐標(biāo)(i表示某一節(jié))闰围。這樣我們就用一個(gè)數(shù)組將蛇描述出來了,在后面我們生成視圖的時(shí)候?qū)⒃擖c(diǎn)的空格換成'#'或者'@'就好了既峡。

  3. 生成食物我們需要產(chǎn)生隨機(jī)數(shù)作為食物的坐標(biāo)羡榴,而且這個(gè)隨機(jī)數(shù)要在一定的范圍內(nèi)不能在圍墻上,也不能和蛇的坐標(biāo)一樣运敢。生成隨機(jī)數(shù)用

srand(time(0));
int a = rand()%10+1;

這樣我們就能得到1-10的數(shù)校仑,這里的srand(time(0));初始化一下時(shí)間函數(shù),然后rand會(huì)給我們一個(gè)很大的秒數(shù)传惠,這個(gè)秒數(shù)在不斷的變化迄沫,%10之后得到的數(shù)就在0-9,然后+1得到1-10的數(shù)卦方。根據(jù)這個(gè)原理羊瘩,生成一個(gè)在固定范圍內(nèi)的X坐標(biāo)和Y坐標(biāo),然后用這個(gè)x坐標(biāo)和y坐標(biāo)去遍歷snake數(shù)組看看x盼砍、y會(huì)不會(huì)同時(shí)相同尘吗,如果相同就重新生成一個(gè)知道不相同為止。這樣我們就生成了一個(gè)食物的坐標(biāo)浇坐。

  1. 蛇的移動(dòng)睬捶,就是不斷的變化那個(gè)坐標(biāo)集合,我們將蛇頭移動(dòng)到下一個(gè)坐標(biāo)之后近刘,后面的節(jié)一次覆蓋前一個(gè)就完成了一個(gè)單位的移動(dòng)擒贸。這樣的話,我們的方向只需要對(duì)蛇頭作用就行了〉穑現(xiàn)在我們?cè)O(shè)定一個(gè)direct=1即向上酗宋,direct的值1/2/3/4分別代表上下左右。現(xiàn)在蛇向上走疆拘,蛇頭向上的話蜕猫,X不變,Y-1就好了哎迄。
    (注意我們這里的坐標(biāo)系是類似數(shù)學(xué)上第四象限的坐標(biāo)系回右,所以X軸在最上面隆圆。)
    然后我們將第二個(gè)節(jié)換成前一次蛇頭所在的坐標(biāo),第三個(gè)坐標(biāo)變成前一次第二個(gè)的坐標(biāo)翔烁,以此類推渺氧,蛇就往前移動(dòng)了一個(gè)單位。

  2. 蛇頭撞到墻或者撞到自己的身體蹬屹,我們只需要判斷蛇頭的坐標(biāo)是否和墻的坐標(biāo)重合或者和蛇的某一節(jié)重合侣背。所以在蛇移動(dòng)之后我們用蛇頭的坐標(biāo)去遍歷蛇自己的所有坐標(biāo)并且判斷蛇的X或者Y是否大于或者小于地圖邊界了,這樣就能知道是否發(fā)生碰撞慨默,發(fā)生碰撞之后直接break不在刷新視圖就好贩耐。

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

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

這樣我們就通過讀取鍵盤重新設(shè)置了方向霎箍。

  1. 這些問題我們都一一解決了奇钞,現(xiàn)在我們來想一下程序運(yùn)行的順序是什么。
1)初始化朋沮,將地圖造出來蛇券。
2)如果有鍵盤輸入的話,就重新設(shè)置運(yùn)動(dòng)方向樊拓。
3)制造食物纠亚。
4)讓蛇移動(dòng),如果吃掉食物就重新生成一個(gè)食物筋夏,如果會(huì)死亡就break蒂胞。
5)用蛇的坐標(biāo)將地圖中的空格替換為'#'和'@',將食物所在的坐標(biāo)設(shè)置為'O'。
6)輸出視圖条篷,即將最終生成的地圖打印出來骗随。
7)Sleep(200) 暫停200毫秒之后在進(jìn)行上面的。

我們將上面這些都放在一個(gè)while(1)循環(huán)里面赴叹,只有死了才會(huì)跳出循環(huán)不在清屏打印(清屏打印其實(shí)就是刷新視圖)鸿染,然后輸出游戲結(jié)束得分就好。

#將上述的代碼實(shí)現(xiàn)方法寫成一個(gè)一個(gè)函數(shù)乞巧,然后按照順序放在循環(huán)體涨椒,就完成了貪吃蛇的制作。

#理解思路,模仿一下代碼蚕冬,寫一個(gè)你自己的貪吃蛇免猾,并且自己DIY一點(diǎn)其他的小創(chuàng)意,動(dòng)手折騰吧囤热。

我叫掏糞猎提,如果喜喜歡我的文章請(qǐng)點(diǎn)個(gè)喜歡~歡迎關(guān)注我的的博客www.iimt.me和新浪微博。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旁蔼,一起剝皮案震驚了整個(gè)濱河市锨苏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棺聊,老刑警劉巖蚓炬,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異躺屁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)经宏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門犀暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烁兰,你說我怎么就攤上這事耐亏。” “怎么了沪斟?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵广辰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我主之,道長(zhǎng)择吊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任槽奕,我火速辦了婚禮几睛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粤攒。我一直安慰自己所森,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布夯接。 她就那樣靜靜地躺著焕济,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盔几。 梳的紋絲不亂的頭發(fā)上晴弃,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼肝匆。 笑死粒蜈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旗国。 我是一名探鬼主播枯怖,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼能曾!你這毒婦竟也來了度硝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤寿冕,失蹤者是張志新(化名)和其女友劉穎蕊程,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驼唱,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藻茂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了玫恳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辨赐。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖京办,靈堂內(nèi)的尸體忽然破棺而出掀序,到底是詐尸還是另有隱情,我是刑警寧澤惭婿,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布不恭,位于F島的核電站,受9級(jí)特大地震影響财饥,放射性物質(zhì)發(fā)生泄漏换吧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一佑力、第九天 我趴在偏房一處隱蔽的房頂上張望式散。 院中可真熱鬧,春花似錦打颤、人聲如沸暴拄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乖篷。三九已至,卻和暖如春透且,著一層夾襖步出監(jiān)牢的瞬間撕蔼,已是汗流浹背豁鲤。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲸沮,地道東北人琳骡。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讼溺,于是被迫代替她去往敵國(guó)和親楣号。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容