這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)——《推箱子項(xiàng)目》,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下!
本項(xiàng)目結(jié)合了分支,循環(huán),數(shù)組的結(jié)合,并且對(duì)邏輯也是有一定的要求,但是這些在我們項(xiàng)目源碼里面都會(huì)有注釋,大家到時(shí)候?qū)W習(xí)的時(shí)候千萬(wàn)不要忽略注釋,注釋可以更好地幫你理解代碼,尤其是C語(yǔ)言初學(xué)者。
本項(xiàng)目編譯環(huán)境:VS2019/VS2013;
插件:圖形庫(kù)插件easyX;
源代碼示例
1.頭文件
2.關(guān)卡設(shè)置(這里我們定義一個(gè)三維數(shù)組,三維數(shù)組大家可以理解為多個(gè)二維數(shù)組)
int cas = 0;
IMAGE img0, img1, img2, img3, img4, img5;
int map[3][8][8] =
{
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 0, 0, 0,
0, 0, 1, 3, 1, 0, 0, 0,
0, 0, 1, 0, 1, 1, 1, 1,
1, 1, 1, 4, 0, 4, 3, 1,
1, 3, 0, 4, 5, 1, 1, 1,
1, 1, 1, 1, 4, 1, 0, 0,
0, 0, 0, 1, 3, 1, 0, 0,
0, 0, 0, 1, 1, 1, 0, 0,
};
3.繪制推箱子地圖
void drawmap()
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
int x = j * 64;
int y = i * 64;
switch (map[cas][i][j])
{
case 0: //空地
putimage(x, y, &img0);
//printf(" ");
break;
case 1: //墻
putimage(x, y, &img1);
//printf("█");
break;
case 3: //目的地:籃筐
putimage(x, y, &img2);
//printf("☆");
break;
case 4: //箱子:籃球
putimage(x, y, &img3);
//printf("★");
break;
case 5: //人:CXK
case 8:
putimage(x, y, &img4);
//printf("人");
break;
case 7: //把箱子推進(jìn)目的地:雞
putimage(x, y, &img5);
//printf("⊙");
break;
}
}
printf(" ");
}
}
4.游戲過(guò)程(這部分是整個(gè)游戲的核心部分,也是最難理解的部分,大家要仔細(xì)解讀)
void playGame()
{
//按鍵操作:游戲過(guò)程
//找人:找CXK:遍歷二維數(shù)組--->元素= 5||8
int i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
//找人
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;//break只能跳出一層循環(huán)
}
}
//找人
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;//break只能跳出一層循環(huán)
}
}
//已經(jīng)找到人了
//通過(guò)鍵盤操作人物
char userKey = _getch();
switch (userKey)
{
//那幾個(gè)鍵移動(dòng):wsad 箭頭:小鍵盤 鍵碼值:72 80 75 77
case 'w':
case 'W':
case 72:
//移動(dòng)的原理:改變二維數(shù)組元素的值
//移動(dòng)的步驟:
//1.先讓人移動(dòng) map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
{
//人移動(dòng)的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i - 1][j] += 5;
}
//2.推箱子,讓箱子移動(dòng)
//先找到(固定)箱子
if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
{
//籃球,箱子移動(dòng)的條件
if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
{
//推箱子的原理:移動(dòng)元素值
map[cas][i][j] -= 5;
map[cas][i - 1][j] += 5;
map[cas][i - 1][j] -= 4;
map[cas][i - 2][j] += 4;
}
}
break;
case 's':
case 'S':
case 80:
//1.先讓人移動(dòng) map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
{
//人移動(dòng)的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i + 1][j] += 5;
}
//2.推箱子,讓箱子移動(dòng)
//先找到(固定)箱子
if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
{
//籃球,箱子移動(dòng)的條件
if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
{
//推箱子的原理:移動(dòng)元素值
map[cas][i][j] -= 5;
map[cas][i + 1][j] += 5;
map[cas][i + 1][j] -= 4;
map[cas][i + 2][j] += 4;
}
}
break;
case 'a':
case 'A':
case 75:
//1.先讓人移動(dòng) map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
{
//人移動(dòng)的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j - 1] += 5;
}
//2.推箱子,讓箱子移動(dòng)
//先找到(固定)箱子
if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
{
//籃球,箱子移動(dòng)的條件
if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
{
//推箱子的原理:移動(dòng)元素值
map[cas][i][j] -= 5;
map[cas][i][j - 1] += 5;
map[cas][i][j - 1] -= 4;
map[cas][i][j - 2] += 4;
}
}
break;
case 'd':
case 'D':
case 77:
//1.先讓人移動(dòng) map[cas][i-1][j]=0||map[cas][i-1][j]=3
if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
{
//人移動(dòng)的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j + 1] += 5;
}
//2.推箱子,讓箱子移動(dòng)
//先找到(固定)箱子
if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
{
//籃球,箱子移動(dòng)的條件
if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
{
//推箱子的原理:移動(dòng)元素值
map[cas][i][j] -= 5;
map[cas][i][j + 1] += 5;
map[cas][i][j + 1] -= 4;
map[cas][i][j + 2] += 4;
}
}
break;
}
}
int gameOver()
{
int flag = 0;
//遍歷二維數(shù)組元素-->目的地:球框
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 3)
{
flag = 1;
}
}
}
return flag;
}
5.主函數(shù)部分
int main()
{
loadimage(&img0, L"0.bmp"); //64*64
loadimage(&img1, L"1.bmp"); //64*64
loadimage(&img2, L"3.bmp"); //64*64
loadimage(&img3, L"4.bmp"); //64*64
loadimage(&img4, L"5.bmp"); //64*64
loadimage(&img5, L"7.bmp"); //64*64
initgraph(64 * 8, 64 * 8);
while (1)
{
drawmap();
playGame();
if (!gameOver())
{
cas++;
if (cas == 3)
break;
}
system("cls");
}
//initgraph(600,600);//窗口:寬度*高度
////貼圖:基本貼圖技術(shù)
////1.定義圖片變量
//IMAGE img;
////2.加載圖片
//loadimage(&img, L"timg.jpg", 600, 600);
////3.顯示圖片
//putimage(0, 0, &img);
while (1); //防止閃屏
closegraph(); //關(guān)閉窗口
return 0;
}
整個(gè)項(xiàng)目的源碼已經(jīng)分享,這是一個(gè)三關(guān)完善的推箱子游戲,大家如果有興趣可以自己去試試做更多的關(guān)卡來(lái)玩!
如果學(xué)習(xí)的過(guò)程中有什么問(wèn)題,以及本項(xiàng)目有什么不懂的地方,都可以來(lái)找我交流,我來(lái)幫你!
那么今天的分享就到這里了,后續(xù)會(huì)更新更多精彩項(xiàng)目的,大家要好好學(xué)C語(yǔ)言C++喲~
寫在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7595瀏覽量
135923 -
源代碼
+關(guān)注
關(guān)注
96文章
2943瀏覽量
66623
原文標(biāo)題:C語(yǔ)言項(xiàng)目實(shí)戰(zhàn):《推箱子》零基礎(chǔ)項(xiàng)目!270 行源碼注釋示例
文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論