怎么用C语言实现推箱子
这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
地图代码修改成函数注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件。
对上篇文章的推箱子的地图代码进行函数封装,成果如下:
voiddrawMap(){system("CLS");//使用循环,遍历数组(将游戏数据图形化)for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){/*printf("%2d",map[i][j]);*/switch(map[i][j]){case0:printf("");//两个空格break;case1:printf("█");break;case2:printf("♀");break;case3:printf("●");break;case4:printf("☆");break;default:break;}}printf("\n");}}
而存储地图的地方可以放在主函数体外面来进行声明。
在这之后如果推到成功点和人走到成功点上仅需要加上case 2+4和case 3+4两个条件即可,具体代码如最后源码所示。
角色移动修改成函数对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。
1寻找角色函数在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。
//移动逻辑参数:intX,intYX和Y方向的偏移量voidmove(intX,intY){//1找人intposX=0,posY=0;for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){if(2==map[i][j]||2+4==map[i][j]){posX=i;posY=j;break;}}}//空地或成功点map[posX][posY]:主角所在的位置if(0==map[posX+X][posY+Y]||4==map[posX+X][posY+Y]){map[posX][posY]-=2;map[posX+X][posY+Y]+=2;}//箱子(将箱子从点上推走)elseif(3==map[posX+X][posY+Y]||3+4==map[posX+X][posY+Y]){//箱子上面是空地或成功点map[posX-1][posY]:箱子位置if(0==map[posX+(X*2)][posY+(Y*2)]||4==map[posX+(X*2)][posY+(Y*2)]){//当前位置人离开map[posX][posY]-=2;map[posX+X][posY+Y]+=2;map[posX+X][posY+Y]-=3;map[posX+(X*2)][posY+(Y*2)]+=3;}}}2角色移动函数
该函数对键盘输入进行处理,并且通过传入2个参数来一次性对移动进行操作,不需要四个方向都需要在写一遍函数,以下写法可以防止用户开大写而移动不了角色。
voidheroMove(){//控制人物移动//2控制(键盘:WSAD(上下左右))//需要从键盘获取按键(字符)switch(getch()){case'w':case'W':move(-1,0);break;case's':case'S':move(1,0);break;case'a':case'A':move(0,-1);break;case'd':case'D':move(0,1);break;default:break;}}判断胜利修改成函数
这里用到了C++的bool类型,c语言也是可以使用,如果不想用这种函数,改成int也是可以使用的。
boolisWin(){for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){if(map[i][j]==3){returnfalse;}}}returntrue;}主体函数的实现
这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。
intmain(){while(!isWin())//游戏主循环{drawMap();heroMove();}drawMap();return0;}推箱子能实现基本功能的源码
#include<stdio.h>#include<conio.h>#include<Windows.h>charmap[10][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,1,0,0,0,1},{1,0,0,0,0,1,4,0,0,1},{1,0,0,4,0,1,1,0,0,1},{1,0,0,3,0,1,0,0,0,1},{1,0,0,2,0,0,0,0,0,1},{1,1,1,1,0,0,3,0,0,1},{1,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};/*函数声明*/voiddrawMap();voidheroMove();voidmove(intX,intY);boolisWin();intmain(){while(!isWin())//游戏主循环{drawMap();heroMove();}drawMap();return0;}/*函数定义*///绘制地图voiddrawMap(){system("CLS");//使用循环,遍历数组(将游戏数据图形化)for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){/*printf("%2d",map[i][j]);*/switch(map[i][j]){case0:printf("");//两个空格break;case1:printf("█");break;case2:printf("♀");break;case3:printf("●");break;case4:printf("☆");break;case2+4:printf("♀");break;case3+4:printf("★");break;default:break;}}printf("\n");}}voidheroMove(){//控制人物移动//2控制(键盘:WSAD(上下左右))//需要从键盘获取按键(字符)switch(getch()){case'w':case'W':move(-1,0);break;case's':case'S':move(1,0);break;case'a':case'A':move(0,-1);break;case'd':case'D':move(0,1);break;default:break;}}//移动逻辑参数:intX,intYX和Y方向的偏移量voidmove(intX,intY){//1找人intposX=0,posY=0;for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){if(2==map[i][j]||2+4==map[i][j]){posX=i;posY=j;break;}}}//空地或成功点map[posX][posY]:主角所在的位置if(0==map[posX+X][posY+Y]||4==map[posX+X][posY+Y]){map[posX][posY]-=2;map[posX+X][posY+Y]+=2;}//箱子(将箱子从点上推走)elseif(3==map[posX+X][posY+Y]||3+4==map[posX+X][posY+Y]){//箱子上面是空地或成功点map[posX-1][posY]:箱子位置if(0==map[posX+(X*2)][posY+(Y*2)]||4==map[posX+(X*2)][posY+(Y*2)]){//当前位置人离开map[posX][posY]-=2;map[posX+X][posY+Y]+=2;map[posX+X][posY+Y]-=3;map[posX+(X*2)][posY+(Y*2)]+=3;}}}//判断胜利boolisWin(){for(size_ti=0;i<10;i++){for(size_tj=0;j<10;j++){if(map[i][j]==3){returnfalse;}}}returntrue;}
到此,关于“怎么用C语言实现推箱子”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。