詳解C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能
1.前言
首先推箱子是c語(yǔ)言的一個(gè)經(jīng)典的項(xiàng)目,本篇文字將會(huì)介紹如何從零開始實(shí)現(xiàn)c語(yǔ)言如何實(shí)現(xiàn)推箱子
2.游戲效果展示
3.項(xiàng)目分析
游戲元素:
- 空地 0
- 墻壁 1
- 角色 2
- 箱子 3
- 勝利點(diǎn) 4
游戲目的:
玩家控制角色在地圖的空地上進(jìn)行移動(dòng),通過(guò)推動(dòng)箱子躲避障礙,將所有的箱子推至勝利點(diǎn)即可成功。
4.地圖實(shí)現(xiàn)
4.1存儲(chǔ)地圖
首先存儲(chǔ)地圖我們使用數(shù)組來(lái)進(jìn)行存儲(chǔ),為什么我們會(huì)用到char而不是int?是因?yàn)閕nt普遍為4字節(jié),char為1字節(jié),我們就可以大大減少存儲(chǔ)地圖所需要的內(nèi)存。如果要寫多張地圖的話,僅僅將數(shù)組擴(kuò)充至三維即可,作者將會(huì)在之后的文章進(jìn)行說(shuō)明。
char map[10][10] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 1, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, { 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 0, 0, 3, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
4.2打印地圖
對(duì)應(yīng)地圖的打印我們則需要對(duì)地圖進(jìn)行遍歷,利用switch語(yǔ)句將地圖打印在控制臺(tái)上面。
for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { switch (map[i][j]) { case 0: printf(" "); // 注意一點(diǎn)是兩個(gè)空格,如果是一個(gè)空格的時(shí)候會(huì)使地圖打印出現(xiàn)一些問(wèn)題 break; case 1: printf("█"); break; case 2: printf("♀"); break; case 3: printf("●"); break; case 4: printf("☆"); break; default: break; } } printf("\n"); }
5.控制角色移動(dòng)
5.1找到控制的角色
int posX = 0, posY = 0; for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (2 == map[i][j] || 2 + 4 == map[i][j]) { posX = i; posY = j; break; //找到角色,記錄其所在的x軸和y軸的坐標(biāo) } } }
5.2實(shí)現(xiàn)移動(dòng)
// 控制(鍵盤:WSAD(上下左右)) // 需要從鍵盤獲取按鍵(字符) switch (getch()) // getch()該方法需要在開頭導(dǎo)入#include <conio.h> { case 'w': case 'W': printf("向上\n"); /* 向上邏輯: 改變數(shù)組元素的值 以人為參考 上面可能是: 空地 移動(dòng) 墻壁 不動(dòng) 成功點(diǎn) 移動(dòng) 箱子 判斷箱子上面是個(gè)啥 空地 移動(dòng) 成功點(diǎn) 移動(dòng) 墻壁 不動(dòng) 另一個(gè)箱子 不動(dòng) */ // 上面是空地或成功點(diǎn) map[posX][posY]:主角所在的位置 if (0 == map[posX - 1][posY] || 4 == map[posX - 1][posY]) { // 當(dāng)前位置人離開 map[posX][posY] -= 2; // 上面位置人過(guò)來(lái) map[posX - 1][posY] += 2; } // 上面是箱子(將箱子從點(diǎn)上推走) else if (3 == map[posX - 1][posY] || 3 + 4 == map[posX - 1][posY]) { // 箱子上面是空地或成功點(diǎn) map[posX - 1][posY]: 箱子位置 if (0 == map[posX - 2][posY] || 4 == map[posX - 2][posY]) { // 當(dāng)前位置人離開 map[posX][posY] -= 2; // 上面位置人過(guò)來(lái) map[posX - 1][posY] += 2; // 上面位置箱子離開 map[posX - 1][posY] -= 3; // 上面的上面箱子過(guò)來(lái) map[posX - 2][posY] += 3; } } break; case 's': case 'S': printf("向下\n"); break; case 'a': case 'A': printf("向左\n"); break; case 'd': case 'D': printf("向右\n"); break; default: break; }
6.判斷勝利
對(duì)地圖遍歷搜索,如果發(fā)現(xiàn)沒有箱子的話,就可以判斷為勝利。(size_t是C++里面的東西,size_t相當(dāng)于unsigned int,這里僅做理解即可,可以用int來(lái)代替size_t)
bool isWin() { for (size_t i = 0; i < 10; i++) { for (size_t j = 0; j < 10; j++) { if (map[i][j] == 3) { return false; } } } return true; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下2017-03-03C++ Boost.Range與Adapters庫(kù)使用詳解
這篇文章主要介紹了C++ Boost.Range與Adapters庫(kù)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11C++編程中使用設(shè)計(jì)模式中的policy策略模式的實(shí)例講解
這篇文章主要介紹了C++編程中使用設(shè)計(jì)模式中的policy策略模式的實(shí)例講解,文章最后對(duì)策略模式的優(yōu)缺點(diǎn)有一個(gè)簡(jiǎn)單的總結(jié),需要的朋友可以參考下2016-03-03Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn)
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCScene、CCLayer、CCSprite的默認(rèn)坐標(biāo)和默認(rèn)錨點(diǎn)實(shí)驗(yàn),這是一個(gè)非常值得研究的問(wèn)題,需要的朋友可以參考下2014-09-09