詳解C語言實(shí)現(xiàn)推箱子的基本功能
1.前言
首先推箱子是c語言的一個(gè)經(jīng)典的項(xiàng)目,本篇文字將會(huì)介紹如何從零開始實(shí)現(xiàn)c語言如何實(shí)現(xiàn)推箱子
2.游戲效果展示

3.項(xiàng)目分析
游戲元素:
- 空地 0
- 墻壁 1
- 角色 2
- 箱子 3
- 勝利點(diǎn) 4
游戲目的:
玩家控制角色在地圖的空地上進(jìn)行移動(dòng),通過推動(dòng)箱子躲避障礙,將所有的箱子推至勝利點(diǎn)即可成功。

4.地圖實(shí)現(xiàn)
4.1存儲(chǔ)地圖
首先存儲(chǔ)地圖我們使用數(shù)組來進(jìn)行存儲(chǔ),為什么我們會(huì)用到char而不是int?是因?yàn)閕nt普遍為4字節(jié),char為1字節(jié),我們就可以大大減少存儲(chǔ)地圖所需要的內(nèi)存。如果要寫多張地圖的話,僅僅將數(shù)組擴(kuò)充至三維即可,作者將會(huì)在之后的文章進(jìn)行說明。
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語句將地圖打印在控制臺(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)一些問題
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;
// 上面位置人過來
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;
// 上面位置人過來
map[posX - 1][posY] += 2;
// 上面位置箱子離開
map[posX - 1][posY] -= 3;
// 上面的上面箱子過來
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來代替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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
在Visual Studio中配置C++最新版netCDF庫的方法
本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結(jié)合的形式介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03
對(duì)C++ string append方法的常用用法詳解
今天小編就為大家分享一篇對(duì)C++ string append方法的常用用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
解析設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用
這篇文章主要介紹了設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用,需要的朋友可以參考下2016-03-03
C語言匯編分析傳遞結(jié)構(gòu)體指針比傳遞結(jié)構(gòu)體變量高效的深層原因
本文章使用的工具是vs2010,本篇文章主要講解結(jié)構(gòu)體指針作為參數(shù)傳遞與結(jié)構(gòu)體變量作為參數(shù)傳遞的對(duì)比,不談值傳遞與址傳遞的概念2022-10-10

