這篇文章主要為大家詳細介紹了C語言實現——《推箱子項目》,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下!
本項目結合了分支,循環,數組的結合,并且對邏輯也是有一定的要求,但是這些在我們項目源碼裡面都會有注釋,大家到時候學習的時候千萬不要忽略注釋,注釋可以更好地幫你理解代碼,尤其是C語言初學者。
本項目編譯環境:VS2019/VS2013;
插件:圖形庫插件easyX;
效果圖展示
1.頭文件
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h> //easyX圖形庫頭文件
#include<conio.h>
2.關卡設置(這裡我們定義一個三維數組,三維數組大家可以理解為多個二維數組)
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: //把箱子推進目的地:雞
putimage(x, y, &img5);
//printf("⊙");
break;
}
}
printf("\n");
}
}
4.遊戲過程(這部分是整個遊戲的核心部分,也是最難理解的部分,大家要仔細解讀)
void playGame()
{
//按鍵操作:遊戲過程
//找人:找CXK:遍曆二維數組--->元素= 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隻能跳出一層循環
}
}
//找人
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;//break隻能跳出一層循環
}
}
//已經找到人了
//通過鍵盤操作人物
char userKey = _getch();
switch (userKey)
{
//那幾個鍵移動:wsad 箭頭:小鍵盤 鍵碼值:72 80 75 77
case 'w':
case 'W':
case 72:
//移動的原理:改變二維數組元素的值
//移動的步驟:
//1.先讓人移動 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)
{
//人移動的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i - 1][j] = 5;
}
//2.推箱子,讓箱子移動
//先找到(固定)箱子
if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
{
//籃球,箱子移動的條件
if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
{
//推箱子的原理:移動元素值
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.先讓人移動 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)
{
//人移動的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i 1][j] = 5;
}
//2.推箱子,讓箱子移動
//先找到(固定)箱子
if (map[cas][i 1][j] == 4 || map[cas][i 1][j] == 7)
{
//籃球,箱子移動的條件
if (map[cas][i 2][j] == 0 || map[cas][i 2][j] == 3)
{
//推箱子的原理:移動元素值
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.先讓人移動 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)
{
//人移動的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j - 1] = 5;
}
//2.推箱子,讓箱子移動
//先找到(固定)箱子
if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
{
//籃球,箱子移動的條件
if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
{
//推箱子的原理:移動元素值
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.先讓人移動 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)
{
//人移動的原理:元素的值
map[cas][i][j] -= 5;
map[cas][i][j 1] = 5;
}
//2.推箱子,讓箱子移動
//先找到(固定)箱子
if (map[cas][i][j 1] == 4 || map[cas][i][j 1] == 7)
{
//籃球,箱子移動的條件
if (map[cas][i][j 2] == 0 || map[cas][i][j 2] == 3)
{
//推箱子的原理:移動元素值
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;
//遍曆二維數組元素-->目的地:球框
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.主函數部分
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);//窗口:寬度*高度
////貼圖:基本貼圖技術
////1.定義圖片變量
//IMAGE img;
////2.加載圖片
//loadimage(&img, L"timg.jpg", 600, 600);
////3.顯示圖片
//putimage(0, 0, &img);
while (1); //防止閃屏
closegraph(); //關閉窗口
return 0;
}
整個項目的源碼已經分享,這是一個三關完善的推箱子遊戲,大家如果有興趣可以自己去試試做更多的關卡來玩!
如果學習的過程中有什麼問題,以及本項目有什麼不懂的地方,都可以來找我交流,我來幫你!
那麼今天的分享就到這裡了,後續會更新更多精彩項目的,大家要好好學C語言C 喲~
寫在最後:對于準備學習C/C 編程的小夥伴,如果你想更好的提升你的編程核心能力(内功)不妨從現在開始!
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!