当前位置:首页 > 新游发布 > 正文

C语言零基础项目:推箱子游戏!详细思路+源码分享

每天一个C语言小项目,提升你的编程能力!推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。效果展示:2、提供回...

每天一个C语言小项目,提升你的编程能力!推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所......

每天一个C语言小项目,提升你的编程能力!

推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

效果展示:

2、提供回复上一步的功能,可以回到任何一步走过的路径,可以给用户足够的思考空间,使用户的智力在游戏的乐趣中得到充分的锻炼。也可以一退到底。

3、屏幕上方显示当前的关数,您可以方便地选关进行游戏。

4、在目标文件夹里,可以用记事本打开文件,自行设计游戏关卡,加载界面及元素,添加后再次打开程序才能更新。

游戏中使用了图片

本项目编译环境:VisualStudio2019/2022,EasyX插件

代码展示:

//////////////////////////////////////////////////////////////游戏中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示围墙////画素材的x1和y1都是反的,因为x表示行,但是画出来x表示列,y同////////////////////////////////////////////////////////////#,y;//人物坐标intloop;//控制是否重新开始IMAGEimg[8];//定义IMAGE对象数组来保存图片/*******************函数声明*******************/voidblank(intx1,inty1);//画空地voidman(intx1,inty1);//画皮卡丘voidbox(intx1,inty1);//画箱子voiddest(intx1,inty1);//画目的地voidman1(intx1,inty1);//画在目的地上的皮卡丘voidbox1(intx1,inty1);//画在目的地上的箱子voidwall(intx1,inty1);//画围墙voidman1(intx1,inty1);//画在胜利的皮卡丘voidprint(inta[15][15]);//把数组里的全画出来voidmove(inta[15][15],intx1,inty1);//移动voidfind(inta[15][15]);//找人物坐标intwin(inta[15][15]);//判断游戏是否结束intplay(inta[15][15]);//游戏过程voidplay1(void);//游戏关卡/*******************函数定义*******************///画空地voidblank(intx1,inty1){putimage(y1,x1,img[0]);//在坐标(y1,x1)位置显示IMAGE对象}//画皮卡丘voidman(intx1,inty1){putimage(y1,x1,img[1]);//在坐标(y1,x1)位置显示IMAGE对象}//画箱子voidbox(intx1,inty1){putimage(y1,x1,img[2]);//在坐标(y1,x1)位置显示IMAGE对象}//画目的地voiddest(intx1,inty1){putimage(y1,x1,img[3]);//在坐标(y1,x1)位置显示IMAGE对象}//画在目的地上的皮卡丘voidman1(intx1,inty1){putimage(y1,x1,img[4]);//在坐标(y1,x1)位置显示IMAGE对象}//画在目的地上的箱子voidbox1(intx1,inty1){putimage(y1,x1,img[5]);//在坐标(y1,x1)位置显示IMAGE对象}//画围墙voidwall(intx1,inty1){putimage(y1,x1,img[6]);//在坐标(y1,x1)位置显示IMAGE对象}//画胜利的皮卡丘voidman2(intx1,inty1){putimage(y1,x1,img[7]);//在坐标(y1,x1)位置显示IMAGE对象}//把数组里的全画出来voidprint(inta[][10]){for(intx1=0;x110;x1++)for(inty1=0;y110;y1++)putimage(60*y1,60*x1,img[a[x1][y1]]);}//移动voidmove(inta[][10],intx1,inty1){if(a[x+x1][y+y1]==0||a[x+x1][y+y1]==3){a[x][y]--;a[x+x1][y+y1]++;for(inti=0;i60;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);}elseif((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(inti=0;i60;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,yvoidfind(inta[][10]){for(x=0;x10;x++)for(y=0;y10;y++)if(a[x][y]==1)return;}//判断游戏是否结束intwin(inta[][10]){for(intx1=0;x110;x1++)for(inty1=0;y110;y1++)if(a[x1][y1]==2)return0;//如果还有箱子返回假return1;//如果没有箱子返回真}/************************游戏过程**********************///游戏过程intplay(inta[][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;return0;//重新开始当前关case27:exit(0);break;//结束游戏case0:case0xE0://如果是方向键switch(getch())//再次获取键盘{case72:move(a,-1,0);break;case75:move(a,0,-1);break;case77:move(a,0,1);break;case80:move(a,1,0);}}}while(!win(a));//通过win函数判断是否通过man2(60*x,60*y);//画一个开心的皮卡丘getch();return0;}//游戏关卡voidplay1(void){inta[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}}};intb[10][10];//设置当前地图数组for(inti=0;i5;i++){do{loop=0;//loop置为0for(intx1=0;x110;x1++)for(inty1=0;y110;y1++)b[x1][y1]=a[i][x1][y1];//对当前地图数组分别赋值play(b);}while(loop);//如果loop被置为1则重新开始}}/************************主函数***********************/intmain(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();return0;}

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

最新文章