c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B
設(shè)計(jì)思路
? ? ? ??建議先將代碼復(fù)制下來(lái)跑一遍再來(lái)看思路?。?!
? ? ? ? 通俗易懂,請(qǐng)仔細(xì)看。
? ? ? ? 值得注意的是我給出的代碼沒(méi)有加墻體,如有需要自己添加。
? ? ? ? 也沒(méi)有難度設(shè)計(jì),同上。
地圖大小(這里設(shè)計(jì)了墻體,代碼中未實(shí)現(xiàn))
設(shè)置一個(gè)整形數(shù)組map,其大小為1600,對(duì)應(yīng)著地圖的大小為1600,并初始化數(shù)組,令數(shù)組中的值全為0,0代表空地。
我們通過(guò)設(shè)定窗口的寬度為80,打印時(shí)每個(gè)map[i] 所對(duì)應(yīng)的字符占兩格位置即可實(shí)現(xiàn)每打印40個(gè)map[i]就換行的效果。
這樣地圖的長(zhǎng)寬即為40x40.
? ? ? 2.墻體
墻體在地圖的最外圍,意味著當(dāng)map[i]中的i為地圖邊界時(shí),對(duì)應(yīng)著墻體,使用if語(yǔ)句判斷i的值,符合位于邊界的條件打印墻體即可。
通過(guò)地圖的大小我們了解到,當(dāng)0<=i<=39時(shí),map[i]對(duì)應(yīng)著第一行,也就是地圖的邊界 ,同樣的,地圖左邊界的i滿足i%40==0,右邊界的i滿足(i+1)%40==0,,同理下邊界。將上述符合的條件放入if語(yǔ)句中即可實(shí)現(xiàn)打印墻體的功能。
? ? ? ? 3.蛇
蛇是如何移動(dòng)呢?并且保持一定長(zhǎng)度。其實(shí)我們只需要一個(gè)蛇頭就可以辦到,因?yàn)樯呱碇皇桥f蛇頭的位置,所以我們一直只需更新蛇頭坐標(biāo)就能達(dá)到目的,如何保持長(zhǎng)度呢?,因?yàn)槲覀兏滦碌纳哳^,去掉舊的蛇尾是很顯然的事了,在地圖大小中我們提到,map[i] 如果等于0,就是空地,讓蛇尾的值變成0就行了,因?yàn)樯咭恢痹谝苿?dòng),所以當(dāng)前蛇尾的前一節(jié)蛇身會(huì)是下一刻的蛇尾,很自然的聯(lián)想到了以1為公差的一組數(shù)1234,分別對(duì)應(yīng)蛇身的值,如果我們想使蛇連續(xù)的動(dòng)起來(lái),新蛇頭的值為4,在加入新蛇頭前將蛇尾變?yōu)?,蛇尾前一節(jié)蛇身變?yōu)榇丝躺呶矊?duì)應(yīng)的值為1,使蛇整體減去1,此時(shí)的蛇的值為0123,加入蛇頭4,01234,此刻原蛇尾變?yōu)榭盏兀呶睬耙唤厣呱碜優(yōu)榇丝痰纳呶?。貪吃蛇的持續(xù)移動(dòng)便完成了。
? ? ? ?4.食物
很自然的,在上面3節(jié)map[i]為0,正整數(shù)時(shí)都有了對(duì)應(yīng)的含義,食物我們便使其 map[i] =-1.因?yàn)樨澇陨哂螒蛑惺澄锏纳梢笫请S機(jī)的,但我們的c++課程中并沒(méi)有提到,便在網(wǎng)上查找到了隨機(jī)數(shù)生成的函數(shù)srand(上面的設(shè)定窗口大小也是如此),生成的隨機(jī)數(shù)i可能超出數(shù)組大小,對(duì)i取1600的余數(shù)即可。食物只能生成在空地上,當(dāng)map[i]等于0時(shí),令map[i]=-1。新的食物便生成了。容易忽略的一點(diǎn)是,我們并沒(méi)有給墻體map[i]的值,也就是所墻體的值在數(shù)組中對(duì)應(yīng)的是空地,只不過(guò)通過(guò)i的位置來(lái)判斷是否為墻體,在這里,同樣也要加入墻體的位置到判斷條件,以免食物生成在墻體內(nèi)。新的食物在舊的食物被吃掉后立即生成。
? ? ? 5.死亡判定
我們通過(guò)新蛇頭所對(duì)應(yīng)的值來(lái)判斷蛇是否死亡
? ? ? ? (1)map[headx+heady*40]>0, 由3我們可以知道,蛇身所對(duì)應(yīng)的map [i] ?值大于0,新蛇頭所對(duì)應(yīng)的map值大于0也就意味著新蛇頭在蛇身生成,按
照貪吃蛇的規(guī)則,游戲結(jié)束
? ? ? ?(2)(headx+heady*40)滿足墻體的打印條件時(shí),意味著蛇頭在墻體生成,游戲結(jié)束
實(shí)現(xiàn)代碼
#include<bits/stdc++.h> #include<windows.h> #include<iostream> #include<conio.h> int main() { int headx = 0, heady = 0, len = 5, map[1600] = { 0 }, i = 0; char c = 'd', cl = 'd',body=3,head=2; /*隨機(jī)數(shù)生成*/ srand((unsigned)time(0)); system("mode con:cols=80 lines=40"); map[rand() % 1600] = -1; while (true) { if (_kbhit())//判斷鍵盤(pán)輸入 { cl =_getch(); if (cl < 97) cl += 32; if (cl == 'a' && c != 'd' || cl == 'd' && c != 'a' ||cl == 'w' && c != 's' || cl == 's' && c != 'w')//判斷輸入方向是否與原方向沖突 c = cl; } /*改變蛇頭坐標(biāo)*/ if (c == 'a') headx--; if (c == 'd') headx++; if (c == 'w') heady--; if (c == 's') heady++; /*判斷蛇頭是否撞墻*/ if(headx==-1||headx==40||heady==-1||heady==40) break; /*判斷蛇頭是否為空地*/ if (map[heady * 40 + headx]) { if (map[heady * 40+headx] > 0) break; /*吃到食物,蛇身+1,并在空地生成新的食物*/ if (map[heady * 40 + headx] < 0) { len++; for (i = rand() % 1600; map[i] || !(map[i] = -1); i = rand() % 1600); } } /*是空地則蛇身值整體減1,蛇尾由1減為0變成空地*/ else for (i = 0; i < 1600; i++) { if (map[i] > 0) map[i] -= 1; } system("cls"); /*新蛇頭賦值,遍歷map,值大于0為蛇身,等于0為空地,小于0為食物*/ for (map[heady * 40 + headx] = len, i = 0; i < 1600; i++) { if (map[i] == len) { printf("%2d", map[i]); continue; } if (map[i] > 0) printf("%2d", map[i]); if (map[i] == 0) printf("%2d", map[i]); if (map[i] == -1) printf("%2d", map[i]);//打印 } Sleep(100); } }
效果
?如果你仔細(xì)閱讀了代碼,將數(shù)字替換成你想要的符號(hào)(占兩個(gè)字符大小如果是一個(gè)字符要加一個(gè)空格)是很簡(jiǎn)單的事情
如果你想要游戲循環(huán)進(jìn)行,也是很容易辦到的。
這只是個(gè)demo,你可以根據(jù)自己的需要任意的改寫(xiě)。
到此這篇關(guān)于c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B的文章就介紹到這了,更多相關(guān)c++貪吃蛇游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解
- 利用C/C++實(shí)現(xiàn)貪吃蛇游戲
- C++入門(mén)指南之貪吃蛇游戲的實(shí)現(xiàn)
- C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲
- C++實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲
- C++實(shí)現(xiàn)貪吃蛇游戲
- C++代碼實(shí)現(xiàn)貪吃蛇小游戲
- 基于easyx的C++實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)循環(huán)鏈表實(shí)現(xiàn)貪吃蛇
- C++控制臺(tái)實(shí)現(xiàn)貪吃蛇游戲
- C++通過(guò)類(lèi)實(shí)現(xiàn)控制臺(tái)貪吃蛇
- C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇
相關(guān)文章
VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法
這篇文章主要介紹了VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法,比較實(shí)用的一個(gè)特殊功能,需要的朋友可以參考下2014-08-08C++?雙向循環(huán)鏈表類(lèi)模版實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了C++?雙向循環(huán)鏈表類(lèi)模版實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02C++動(dòng)態(tài)內(nèi)存分配超詳細(xì)講解
給數(shù)組分配多大的空間?你是否和初學(xué)C時(shí)的我一樣,有過(guò)這樣的疑問(wèn)。這一期就來(lái)聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解2022-08-08C++控制臺(tái)實(shí)現(xiàn)隨機(jī)生成路徑迷宮游戲
這篇文章主要為大家詳細(xì)介紹了C++控制臺(tái)實(shí)現(xiàn)隨機(jī)生成路徑迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05C#開(kāi)源類(lèi)庫(kù)SimpleTCP使用方法
SimpleTCP內(nèi)部有一個(gè)特殊字符分割字符串的協(xié)議可以直接使用,也可以在DataReceived事件處理程序中實(shí)現(xiàn)自己的協(xié)議,這篇文章主要介紹了C#開(kāi)源類(lèi)庫(kù)SimpleTCP的使用方法,需要的朋友可以參考下2021-09-09如何利用C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器詳解
這篇文章主要給大家介紹了關(guān)于如何利用C語(yǔ)言實(shí)現(xiàn)最簡(jiǎn)單的HTTP服務(wù)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11