C/C++編程筆記:C語(yǔ)言貪吃蛇源代碼控制臺(tái)(一),會(huì)動(dòng)的那種哦!
前幾天有個(gè)同學(xué)加我QQ私聊我說(shuō)他們老師布置了一個(gè)貪吃蛇,他不知道怎么寫(xiě)所以來(lái)找我求解,我給他簡(jiǎn)單講解了思路和一些難點(diǎn)之后他也能夠自己獨(dú)立將項(xiàng)目完成了!考慮到更多同學(xué)可能有貪吃蛇上的問(wèn)題,今天有時(shí)間就來(lái)寫(xiě)一下題解。我將分幾步來(lái)教大家寫(xiě)一個(gè)貪吃蛇小游戲。由于大家可能C語(yǔ)言未學(xué)完,這個(gè)教程只涉及數(shù)組和函數(shù)等知識(shí)點(diǎn)。

一、畫(huà)地圖
首先我們使用宏定義來(lái)定義兩個(gè)常數(shù),地圖的高(H)和地圖的寬(W)
#defineH 20
#defineW 20
這樣寫(xiě)的好處是以后改變地圖的大小就不用更改寫(xiě)好的代碼了,只要修改下宏定義。節(jié)省了時(shí)間又避免改出bug
接下來(lái),我們定義一個(gè)二維數(shù)組,這個(gè)二維數(shù)組的每一個(gè)值剛好對(duì)應(yīng)了平面的每一個(gè)點(diǎn),這樣就可以方便地自定義地圖了。可以設(shè)置障礙物什么的了。然后我們用數(shù)組a[H][W]來(lái)存儲(chǔ)地圖情況,如果a[i][j]==0,就說(shuō)明第i+1行,第j+1列是空的,如果a[i][j]==1,就說(shuō)明這個(gè)點(diǎn)是障礙物。
然后我們使用下面的代碼來(lái)把地圖數(shù)組的邊框做出來(lái),就是讓數(shù)組邊緣等于1。(int全局變量默認(rèn)為0)。

這個(gè)只是最簡(jiǎn)單的地圖,如果你有其他想法可以自由發(fā)揮,畫(huà)出自己的地圖。
地圖畫(huà)好了,剩下的就是畫(huà)出地圖了。我們把畫(huà)地圖的過(guò)程也寫(xiě)為一個(gè)函數(shù),這樣能使代碼結(jié)構(gòu)更清晰,更容易找出bug。畫(huà)地圖就簡(jiǎn)單了,就是遍歷整個(gè)數(shù)組,然后值為0的地方輸出空格,值為1的地方輸出一個(gè)符號(hào),符號(hào)按自己喜好,我這里使用了#。

然后我們發(fā)現(xiàn)長(zhǎng)寬不合適,我們可以修改剛開(kāi)始的H和W的值。
按自己喜好調(diào)整,比如這樣
#defineH 23
#defineW 75
然后看看是不是比剛才好看了。知道宏定義的好處了吧。

好了,到這里為止,我們已經(jīng)學(xué)會(huì)了畫(huà)地圖。
這只是最簡(jiǎn)單的地圖,通過(guò)修改地圖數(shù)組,我們就能做出很多不一樣的地圖。
下面附上第一步的完整代碼。


二、畫(huà)蛇
蛇的身體就是一些點(diǎn),我們可以用二維數(shù)組把這些點(diǎn)的坐標(biāo)存起來(lái)。
先聲明一個(gè)足夠大的二維數(shù)組。雖然我覺(jué)得你們玩不了這么長(zhǎng)(手動(dòng)滑稽)。
int s[H*W][2];
這樣s[0][0]表示蛇頭的i坐標(biāo),s[0][1]表示蛇頭的j坐標(biāo)。s[i][0]表示蛇第i+1個(gè)點(diǎn)的i坐標(biāo)。s[i][1]同理。
然后再聲明一個(gè)int變量存儲(chǔ)蛇的長(zhǎng)度。然后把這些初始化操作都放進(jìn)上面init函數(shù)里面。
int sLength;? ? ? ? //蛇的長(zhǎng)度
sLength=4;? ? ? ? ? //讓蛇的最初長(zhǎng)度為4
?然后給剛開(kāi)始的蛇身幾個(gè)初始坐標(biāo)

然后接下來(lái)我們把蛇畫(huà)出來(lái),我這里有一個(gè)函數(shù),可以實(shí)現(xiàn)移動(dòng)光標(biāo)到指定點(diǎn)。注:要添加頭文件windows.h
如下:

然后就可以先畫(huà)地圖,然后通過(guò)移動(dòng)光標(biāo)在地圖上畫(huà)出蛇。

好,看看效果

蛇確實(shí)出來(lái)了,但是那個(gè)光標(biāo)很礙事,在init函數(shù)開(kāi)始時(shí)加入下面代碼可隱藏關(guān)標(biāo)
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

這樣就沒(méi)有光標(biāo)了。
到現(xiàn)在為止的代碼。



今天先到這里吧!大家不要著急,下篇文章我會(huì)把蛇剩下的部分分享完整!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地,學(xué)習(xí)C/C++編程知識(shí)的小伙伴可以關(guān)注UP哦~
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~