每天一個(gè)C語言小項(xiàng)目,提升你的編程能力!
推箱子是一個(gè)來自日本的古老游戲,目的是在訓(xùn)練你的邏輯思考能力。在一個(gè)狹小的倉庫中,要求把木箱放到指定的位置,稍不小心就會(huì)出現(xiàn)箱子無法移動(dòng)或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動(dòng)的次序和位置,才能順利的完成任務(wù)。
效果展示:
1、游戲同時(shí)支持鼠標(biāo)和鍵盤操作,鼠標(biāo)操作時(shí),可點(diǎn)擊任意你想去的地方。
2、提供回復(fù)上一步的功能,可以回到任何一步走過的路徑,可以給用戶足夠的思考空間,使用戶的智力在游戲的樂趣中得到充分的鍛煉。也可以一退到底。
3、屏幕上方顯示當(dāng)前的關(guān)數(shù),您可以方便地選關(guān)進(jìn)行游戲。
4、在目標(biāo)文件夾里,可以用記事本打開文件,自行設(shè)計(jì)游戲關(guān)卡,加載界面及元素,添加后再次打開程序才能更新。
游戲中使用了圖片,【點(diǎn)擊這里下載完整項(xiàng)目】
本項(xiàng)目編譯環(huán)境:Visual Studio 2019/2022,EasyX插件
代碼展示:
//////////////////////////////////////////////////////////// //游戲中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示圍墻 // //畫素材的x1和y1都是反的,因?yàn)閤表示行,但是畫出來x表示列,y同 //////////////////////////////////////////////////////////// #include#include #include int x, y; //人物坐標(biāo) int loop; //控制是否重新開始 IMAGE img[8]; //定義IMAGE對(duì)象數(shù)組來保存圖片 /*******************函數(shù)聲明*******************/ void blank(int x1, int y1); //畫空地 void man (int x1, int y1); //畫皮卡丘 void box (int x1, int y1); //畫箱子 void dest (int x1, int y1); //畫目的地 void man1 (int x1, int y1); //畫在目的地上的皮卡丘 void box1 (int x1, int y1); //畫在目的地上的箱子 void wall (int x1, int y1); //畫圍墻 void man1 (int x1, int y1); //畫在勝利的皮卡丘 void print(int a[15][15]); //把數(shù)組里的全畫出來 void move (int a[15][15], int x1, int y1); //移動(dòng) void find (int a[15][15]); //找人物坐標(biāo) int win (int a[15][15]); //判斷游戲是否結(jié)束 int play (int a[15][15]); //游戲過程 void play1 (void); //游戲關(guān)卡 /*******************函數(shù)定義*******************/ //畫空地 void blank(int x1, int y1) { putimage(y1, x1, &img[0]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫皮卡丘 void man(int x1, int y1) { putimage(y1, x1, &img[1]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫箱子 void box(int x1, int y1) { putimage(y1, x1, &img[2]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫目的地 void dest(int x1, int y1) { putimage(y1, x1, &img[3]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫在目的地上的皮卡丘 void man1(int x1, int y1) { putimage(y1, x1, &img[4]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫在目的地上的箱子 void box1(int x1, int y1) { putimage(y1, x1, &img[5]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫圍墻 void wall(int x1, int y1) { putimage(y1, x1, &img[6]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //畫勝利的皮卡丘 void man2(int x1, int y1) { putimage(y1, x1, &img[7]); // 在坐標(biāo) (y1, x1) 位置顯示 IMAGE 對(duì)象 } //把數(shù)組里的全畫出來 void print(int a[][10]) { for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) putimage(60 * y1, 60 * x1, &img[a[x1][y1]]); } //移動(dòng) void move(int a[][10], int x1, int y1) { if(a[x + x1][y + y1] == 0 || a[x + x1][y + y1] == 3) { a[x][y]--; a[x + x1][y + y1]++; for(int i = 0; i < 60; i++) { blank(60 * x + i * x1, 60 * y + i * y1); //擦掉 man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1); Sleep(1); //為了降低CPU且保存流暢 } if(a[x][y] == 3) dest(60 * x, 60 * y); x += x1; y += y1; if(a[x][y] == 4) man1(60 * x, 60 * y); } else if((a[x + x1][y + y1] == 2 || a[x + x1][y + y1] == 5) && (a[x + 2 * x1][y + 2 * y1] == 0 || a[x + 2 * x1][y + 2 * y1] == 3)) { a[x][y]--; a[x + x1][y + y1]--; a[x + 2 * x1][y + 2 * y1] += 2; for(int i = 0; i < 60; i++) { blank(60 * (x + x1) + i * x1, 60 * (y + y1) + i * y1); //擦掉 box(60 * (x + x1) + (i + 1) * x1, 60 * (y + y1) + (i + 1) * y1); blank(60 * x + i * x1, 60 * y + i * y1); //擦掉 man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1); Sleep(1); //為了降低CPU且保存流暢 } if(a[x][y] == 3) dest(60 * x, 60 * y); x += x1; y += y1; if(a[x][y] == 4) man1(60 * x, 60 * y); if(a[x+x1][y+y1] == 5) box1(60 * (x + x1), 60 * (y + y1)); } } //找人物坐標(biāo)想x,y void find(int a[][10]) { for(x = 0; x < 10; x++) for(y = 0; y < 10; y++) if(a[x][y] == 1) return; } //判斷游戲是否結(jié)束 int win(int a[][10]) { for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) if(a[x1][y1] == 2) return 0; //如果還有箱子返回假 return 1; //如果沒有箱子返回真 } /************************游戲過程**********************/ //游戲過程 int play(int a[][10]) { loop = 0; print(a); find(a); //通過find函數(shù)尋找人物的x, y坐標(biāo) do { switch(getch()) //獲取鍵盤 { case 'w': case 'W':move(a, -1, 0); break; //上移 case 'a': case 'A':move(a, 0, -1); break; //左移 case 'd': case 'D':move(a, 0, 1); break; //右移 case 's': case 'S':move(a, 1, 0); break; //下移 case 'r': case 'R': case ' ':loop = 1; return 0; //重新開始當(dāng)前關(guān) case 27:exit(0); break; //結(jié)束游戲 case 0: case 0xE0: //如果是方向鍵 switch(getch()) //再次獲取鍵盤 { case 72:move(a, -1, 0); break; case 75:move(a, 0, -1); break; case 77:move(a, 0, 1); break; case 80:move(a, 1 , 0); } } }while(!win(a)); //通過win函數(shù)判斷是否通過 man2(60 * x, 60 * y); //畫一個(gè)開心的皮卡丘 getch(); return 0; } //游戲關(guān)卡 void play1(void) { int a[5][10][10]={ //定義三維地圖數(shù)組 { {0}, {0, 0, 6, 6, 6}, {0, 0, 6, 3, 6}, {0, 0, 6, 0, 6, 6, 6, 6}, {6, 6, 6, 2, 0, 2, 3, 6}, {6, 3, 0, 2, 1, 6, 6, 6}, {6, 6, 6, 6, 2, 6}, {0, 0, 0, 6, 3, 6}, {0, 0, 0, 6, 6, 6} }, { {6, 6, 6, 6, 6}, {6, 1, 0, 0, 6}, {6, 0, 2, 2, 6, 0, 6, 6, 6}, {6, 0, 2, 0, 6, 0, 6, 3, 6}, {6, 6, 6, 0, 6, 6, 6, 3, 6}, {0, 6, 6, 0, 0, 0, 0, 3, 6}, {0, 6, 0, 0, 0, 6, 0, 0, 6}, {0, 6, 0, 0, 0, 6, 6, 6, 6}, {0, 6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6}, {0, 6, 1, 0, 6, 6, 6}, {0, 6, 0, 2, 0, 0, 6}, {6, 6, 6, 0, 6, 0, 6, 6}, {6, 3, 6, 0, 6, 0, 0, 6}, {6, 3, 2, 0, 0, 6, 0, 6}, {6, 3, 0, 0, 0, 2, 0, 6}, {6, 6, 6, 6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6, 6, 6, 6}, {0, 6, 0, 1, 3, 3, 3, 6}, {0, 6, 0, 0, 0, 6, 6, 6, 6}, {6, 6, 6, 2, 0, 0, 0, 0, 6}, {6, 0, 0, 0, 6, 2, 6, 0, 6}, {6, 0, 2, 0, 6, 0, 0, 0, 6}, {6, 0, 0, 0, 6, 6, 6, 6, 6}, {6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6, 6}, {0, 6, 0, 1, 0, 6, 6, 6}, {6, 6, 0, 6, 2, 0, 0, 6}, {6, 0, 5 ,3, 0, 3, 0, 6}, {6, 0, 0, 2, 2, 0, 6, 6}, {6, 6, 6, 0, 6, 3, 6}, {0, 0, 6, 0, 0, 0, 6}, {0, 0, 6, 6, 6, 6, 6} } }; int b[10][10]; //設(shè)置當(dāng)前地圖數(shù)組 for(int i = 0; i < 5; i++) { do { loop=0; //loop置為0 for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) b[x1][y1] = a[i][x1][y1]; //對(duì)當(dāng)前地圖數(shù)組分別賦值 play(b); }while(loop); //如果loop被置為1則重新開始 } } /************************主函數(shù)***********************/ int main(void) { initgraph(600, 600); setbkcolor(WHITE); cleardevice(); loadimage(&img[0], "圖片\0.jpg"); loadimage(&img[1], "圖片\1.jpg"); loadimage(&img[2], "圖片\2.jpg"); loadimage(&img[3], "圖片\3.jpg"); loadimage(&img[4], "圖片\4.jpg"); loadimage(&img[5], "圖片\5.jpg"); loadimage(&img[6], "圖片\6.jpg"); loadimage(&img[7], "圖片\7.jpg"); play1(); closegraph(); return 0; }
大家趕緊去動(dòng)手試試吧!
審核編輯:湯梓紅
-
游戲
+關(guān)注
關(guān)注
2文章
742瀏覽量
26317 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136842 -
編程
+關(guān)注
關(guān)注
88文章
3616瀏覽量
93738 -
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29216
原文標(biāo)題:C語言零基礎(chǔ)項(xiàng)目:推箱子游戲!詳細(xì)思路+源碼分享
文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論