推箱子游戏(老版经典推箱子手机版)
每天一个C语言小项目,提升你的编程能力!
推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
效果展示:
1、游戏同时支持鼠标和键盘操作,鼠标操作时,可点击任意你想去的地方。
2、提供回复上一步的功能,可以回到任何一步走过的路径,可以给用户足够的思考空间,使用户的智力在游戏的乐趣中得到充分的锻炼。也可以一退到底。
3、屏幕上方显示当前的关数,您可以方便地选关进行游戏。
4、在目标文件夹里,可以用记事本打开文件,自行设计游戏关卡,加载界面及元素,添加后再次打开程序才能更新。
游戏中使用了图片
本项目编译环境:Visual Studio 2019/2022,EasyX插件
代码展示:
//////////////////////////////////////////////////////////////游戏中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示围墙////画素材的x1和y1都是反的,因为x表示行,但是画出来x表示列,y同////////////////////////////////////////////////////////////#include <graphics.h>#include <conio.h>#include <stdlib.h>int x, y;//人物坐标int loop;//控制是否重新开始IMAGE img[8]; //定义IMAGE对象数组来保存图片/*******************函数声明*******************/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]); //把数组里的全画出来void move (int a[15][15], int x1, int y1);//移动void find (int a[15][15]); //找人物坐标int win (int a[15][15]);//判断游戏是否结束int play (int a[15][15]); //游戏过程void play1 (void); //游戏关卡/*******************函数定义*******************///画空地void blank(int x1, int y1){putimage(y1, x1, &img[0]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画皮卡丘void man(int x1, int y1){putimage(y1, x1, &img[1]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画箱子void box(int x1, int y1){putimage(y1, x1, &img[2]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画目的地void dest(int x1, int y1){putimage(y1, x1, &img[3]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画在目的地上的皮卡丘void man1(int x1, int y1){putimage(y1, x1, &img[4]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画在目的地上的箱子void box1(int x1, int y1){putimage(y1, x1, &img[5]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画围墙void wall(int x1, int y1){putimage(y1, x1, &img[6]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//画胜利的皮卡丘void man2(int x1, int y1){putimage(y1, x1, &img[7]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象}//把数组里的全画出来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]]); }//移动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));}}//找人物坐标想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;}//判断游戏是否结束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函数寻找人物的x, y坐标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;//重新开始当前关 case 27:exit(0);break;//结束游戏 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函数判断是否通过man2(60 * x, 60 * y);//画一个开心的皮卡丘getch();return 0;}//游戏关卡void play1(void){int a[5][10][10]={//定义三维地图数组{{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];//设置当前地图数组 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];//对当前地图数组分别赋值 play(b);}while(loop);//如果loop被置为1则重新开始}}/************************主函数***********************/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;}
大家赶紧去动手试试吧!
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
\u003C\u0070\u003E\u975E\u5E38\u611F\u8C22\u5927\u5BB6\u805A\u96C6\u5728\u8FD9\u91CC\u5171\u540C\u63A2\u8BA8\u68A6\u5E7B\u897F\u6E38\u5B98\u65B9\u0039\u0035\u643A\u5E26\u5BA0\u7684\u8BDD\u9898\u3002\u8FD9\u4E2A\u95EE\u9898\u96C6\u5408\u ...
梦幻西游手游65级可以带的今日更新是一个不断发展的过程,它反映了人们对生活品质的不断追求。今天,我将和大家探讨关于梦幻西游手游65级可以带的今日更新,让我们一起感受它带来的高品质生活。
大家好,今天我想和大家分析一下“dnf异界裂魂装备有什么用”的优缺点。为了让大家更好地理解这个问题,我将相关资料进行了整合,现在就让我们一起来分析吧。
大家好,很高兴能够为大家解答这个鲁肃诸葛亮最强阵容搭配问题集合。我将根据我的知识和经验,为每个问题提供清晰和详细的回答,并分享一些相关的案例和研究成果,以促进大家的学习和思考。
接下来,我将为大家详细解析一下问道70装备共鸣属性表的问题,希望我的回答可以解决大家的疑惑。下面,让我们来探讨一下问道70装备共鸣属性表的话题。
现在,我将着重为大家解答有关强敌挑战阵容搭配推荐排行的问题,希望我的回答能够给大家带来一些启发。关于强敌挑战阵容搭配推荐排行的话题,我们开始讨论吧。
非常欢迎大家参与这个赏金猎人大学版阵容搭配问题集合的探讨。我将以开放的心态回答每个问题,并尽量给出多样化的观点和角度,以期能够启发大家的思考。
大家好,今天我将为大家讲解皇子最佳阵容搭配攻略图的问题。为了让大家更好地理解这个问题,我将相关资料进行了整理,现在就让我们一起来看看吧。
dnf 纹章是装备哪里的的今日更新是一个不断变化的过程,它涉及到许多方面。今天,我将与大家分享关于dnf 纹章是装备哪里的的最新动态,希望我的介绍能为有需要的朋友提供一些帮助。
大家好,很高兴有机会和大家一起探讨男枪炮用什么传说武器的问题。我将用专业的态度回答每个问题,同时分享一些具体案例和实践经验,希望这能对大家有所启发。
下面,我将以我的观点和见解来回答大家关于造梦西游ol怎么增加宠物技能的问题,希望我的回答能够帮助到大家。现在,让我们开始聊一聊造梦西游ol怎么增加宠物技能的话题。
仙剑官宣阵容装备搭配表的今日更新是一个不断变化的过程,它涉及到许多方面。今天,我将与大家分享关于仙剑官宣阵容装备搭配表的最新动态,希望我的介绍能为有需要的朋友提供一些帮助。
谢谢大家给我提供关于云顶之弈夜影阵容搭配的问题集合。我将从不同的角度回答每个问题,并提供一些相关资源和参考资料,以便大家进一步学习和了解。
好久不见了,今天我想和大家探讨一下关于“物理画线攻略视频6关”的话题。如果你对这个领域还不太了解,那么这篇文章就是为你准备的,让我们一看看吧。
非常欢迎大家参与这个贪婪洞窟法师最终装备问题集合的探讨。我将以开放的心态回答每个问题,并尽量给出多样化的观点和角度,以期能够启发大家的思考。