C语言推箱子步伐
- 格式:pdf
- 大小:140.93 KB
- 文档页数:5
推箱子C语言程序报告推箱子是一种极富智慧和策略性的游戏,是著名的益智游戏之一、它不仅可以锻炼人们的逻辑思维能力和创造力,而且还能提高人们的解决问题的能力和耐心。
本篇报告将介绍一个基于C语言开发的推箱子游戏,包括游戏规则、程序设计思路和实现效果等方面的内容。
一、游戏规则推箱子游戏的规则十分简单,玩家需要操作一个小人将该场景中的木箱全部推到指定位置。
在游戏开始时,场景中会放置一定数量的木箱和一个小人。
玩家可以通过键盘输入上下左右四个方向键来移动小人,小人可以推动场景中的木箱,但不能直接拉动或推动多个箱子。
当所有的木箱都被推到指定位置时,游戏胜利,反之则失败。
二、程序设计思路推箱子游戏的实现涉及到场景的渲染、小人和木箱的移动、游戏的逻辑判断等多个方面。
下面将分别介绍这些方面的程序设计思路。
1.场景渲染2.小人和木箱的移动玩家操作小人的移动,可以通过监听键盘输入的方向键来实现。
根据输入的方向,判断小人与目标位置的关系,如果目标位置是空地或者指定位置,则小人可以移动到目标位置,否则不能移动。
当小人移动后,如果目标位置是木箱,则需要判断木箱与目标位置的关系,如果目标位置是空地或者指定位置,则木箱可以被推动到目标位置,否则不能推动。
3.游戏逻辑判断在每一次小人移动后,需要判断游戏是否胜利或失败。
胜利的条件是所有的木箱都被推到指定位置,判断的方法是在遍历整个场景时,检查是否存在未推到指定位置的木箱。
失败的条件是小人无法再移动,判断的方法是在判断小人是否能够移动时,如果没有可移动的方向,则游戏失败。
三、实现效果通过以上的程序设计思路,可以开发出一个基于C语言的推箱子游戏。
该游戏可以提供丰富的关卡和难度选择,让玩家能够不断挑战和提高自己的智力。
游戏的界面简洁明了,操作方便快捷,给玩家带来舒适的游戏体验。
总结:推箱子是一种极富智慧的益智游戏,本篇报告介绍了一个基于C语言开发的推箱子游戏。
通过对游戏规则、程序设计思路和实现效果的阐述,可以看出该游戏具有多样化的场景和难度选择,能够锻炼玩家的智力和思维能力。
C语⾔实现简单的推箱⼦游戏本⽂实例为⼤家分享了C语⾔实现简单的推箱⼦游戏的具体代码,供⼤家参考,具体内容如下项⽬实现的具体⽅案:先安装VS2019,后安装画图⼯具Easyx,安装以后就可以将推箱⼦中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)的图⽚加载到程序中显⽰出来。
游戏的实现是通过程序读取键盘中输⼊的字母,后控制加载到程序中的⼈物图⽚的移动实现⼩⼈的移动,通过⼈物图⽚和地板图⽚交换位置实现⼈物的⾏⾛,如果⼈物前⾯是箱⼦图⽚,箱⼦图⽚前⾯是地板图⽚,则⼈物图⽚和箱⼦图⽚⼀起移动,直到箱⼦图⽚前⾯是箱⼦⽬的地图⽚则箱⼦图⽚将箱⼦⽬的地替换,从⽽实现将箱⼦推到箱⼦⽬的地上。
这就是实现游戏的思路,程序中还有各种细节在下⾯进⾏讲解。
在开始编写程序时先创建⼀个c++空项⽬,把cpp⽂件和地图中相对应的元素图⽚(⼈物,墙壁,箱⼦⽬的地,箱⼦)放在同⼀个⽬录下⾯。
1、开始先进⾏地图⼤⼩的实现(1)我们先初始化图形界⾯的⼤⼩#define SCREEN_WIDTH 976#define SCREEN_HEIGHT 549//窗⼝初始化initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//括号中的是窗⼝的长和宽为了以后可以⽅便改变⼤⼩所以进⾏了宏定义(2)窗⼝⼤⼩初始化完以后进⾏开始游戏界⾯的实现IMAGE bg_img2; //申请⼀个句柄⽤来存放图⽚//游戏开始背景背景图loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //将图⽚blachground.jpg加载到&bg_img2GameStarSCREEN(&bg_img2);Sleep(1000); //休眠1000毫秒//函数GameStarSCREEN的实现//游戏开始界⾯void GameStarSCREEN(IMAGE *bg){putimage(0,0,bg); //把图⽚播放在(0,0)坐标//设置窗⼝标题HWND window = GetHWnd();//获取窗⼝SetWindowText(window,_T("推箱⼦ ***"));//设置窗⼝标题//设置⽂本样式及颜⾊settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("欢迎进⼊本⼈设置的游戏"));}游戏开始界⾯效果(3)游戏开始界⾯设置完以后进⾏游戏操作指南和游戏规则的界⾯设置//游戏正在进⾏界⾯void BeingGameSCREEN(){//清除界⾯cleardevice();//画⼀个矩形rectangle(762,30,952,244);settextcolor(WHITE); //设置字体颜⾊settextstyle(15,0,_T("宋体")); //设置字体的宽度和⾼度以及字体的类型outtextxy(772,40,_T("游戏操作指南:")); //在对应的坐标位置输出引号内的字符串outtextxy(772,60,_T("按 W 向上移动"));outtextxy(772,75,_T("按 S 向下移动"));outtextxy(772,90,_T("按 A 向左移动"));outtextxy(772,105,_T("按 D 向右移动"));outtextxy(772,130,_T("温馨提⽰:"));outtextxy(772,170,_T("请在 58 步以内完成任务"));rectangle(922,450,762,264);outtextxy(772,284,_T("您以⾛的步数为:"));}游戏操作指南效果图(4)进⾏游戏地图的实现先定义⼀个全局的⼆维数组⽤来保存地图中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)元素int map[COW][COLUMN]={{0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,2,1,0,2,1,0,0},{0,1,0,1,0,1,0,0,1,1,1,0},{0,1,0,2,0,1,1,4,1,1,1,0},{0,1,1,1,0,3,1,1,1,4,1,0},{0,1,2,1,1,4,1,1,1,1,1,0},{0,1,0,0,1,0,1,1,0,0,1,0},{0,0,0,0,0,0,0,0,0,0,0,0},};定义⼀个枚举类型⽤来设置地图中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)元素enum _PROPS{WALL_RIGHT, //墙壁为数字0FLOOR, //地板为数字1DES, //箱⼦⽬的地为数字2MAN, //⼈物为数字3BOX, //箱⼦为数字4BOX_HIT, //把箱⼦推到箱⼦⽬的地为数字5MAN_DES, //⼈站在⽬的地上为数字6ALL //全部道具的数量为数字7}poc;地图定义完以后将地图元素加在到⼆维数组中#define RATIO 61 //地图元素⼤⼩//申请⼀个全局的⼀维的数组句柄IMAGE images[ALL];//加载地图元素loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);//⽤for循环遍历⼆维数组,⼆维数组中相应坐标对应的数字与后来设置的以为数组中对应的枚举值相对应这样⽅可进⾏地图的实现 for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图⽚加载到相应的位置if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}地图实现的效果图2、进⾏游戏控制环节的实现,游戏的控制是通过控制⼩⼈的移动实现所以我们先定义⼀个全局的结构体来表⽰⼩⼈在地图中的位置struct _pos{};struct _pos man;⼩⼈坐标定义好以后我们要获取⼩⼈在地图中的坐标才能对⼩⼈进⾏移动,⼩⼈的坐标随我们不断移动⽽改变所以饿哦们要不断获取⼩⼈的坐标for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图⽚加载到相应的位置if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}(1)定义⼀个枚举类型⽤来表⽰移动的⽅向//枚举控制地图中⼩⼈的运动⽅向enum DURATION{UP,DOWN,LEFT,RIGHT};enum DURATION direct;(2)获取⼩⼈位置后对⼩⼈进⾏移动bool quit=false; //定义⼀个布尔类型do{if(_kbhit()){ //识别从键盘输⼊的字母char ch=_getch(); //从键盘输⼊字母cnt++;Record_Steps(); //记录⾛过的步数,每次进⼊识别键盘输⼊说明移动了⼀次从⽽进⾏步数加⼀if(ch==KEY_UP){gameControal(UP);}else if(ch==KEY_DOWN){gameControal(DOWN);}else if(ch==KEY_LEFT){gameControal(LEFT);}else if(ch==KEY_RIGHT){gameControal(RIGHT);}else if(ch==KEY_QUIT){quit=true;GameOverSCREEN(&bg_img);}if(isGameOver()){quit=true;GameOverSCREEN(&bg_img);}if(cnt>LEN){quit=true;FalseGameOverSCREEN(&bg_img1);}}Sleep(100);}while(quit==false);(3)⽤宏定义表⽰从键盘输⼊的字母#define KEY_UP 'W'#define KEY_DOWN 'S'#define KEY_LEFT 'A'#define KEY_RIGHT 'D'#define KEY_QUIT 'Q'(4)接下来进⾏⼈物的移动⽅向的判断//控制程序运⾏⼩⼈移动和⽅块移动void gameControal(enum DURATION direct){//对向上移动的控制if(direct==UP){if((x-1)>=STAR&&map[x-1][y]==DES){mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){mapChange(x,y,DES);mapChange(x-1,y,MAN);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){mapChange(x-2,y,BOX);mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==BOX){if(map[x-2][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX);man.x=x-1;}else if(map[x-2][y]==DES){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX_HIT);man.x=x-1;}}//对向下移动的控制}else if(direct==DOWN){if((x+1)>=STAR&&map[x+1][y]==DES){mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){mapChange(x,y,DES);mapChange(x+1,y,MAN);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){mapChange(x+2,y,BOX);mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){ mapChange(x+2,y,BOX);mapChange(x+1,y,MAN);mapChange(x,y,DES);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==BOX){if(map[x+2][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX);man.x=x+1;}else if(map[x+2][y]==DES){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX_HIT);man.x=x+1;}}//对向右移动的控制if((y+1)>=STAR&&map[x][y+1]==DES){mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){mapChange(x,y,DES);mapChange(x,y+1,MAN);man.y=y+1;}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){mapChange(x,y+2,BOX);mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((y+1)<COLUMN&&map[x][y+1]==BOX){if(map[x][y+2]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX);man.y=y+1;}else if(map[x][y+2]==DES){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX_HIT);man.y=y+1;}}//对向左移动的控制}else if(direct==LEFT){if((y-1)>=STAR&&map[x][y-1]==DES){mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){mapChange(x,y,DES);mapChange(x,y-1,MAN);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){mapChange(x,y-2,BOX);mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){ mapChange(x,y-2,BOX);mapChange(x,y-1,MAN);mapChange(x,y,DES);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==BOX){if(map[x][y-2]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX);man.y=y-1;}else if(map[x][y-2]==DES){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX_HIT);man.y=y-1;}}}}//改变地图元素void mapChange(int line,int colum,enum _PROPS poc){ map[line][colum]=poc;putimage(colum*RATIO,line*RATIO,&images[poc]);}3、⼈物控制结束以后进⾏游戏结束界⾯的设计(1)在规定步数内完成游戏的背景//游戏结束背景void GameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT}; settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}效果图(1)不在规定步数内完成游戏背景//游戏⾮正常结束背景void FalseGameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("⼩菜鸡这都完成不了真蠢")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}效果图4、具体代码实现(1)头⽂件编写#define LINE1 366#define COW1 183#define LINE2 427#define COW2 244#define RATIO 61#define LEN 100#define STAR 0#define SCREEN_WIDTH 976#define SCREEN_HEIGHT 549#define COW 9#define COLUMN 12#define KEY_UP 'W'#define KEY_DOWN 'S'#define KEY_LEFT 'A'#define KEY_RIGHT 'D'#define KEY_QUIT 'Q'int cnt=STAR;//枚举优化代码表⽰道具enum _PROPS{WALL_RIGHT,FLOOR,DES,MAN,BOX,ALL}poc;//enum _PROPS poc;//⼩⼈在⼆维数组中的位置struct _pos{int x;int y;};struct _pos man;//窗⼝初始化IMAGE images[ALL];//地图的实现int map[COW][COLUMN]={{0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,2,1,0,2,1,0,0},{0,1,0,1,0,1,0,0,1,1,1,0},{0,1,0,2,0,1,1,4,1,1,1,0},{0,1,1,1,0,3,1,1,1,4,1,0},{0,1,2,1,1,4,1,1,1,1,1,0},{0,1,0,0,1,0,1,1,0,0,1,0},{0,0,0,0,0,0,0,0,0,0,0,0},};//判断游戏是否结束//return->false 游戏未结束 return->true 游戏结束int isGameOver(){for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){if(map[i][j]==DES) return false;}}return true;}//游戏结束背景void GameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT}; settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}//游戏⾮正常结束背景void FalseGameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("⼩菜鸡这都完成不了真蠢")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}//游戏开始界⾯void GameStarSCREEN(IMAGE *bg){putimage(0,0,bg);//设置窗⼝标题HWND window = GetHWnd();//获取窗⼝SetWindowText(window,_T("推箱⼦ ***"));//设置窗⼝标题 //设置⽂本样式及颜⾊settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("欢迎进⼊本⼈设置的游戏")); }void BeingGameSCREEN(){//清除界⾯cleardevice();//画⼀个矩形rectangle(762,30,952,244);settextcolor(WHITE);settextstyle(15,0,_T("宋体"));outtextxy(772,40,_T("游戏操作指南:"));outtextxy(772,60,_T("按 W 向上移动"));outtextxy(772,75,_T("按 S 向下移动"));outtextxy(772,90,_T("按 A 向左移动"));outtextxy(772,105,_T("按 D 向右移动"));outtextxy(772,130,_T("温馨提⽰:"));outtextxy(772,170,_T("请在 58 步以内完成任务"));outtextxy(772,200,_T("退出请按 Q"));rectangle(922,450,762,264);outtextxy(772,284,_T("您以⾛的步数为:"));}//记录⼩⼈⾛过的步数void Record_Steps(){char str[16];settextstyle(40,0,_T("宋体"));sprintf(str,"%d",cnt);outtextxy(820,350,str);}//枚举控制地图中⼩⼈的运动⽅向enum DURATION{UP,DOWN,LEFT,RIGHT};enum DURATION direct;//改变地图元素void mapChange(int line,int colum,enum _PROPS poc){map[line][colum]=poc;putimage(colum*RATIO,line*RATIO,&images[poc]);}//控制程序运⾏⼩⼈移动和⽅块移动void gameControal(enum DURATION direct){int x=man.x;int y=man.y;if(direct==UP){if((x-1)>=STAR&&map[x-1][y]==DES){mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){mapChange(x,y,DES);mapChange(x-1,y,MAN);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){mapChange(x-2,y,BOX);mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==BOX){if(map[x-2][y]==FLOOR){mapChange(x-1,y,MAN);man.x=x-1;}else if(map[x-2][y]==DES){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX_HIT);man.x=x-1;}}}else if(direct==DOWN){if((x+1)>=STAR&&map[x+1][y]==DES){mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){mapChange(x,y,DES);mapChange(x+1,y,MAN);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){mapChange(x+2,y,BOX);mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){ mapChange(x+2,y,BOX);mapChange(x+1,y,MAN);mapChange(x,y,DES);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==BOX){if(map[x+2][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX);man.x=x+1;}else if(map[x+2][y]==DES){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX_HIT);man.x=x+1;}}}else if(direct==RIGHT){if((y+1)>=STAR&&map[x][y+1]==DES){mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){mapChange(x,y,DES);mapChange(x,y+1,MAN);man.y=y+1;}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){mapChange(x,y+2,BOX);mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((y+1)<COLUMN&&map[x][y+1]==BOX){if(map[x][y+2]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX);man.y=y+1;}else if(map[x][y+2]==DES){mapChange(x,y+2,BOX_HIT);man.y=y+1;}}}else if(direct==LEFT){if((y-1)>=STAR&&map[x][y-1]==DES){mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){mapChange(x,y,DES);mapChange(x,y-1,MAN);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){mapChange(x,y-2,BOX);mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){ mapChange(x,y-2,BOX);mapChange(x,y-1,MAN);mapChange(x,y,DES);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==BOX){if(map[x][y-2]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX);man.y=y-1;}else if(map[x][y-2]==DES){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX_HIT);man.y=y-1;}}}}(2)main⽂件的实现#include<graphics.h>#include<stdlib.h>#include<iostream>#include<Windows.h>#include<MMSystem.h>#include<conio.h>#pragma comment(lib,"winmm.lib")#include "box.h"using namespace std;int main(void){//申请⼀个句柄IMAGE bg_img;IMAGE bg_img1;IMAGE bg_img2;//窗⼝初始化initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//游戏开始背景背景图loadimage(&bg_img2,_T("blachground.jpg"),732,549,true);GameStarSCREEN(&bg_img2);Sleep(1000);//加载游戏未在规定规则内完成的背景loadimage(&bg_img1,_T("blackground.jpg"),732,549,true);//加载游戏在规定规则内完成的背景图loadimage(&bg_img,_T("blackground.jpg"),732,549,true);//加载背景⾳乐mciSendString(_T("play 南⽅.mp3 repeat"), 0, 0, 0);//加载地图元素loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}bool quit=false;do{if(_kbhit()){char ch=_getch();cnt++;Record_Steps();if(ch==KEY_UP){gameControal(UP);}else if(ch==KEY_DOWN){gameControal(DOWN);}else if(ch==KEY_LEFT){gameControal(LEFT);}else if(ch==KEY_RIGHT){gameControal(RIGHT);}else if(ch==KEY_QUIT){quit=true;GameOverSCREEN(&bg_img);}if(isGameOver()){quit=true;GameOverSCREEN(&bg_img);}if(cnt>LEN){quit=true;FalseGameOverSCREEN(&bg_img1);}}Sleep(100);}while(quit==false);system("pause");//游戏结束释放资源closegraph();return 0;}5、这是本⼈对推箱⼦游戏的见解如果有什么错误请指正以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
推箱子的c语言代码推箱子(Sokoban)是一种经典的益智游戏,也是计算机程序设计中常用的案例之一。
在这个游戏中,玩家需要移动箱子,将它们推到指定位置上,以完成关卡的目标。
在C语言中,我们可以使用二维数组来表示游戏的地图,其中不同的字符代表不同的元素。
例如,可以使用'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
玩家可以通过控制输入来移动,将箱子推到目标位置上。
为了实现这个游戏,我们可以先定义一个二维数组来表示地图,然后通过循环读取用户的输入,根据输入来移动玩家和箱子,最后判断是否完成了关卡的目标。
我们需要定义一个二维数组来表示地图。
假设地图的大小是10x10,我们可以这样定义:```c#define MAP_SIZE 10char map[MAP_SIZE][MAP_SIZE] = {"##########","# #","# $ #","# @ #","# #","# #","# #","# #","# #","##########"};```其中,'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
空格表示可通行的空地。
接下来,我们可以定义一个函数来打印地图,以便在每一次移动后显示最新的状态:```cvoid printMap() {for (int i = 0; i < MAP_SIZE; i++) {printf("%s\n", map[i]);}}```然后,我们可以定义一个循环,接收用户的输入,并根据输入来移动玩家和箱子。
推箱子c语言程序设计1.引言1.1 概述概述推箱子游戏作为一款经典的益智游戏,具有很高的趣味性和挑战性,受到了广大玩家的喜爱。
本文旨在介绍通过C语言程序设计实现推箱子游戏的过程。
本文将从游戏的背景介绍、基本规则和玩法等方面展开叙述。
推箱子游戏的背景是一个仓库,玩家需要控制一个工人将货物推到指定的放置点。
游戏地图由一系列的方块组成,每个方块可能是墙壁、货物、放置点、工人或者空地。
玩家通过移动工人将货物推动到目标位置,最终完成整个地图的挑战。
C语言作为一种基础的编程语言,广泛应用于各种程序设计中。
通过使用C语言来编写推箱子游戏的程序,我们可以深入理解游戏的基本逻辑和算法,并将其应用于其他类似的益智游戏中。
本文将首先介绍推箱子游戏的基本规则和玩法,包括工人的移动、货物的推动以及地图的布局等方面。
之后,我们将详细讲解如何使用C语言来实现推箱子游戏的各个功能,包括游戏的初始化、地图的生成、玩家操作的响应等。
通过本文的学习,读者可以掌握使用C语言来进行程序设计的基本技巧和方法,同时也能够熟悉并理解推箱子游戏的内部实现原理。
希望本文对读者有所帮助,能够引发对程序设计和游戏开发的兴趣,同时也能够为读者在后续的学习和实践中提供一定的参考价值。
1.2 文章结构文章结构部分的内容:文章的结构是为了使读者能够更好地理解和掌握推箱子游戏的C语言程序设计。
通过以下几个方面来介绍文章的结构:1. 简介:在本部分中,将对推箱子游戏的背景和意义进行简要介绍。
推箱子作为一种逻辑思维和策略性很强的游戏,对于培养思维能力和解决问题的能力有着重要意义。
因此,本文将介绍推箱子游戏的特点和玩法,以及C语言程序设计对于实现推箱子游戏的重要作用。
2. 目标:本部分将明确阐述本文的目标。
主要包括两个方面:一是介绍如何使用C语言进行推箱子游戏的程序设计;二是帮助读者理解和掌握C语言程序设计的基本原理和方法,为自己编写其他游戏程序打下基础。
3. 主体内容:本文的主要内容包括两个方面。
C语⾔实现推箱⼦游戏完整代码C语⾔实现推箱⼦游戏完整代码,供⼤家参考,具体内容如下前⾔⾃⼰做的,可能有些代码不够⼯整,或者有些⼩问题,但游戏的基本操作是可以实现的代码效果代码⼀共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,⼀个作图。
⼿动设置地图⽤'0'表⽰空格,“1”表⽰墙,“2”表⽰箱⼦,“3”表⽰⼈,“4”表⽰终点这样可以提⾼代码的移植性如需改为⼿动输⼊地图可以直接定义⼀个⼆维数组,在给他赋值就可以了int screen[9][11]={{0,1,1,1,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0,0,1,0},{0,1,0,2,2,2,2,2,0,1,0},{0,1,0,2,0,2,0,2,0,1,1},{0,1,0,0,0,3,0,0,2,0,1},{1,1,0,1,1,1,1,0,2,0,1},{1,0,4,4,4,4,4,1,0,0,1},{1,0,4,4,4,4,4,0,0,1,1},{1,1,1,1,1,1,1,1,1,1,0}};//定义为全局变量(地图) i表⽰⾏,j表⽰列计算地图中终点的个数这⼀步主要是为了后⾯判断游戏输赢的int cum(){int i,j,k=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(screen[i][j]==2){k++;}}}//遍历整个⼆维数组return k;}//计算地图中有多少个终点打印地图函数通过switch函数对⼆维数组中的值进⾏可视化,也就是画出地图注意:这⾥还定义出了6和7,是通过重叠的关系来算的,就是箱⼦在终点上,这个位置⼜有箱⼦⼜有终点2个标识,所以让两个的数值加起来,⽅便理解,也⽅便后⾯的计算void print(){int i,j;printf("请⽤wsad代表上下左右来进⾏游戏\n");for(i=0;i<9;i++){for(j=0;j<11;j++){switch(screen[i][j]){case 0:printf(" ");//空break;case 1:printf("■");//墙break;case 2:printf("★");//箱⼦break;case 3:printf("♀");//⼈break;case 4:printf("○");//终点break;case 6:printf("★");break;//箱⼦和终点case 7://⼈和终点显⽰⼈printf("♀");break;}}printf("\n");}}判断游戏输赢这⾥我写了2个函数,⼀个判断赢,⼀个判断输,并返回值,然后在主函数的最后⾯通过判断返回值来确定游戏的输赢判断赢int win(){int i,j,k=0;int t=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(screen[i][j]==6){k++;}}}//遍历整个⼆维数组,计算箱⼦在终点上的个数if(k==cum()){t=1;}//如果个数等于前⾯计算出的终点个数,则说明所有终点都放了箱⼦,说明游戏胜利return t;} //判断赢判断输int lose(){int i,j;int k=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(i>0 && j>0 ){if(screen[i][j] == 2 || screen[i][j] == 6){if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6))|| ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6))|| ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6))|| ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){k++;}}}}/*这⾥也是遍历了整个数组,判断所有的箱⼦四个⽅向的情况,如果有三个⽅向被堵住了说明箱⼦⽆法移动了,也表明这个箱⼦失效了,⽤k来记录失效的个数,当全部失效时游戏失败(这是游戏的玩法,其实有⼀个被堵住就已经不可能胜利了)*/}if(k==cum()){k=1;return k;//返回1说明游戏失败}接下来是最重要的四个控制函数向上移动通过数字的变化来控制⼆维数组的变化,进⽽控制地图的更新这⾥⾮常重要的就是要理解:加1,加2,加3减3都是什么意思加1:箱⼦的值是2,⼈的值是3,所以箱⼦的位置变成⼈需要加1来实现加2:空地的值是0,箱⼦的值是2,箱⼦和终点在⼀起的值是6,所以在推箱⼦的时候,前⽅的空格或者终点放上箱⼦后数值会加2加3减3:⼈的值是3,⼈要动的话,它原先在的格⼦就会因为⼈⾛了导致数值减3,⾛到的那个格⼦就会因为站了⼈⽽加3如果这个理解的话,代码就⾮常简单了void movew(){if(x>0){if(screen[x-1][y]==1){return ;/*如果箱⼦的上⾯是墙,则地图不会发⽣变化,因为推不动嘛*/}else if(screen[x-1][y]==0){screen[x-1][y]+=3;screen[x][y]-=3;x--;/*如果前⾯是空地,则需要向前移动⼀格,也就是原先⼈的位置变成空地,前⽅的空地变成⼈,空地(0)变成⼈(3)需要加3,⼈变成空地需要减3*/}else if(screen[x-1][y]==4){screen[x-1][y]+=3;screen[x][y]-=3;x--;}//⼀样的else if(screen[x-1][y]==2||screen[x-1][y]==6){if(screen[x-2][y]==0){screen[x-2][y]+=2;//箱⼦前⾯的格变成箱⼦(2)screen[x-1][y]+=1;//箱⼦的位置变成⼈(3)screen[x][y]-=3;/*如果前⾯是空地,则需要向前移动⼀格,也就是原先是箱⼦的格⼦变成⼈,⼈的位置变成空地,原先的空地变成箱⼦,箱⼦(2)变成⼈(3)需要减3,空地变成⼈*/x--;}else if(screen[x-2][y]==1){return ;}else if(screen[x-2][y]==2){return;//如果箱⼦的前⾯是墙或者其他的箱⼦,则箱⼦推不动}else if(screen[x-2][y]==4){screen[x-2][y]+=2;screen[x-1][y]+=1;screen[x][y]-=3;x--;}//这个情况别漏了}}}其他三个⽅向的代码思路和这个是⼀样的向下移动void moves(){if(x<9){if(screen[x+1][y]==1){return ;}else if(screen[x+1][y]==0){screen[x+1][y]+=3;screen[x][y]-=3;x++;}else if(screen[x+1][y]==4){screen [x+1][y]+=3;screen[x][y]-=3;}else if(screen[x+1][y]==2||screen[x+1][y]==6){ if(screen[x+2][y]==1){return;}else if(screen[x+2][y]==0){screen[x+2][y]+=2;screen[x+1][y]+=1;screen[x][y]-=3;x++;}else if(screen[x+2][y]==2){return ;}else if(screen[x+2][y]==4){screen[x+2][y]+=2;screen[x+1][y]+=1;screen[x][y]-=3;x++;}}}}向左移动void movea(){if(y>0){if(screen[x][y-1]==1){return;}else if(screen[x][y-1]==4){screen[x][y-1]+=3;screen[x][y]-=3;y--;}else if(screen[x][y-1]==0){screen[x][y-1]+=3;screen[x][y]-=3;y--;}else if(screen[x][y-1]==2||screen[x][y-1]==6){ if(screen[x][y-2]==0){screen[x][y-2]+=2;screen[x][y-1]+=1;screen[x][y]-=3;y--;}else if(screen[x][y-2]==1){return;}else if(screen[x][y-2]==2){return;}else if(screen[x][y-2]=4){screen[x][y-2]+=2;screen[x][y-1]+=1;screen[x][y]-=3;y--;}}}}向右移动void moved(){if(y<9){if(screen[x][y+1]==1){return;}else if(screen[x][y+1]==4){screen[x][y+1]+=3;screen[x][y]-=3;y++;}else if(screen[x][y+1]==0){screen[x][y+1]+=3;screen[x][y]-=3;y++;}elseif(screen[x][y+1]==2||screen[x][y+1]==6){if(screen[x][y+2]==0){screen[x][y+2]+=2;screen[x][y+1]+=1;screen[x][y]-=3;y++;}else if(screen[x][y+2]==4){screen[x][y+2]+=2;screen[x][y+1]+=1;screen[x][y]-=3;y++;}else if(screen[x][y+2]==2){return;}else if(screen[x][y+2]==1){return;}}}}主函数这个主函数写的有点乱,直接看注释吧int main(){int n,t;int j,k;int b=1;here:system("cls");//printf("开始游戏请按1\n退出游戏请按2\n");scanf("%d",&j);if(j==1){printf("请⽤wsad代表上下左右来进⾏游戏\n");//这个就引导进⼊游戏while(1){system("cls");/*在每⼀次移动过后都清除上⼀个地图,不然就会每⾛⼀步⽣成⼀个图*/print();//先打印地图scanf("%c",&n);//读⼊⽤户的操作switch(n){case 'w':movew();break;case 's':moves();break;case 'a':movea();break;case 'd':moved();break;} //控制⼈移动t=win();if(t==1){goto there;}//每次操作完先判断游戏是否胜利,如果胜利了直接跳到函数最后if(b == lose()){system("cls");print();printf("游戏失败");return 0;} //游戏失败提⽰}}else {system("cls");printf("您确认要退出游戏吗\n确认退出按1\t返回上⼀层按2\n");scanf("%d",&k);if(k==1){printf("你已退出游戏,期待你的再次到来,谢谢");return 0;}else {goto here;}}//这⼀块是最前⾯⽤户进⼊游戏那⾥的,如果⽤户选择退出游戏执⾏的操作 there:printf("恭喜你通过了游戏!");return 0;}//主函数所有的代码就到这⾥了,如果需要完整代码可以留⾔以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
#include <stdio.h>#include <stdlib.h>//用到system()#include <conio.h>//因为需要用到getch()函数//推箱子_C语言版//写了一下午,第一个C语言游戏终于写好了,想想有点小激动....//蔚蓝之链编写//分享给大家参考下(在看得懂的情况下...),代码写得很凌乱.....,勿喷#define X 20#define Y 20#define REN 2 //表示人#define XIANGZI 3 //箱子#define WEIZHI 4 //箱子要推到的位置#define KONG 0 //空位#define QIANG 1 //墙#define RW 6 //人在箱子要推到的位置上#define XW 5 //箱子在箱子要推到的位置上#define bool short#define false 0#define true 1//数组内部数值表示内容:0表示空位,1表示墙体,2表示人,3表示箱子,4表示箱子要推到的位置,5表示既有箱子又有又位置,6表示既有位置又有人//01,2,3,4符号表示://0 :" " 1:■2:♀3:回4:◎void create_map_arr(int _x,int _y,int (*map_arr)[Y]);//创建地图数组void creata_map(int _x,int _y, int (*map)[Y]);//创建地图,重绘游戏画面void amend_map(int _x,int _y,char key , int (* arr_map)[Y]);//接收输入,修改游戏画面bool is_finish(int _x, int _y,int _total ,int (*arr_map)[Y]);//判断是否完成推箱子(地图x,地图y,总箱子数,地图数组)int main(void){int map_arr[X][Y];//存储地图的二维数组create_map_arr(X,Y,map_arr);//创建数组printf("C语言_推箱子v1.0 蔚蓝之链编写\n\n");printf("控制键:W↑,A←,S↓,D→\n");printf("提示:玩本游戏前请先关闭输入法\n");system("pause");system("cls");while(1){creata_map(X,Y,map_arr);//创建地图,重绘游戏画面if(is_finish(X,Y,2,map_arr) == true){printf("恭喜哦,推箱子完成!\n");system("pause");return 0;}amend_map(X,Y,getch(),map_arr);//接收输入,修改画面system("cls");//清空画面}getchar();return 0;}void create_map_arr (int _x,int _y,int (*map_arr)[Y])//创建地图数组{int x,y;for(x=0;x<_x;x++){for (y=0;y<_y;y++){if(y==0 || x==0 || x==_x-1 || y==_y-1){*(*(map_arr+x)+y) = QIANG;//printf ("■");}else{*(*(map_arr+x)+y) = KONG;//printf (" ");}}//printf("\n");}//这里可以修改箱子创建的位置,人创建的位置及箱子要达到的位置,默认两个箱子*(*(map_arr+3)+7)=REN;//人*(*(map_arr+5)+6)=XIANGZI;//箱子*(*(map_arr+5)+7)=XIANGZI;//箱子*(*(map_arr+1)+8)=WEIZHI;//箱子要推到的位置*(*(map_arr+2)+8)=WEIZHI;//箱子要推到的位置}void creata_map(int _x,int _y, int (*map)[Y])//创建地图(地图数组[][]){int x,y;for(x = 0; x < _x; x++){for (y = 0; y < _y; y++){if (*(*(map + x) + y) == QIANG){printf ("■");}else if(*(*(map + x) + y) == KONG){printf (" ");}else if(*(*(map + x) + y)==REN || *(*(map + x) + y)==RW){printf ("♀");}else if (* (*(map + x) + y)==XIANGZI){printf("□");}else if (*(*(map + x) + y)==WEIZHI){printf("◎");}else if(*(*(map + x) + y) == XW){printf("回");}}printf ("\n");}}//这个函数写的太乱了,自己看着也头大,不过还好,总算完成了^_^void amend_map(int _x,int _y,char key , int (* arr_map)[Y])//移动(地图x,地图y,按键值,地图数组){int x,y;for(x = 0; x < _x; x++){for (y = 0; y < _y; y++){if(*( * (arr_map + x ) + y) == REN || *( * (arr_map + x ) + y) == RW){if(key == 'a' || key == 'A')//←{if (y > 0){if(*(*(arr_map + x) +(y)) == RW)//人在最终位置{if(*( * (arr_map + x ) + (y-1)) == WEIZHI)//人左边还是最终位置{*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + y) = WEIZHI;}else if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + x) + (y - 1)) == KONG){*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + x ) + (y-1)) == WEIZHI)//人左边是最终位置{*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + x) + (y - 1)) == KONG){*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + x ) + (y-1)) == XW || *( * (arr_map + x ) + (y-1)) == XIANGZI)//人左边有箱子或箱子在最终位置{if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + x) + (y-1)) == WEIZHI){*(*(arr_map + x) + (y-1)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + x) + (y-1)) == KONG){*(*(arr_map + x) + (y-1)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//←else if(key == 'd' || key == 'D')//→{if (y < _y){if(*(*(arr_map + x) +(y)) == RW)//人在最终位置{if(*( * (arr_map + x ) + (y+1)) == WEIZHI)//人右边还是最终位置{*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + y) = WEIZHI;}else if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + x) + (y + 1)) == KONG){*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + x ) + (y+1)) == WEIZHI)//人右边是最终位置{*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + x) + (y + 1)) == KONG){*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + x ) + (y+1)) == XW || *( * (arr_map + x ) + (y+1)) == XIANGZI)//人右边有箱子或箱子在最终位置{if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + x) + (y+1)) == WEIZHI){*(*(arr_map + x) + (y+1)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + x) + (y+1)) == KONG){*(*(arr_map + x) + (y+1)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//→else if(key == 'w' || key == 'W')//↑{if (x-1 > 0){if(*(*(arr_map + (x)) +(y)) == RW)//人在最终位置{if(*( * (arr_map + (x-1) ) + (y)) == WEIZHI)//人上边还是最终位置{*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + (x) ) + y) = WEIZHI;}else if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW){if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + (x) ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + (x-1) ) + (y)) == WEIZHI)//人上边是最终位置{*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW)//人上边是箱子或在最终位置的箱子{if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + (x-1) ) + (y)) == XW || *( * (arr_map + (x-1) ) + (y)) == XIANGZI)//人上边有箱子或箱子在最终位置{if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW){if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + (x-1)) + (y)) == WEIZHI){*(*(arr_map + (x-1)) + (y)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*(*(arr_map + (x-1)) + (y)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//↑else if(key == 's' || key == 'S')//↓{if (x < _x+1 > 0){if(*(*(arr_map + (x)) +(y)) == RW)//人在最终位置{if(*( * (arr_map + (x+1) ) + (y)) == WEIZHI)//人下边还是最终位置{*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + (x) ) + y) = WEIZHI;}else if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + (x) ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + (x+1) ) + (y)) == WEIZHI)//人下边是最终位置{*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + (x+1) ) + (y)) == XW || *( * (arr_map + (x+1) ) + (y)) == XIANGZI)//人下边有箱子或箱子在最终位置{if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + (x+1)) + (y)) == WEIZHI){*(*(arr_map + (x+1)) + (y)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*(*(arr_map + (x+1)) + (y)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//↓return;}}}}bool is_finish(int _x, int _y,int _total ,int (*arr_map)[Y])//判断是否完成推箱子(地图x,地图y,总箱子数,地图数组){int x,y,temp = 0;for (x = 0; x < _x; x++){for (y = 0; y < _y; y++){if (*(*(arr_map+x)+y) == XW){temp++;}}}if (_total == temp){return true;}return false;}。
C语⾔代码实现推箱⼦⼩游戏本⽂实例为⼤家分享了C语⾔实现推箱⼦⼩游戏的具体代码,供⼤家参考,具体内容如下本次游戏是个推箱⼦第⼀关最简单的⼩游戏有详细注释,下⾯是做出来的游戏界⾯游戏操作说明和功能说明:1、按wasd控制⼩⼈的上下左右移动。
2、按 r 重新开始游戏3、游戏开始有操作介绍4、游戏结束有胜利提⽰游戏原理分析1、游戏开始时的星星个数 = 箱⼦在星星上的个数时,游戏胜利。
2、按 r 键重新开始游戏,我们需要定义⼀个量 map_1[8][8] 来保存游戏初始时的界⾯,操作时我们将其赋值给 map[8][8] 来进⾏操作,以便重新归位,这⾥就⽤到了memcpy()函数。
3、wasd 代表上下左右操作⼈物移动,分别需要为其定义⼀个函数。
4、判断⼈物移动之前我们需要定位到⼈物的位置,这⾥我们⽤find()函数来定义。
⾸先从头⽂件开始介绍:#include<stdio.h>#include<stdlib.h> //malloc()函数#include<string.h> //memcpy()函数#include<conio.h> //getch()函数函数名称:malloc函数原型: void * malloc(unsigned size);函数功能: 分配size字节的存储区函数返回: 所分配的内存区地址,如果内存不够,返回0函数函数:memcpy函数原型:void *memcpy(void *dest, const void *src, size_t n);函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到⽬标dest所指的内存地址的起始位置中函数返回:函数返回指向dest的指针。
函数名称:getch函数原型: int getch(void);函数功能: 从控制台读取⼀个字符,但不显⽰在屏幕上函数返回: 读取的字符上图是简单的8*8的图,我们定义⼀个⼆维数组来保存整张图,⽤0,1,2,3,4 来代表游戏界⾯中的每个符号。
源程序:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <dos.h>#define SIZE 20#define KEY_UP 0x4800#define KEY_DOWN 0x5000#define KEY_LEFT 0x4b00#define KEY_RIGHT 0x4d00#define KEY_ESC 0x011b#define Re 0x1372int Step=0,right_Step,top_Step;void cheshi(int a[][6],int n,int m) {int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++)printf("%d ",a[i][j]);printf("\n");}}void Coloring(int x,int y,int subscript) {switch(subscript){case 0:{setfillstyle(1,DARKGRAY);break;}case 1:{setfillstyle(6,YELLOW);break;}case 2:{setfillstyle(8,DARKGRAY);break;}case 3:{setfillstyle(1,CYAN);break;}case 4:{setfillstyle(1,RED);break;}case 5:{setfillstyle(1,CYAN);break;}case 6:{setfillstyle(1,RED);break;}}bar(x,y,x+SIZE,y+SIZE);}void display(int guan[][6],int imax,int jmax){int gdriver = DETECT, gmode, errorcode;int left, top, right, bottom,x,y;int i,j;initgraph(&gdriver, &gmode, "");errorcode = graphresult();if (errorcode != grOk){printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:");getch();exit(1);}left=getmaxx()/2-jmax*SIZE+jmax*2+2;top=getmaxy()/2-((imax/2*SIZE)+(imax/2+4));right=left+jmax*SIZE+jmax*2+2;bottom=getmaxy()/2+(((imax-imax/2)*SIZE)+((imax-imax/2)+4));right_Step=right;top_Step=top;rectangle(left,top,right,bottom);for(i=0;i<imax;i++){for(j=0;j<jmax;j++){x=left+(j+1)*2+j*SIZE;y=top+(i+1)*2+i*SIZE;Coloring(x,y,guan[i][j]);}}setcolor(YELLOW);outtextxy(left,top-20,"UserYuH:BOX");setcolor(WHITE);outtextxy(right+10,top,"Guan:");outtextxy(right+10,top+20,"Step:");rectangle(left,bottom+4,left+82,bottom+20);settextjustify(LEFT_TEXT,TOP_TEXT);outtextxy(left+4,bottom+8,"R:refresh");rectangle(left+86,bottom+4,left+162,bottom+20);settextjustify(LEFT_TEXT,TOP_TEXT);outtextxy(left+92,bottom+8,"Esc:exit");}void CopyGuan(int guan[][6],int guan_all[][6],int imax,int jmax){int i,j;for(i=0;i<imax;i++)for(j=0;j<jmax;j++)guan[i][j]=guan_all[i][j];}void select_guan(int guan_all[][6],int guan[][6],int subi_j[],int ijmax[],int guan_num,int *fulfil) {int i,j;switch(guan_num){case 1:{*fulfil=2;subi_j[0]=2,subi_j[1]=0;ijmax[0]=6,ijmax[1]=4;CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);break;}case 2:{*fulfil=2;subi_j[0]=2,subi_j[1]=0;ijmax[0]=5,ijmax[1]=5;CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);break;}case 3:{*fulfil=1;subi_j[0]=3,subi_j[1]=3;ijmax[0]=6,ijmax[1]=6;break;}case 4:{*fulfil=0;subi_j[0]=1,subi_j[1]=1;ijmax[0]=6,ijmax[1]=6;break;}case 5:{*fulfil=0;subi_j[0]=4,subi_j[1]=2;ijmax[0]=5,ijmax[1]=6;break;}case 6:{*fulfil=1;subi_j[0]=0,subi_j[1]=4;ijmax[0]=6,ijmax[1]=5;break;}case 7:{*fulfil=0;subi_j[0]=2,subi_j[1]=4;ijmax[0]=6,ijmax[1]=5;break;}case 8:{*fulfil=0;subi_j[0]=0,subi_j[1]=4;ijmax[0]=6,ijmax[1]=6;break;}case 9:{*fulfil=0;subi_j[0]=3,subi_j[1]=1;ijmax[0]=4,ijmax[1]=6;break;}case 10:{*fulfil=1;subi_j[0]=3,subi_j[1]=3;ijmax[0]=6,ijmax[1]=5;break;}case 11:{*fulfil=1;subi_j[0]=4,subi_j[1]=1;ijmax[0]=6,ijmax[1]=5;break;}case 12:{*fulfil=0;subi_j[0]=0,subi_j[1]=2;ijmax[0]=5,ijmax[1]=6;break;case 13:{*fulfil=1;subi_j[0]=2,subi_j[1]=3;ijmax[0]=6,ijmax[1]=5;break;}case 14:{*fulfil=0;subi_j[0]=3,subi_j[1]=0;ijmax[0]=5,ijmax[1]=6;break;}case 15:{*fulfil=1;subi_j[0]=0,subi_j[1]=3;ijmax[0]=6,ijmax[1]=6;break;}case 16:{*fulfil=0;subi_j[0]=0,subi_j[1]=3;ijmax[0]=5,ijmax[1]=5;break;}case 17:{*fulfil=0;subi_j[0]=3,subi_j[1]=5;ijmax[0]=4,ijmax[1]=6;break;}case 18:{*fulfil=1;subi_j[0]=0,subi_j[1]=1;ijmax[0]=6,ijmax[1]=6;break;}case 19:*fulfil=0;subi_j[0]=5,subi_j[1]=4;ijmax[0]=6,ijmax[1]=6;break;}case 20:{*fulfil=2;subi_j[0]=1,subi_j[1]=4;ijmax[0]=5,ijmax[1]=6;break;}}CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);}void Eixt(){exit(0);}void Move(int point,int guan[][6],int subi_j[],int imax,int jmax,int *fulfil) {int i,j,*ir,*jr,left,top;left=getmaxx()/2-jmax*SIZE+jmax*2+2;top=getmaxy()/2-((imax/2*SIZE)+(imax/2+4));ir=&subi_j[0],jr=&subi_j[1];i=*ir,j=*jr;switch(point){case 1:{if(i>0)i--;else break;if(guan[i][j]==0){if(guan[*ir][j]==6){guan[i][j]=4;guan[*ir][j]=2;}{guan[*ir][j]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]);*ir=i;Step++;}else if(guan[i][j]==3){if(i>0 && (guan[i-1][j]==0||guan[i-1][j]==2)){if(guan[i-1][j]==0)guan[i-1][j]=3;else{guan[i-1][j]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+(j+1)*2+j*SIZE,top+((i-1)+1)*2+(i-1)*SIZE,guan[i-1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(i>0 && (guan[i-1][j]==0||guan[i-1][j]==2)){if(guan[i-1][j]==0)guan[i-1][j]=3;else{guan[i-1][j]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+((i-1)+1)*2+(i-1)*SIZE,guan[i-1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}else if(guan[i][j]==2){guan[i][j]=6;if(guan[*ir][j]==4)guan[*ir][j]=0;elseguan[*ir][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]); *ir=i;Step++;}break;}case 2:{if(i<imax-1)i++;else break;if(guan[i][j]==0){if(guan[*ir][j]==6){guan[i][j]=4;guan[*ir][j]=2;}else{guan[*ir][j]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]); *ir=i;Step++;}else if(guan[i][j]==3){if(i<imax-1 && (guan[i+1][j]==0||guan[i+1][j]==2)){if(guan[i+1][j]==0)guan[i+1][j]=3;else{guan[i+1][j]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+(j+1)*2+j*SIZE,top+((i+1)+1)*2+(i+1)*SIZE,guan[i+1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(i<imax-1 && (guan[i+1][j]==0||guan[i+1][j]==2)){if(guan[i+1][j]==0)guan[i+1][j]=3;else{guan[i+1][j]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+((i+1)+1)*2+(i+1)*SIZE,guan[i+1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[*ir][j]=4)guan[*ir][j]=0;elseguan[*ir][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]);*ir=i;Step++;}break;}case 3:{if(j>0)j--;else break;if(guan[i][j]==0){if(guan[i][*jr]==6){guan[i][j]=4;guan[i][*jr]=2;}else{guan[i][*jr]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}else if(guan[i][j]==3){if(j>0 && (guan[i][j-1]==0||guan[i][j-1]==2)){if(guan[i][j-1]==0)guan[i][j-1]=3;else{guan[i][j-1]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+((j-1)+1)*2+(j-1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j-1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(j>0 && (guan[i][j-1]==0||guan[i][j-1]==2)){if(guan[i][j-1]==0)guan[i][j-1]=3;else{guan[i][j-1]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+((j-1)+1)*2+(j-1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j-1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[i][*jr]==4)guan[i][*jr]=0;elseguan[i][*jr]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}break;}case 4:{if(j<jmax-1)j++;else break;if(guan[i][j]==0){if(guan[i][*jr]==6){guan[i][j]=4;guan[i][*jr]=2;}else{guan[i][*jr]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}else if(guan[i][j]==3){if(j<jmax-1 && (guan[i][j+1]==0||guan[i][j+1]==2)){if(guan[i][j+1]==0)guan[i][j+1]=3;else{guan[i][j+1]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+((j+1)+1)*2+(j+1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j+1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(j<jmax-1 && (guan[i][j+1]==0||guan[i][j+1]==2)){if(guan[i][j+1]==0)guan[i][j+1]=3;else{guan[i][j+1]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+((j+1)+1)*2+(j+1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j+1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[i][*jr]==4)guan[i][*jr]=0;elseguan[i][*jr]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}break;}}}void YouWin(void){setcolor(RED);rectangle(getmaxx()/2-50,getmaxy()/2-20,getmaxx()/2+50,getmaxy()/2+15); settextjustify(LEFT_TEXT,TOP_TEXT);setcolor(WHITE);outtextxy(getmaxx()/2-46,getmaxy()/2-16,"YOU WIN!");outtextxy(getmaxx()/2-46,getmaxy()/2,"Next:Enter");getch();clrscr();}int main(void){int guan[6][6],subi_j[2],ijmax[2],guan_num=1,key,fulfil=0,point;char s[10];int guan_all[20][6][6]={0,0,2,0,0,0,0,1,0,5,0,0,4,0,3,0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,5,0,0,0,0,1,0,0,0,4,3,5,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,0,2,0,2,3,1,0,0,3,4,0,0,1,1,1,5,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,4,0,0,3,0,1,3,1,1,2,2,1,0,2,1,0,0,1,3,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,2,1,1,3,0,0,2,2,3,0,0,0,0,1,3,0,0,0,0,4,0,1,1,0,0,0,0,0,0,1,1,1,0,4,0,0,0,5,3,0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,3,0,1,1,0,1,0,2,1,1,0,2,1,1,1,2,0,0,1,0,0,2,0,0,3,3,0,4,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,0,4,1,1,1,1,0,0,0,2,0,1,3,3,0,0,0,0,0,0,1,2,0,0,3,1,1,1,2,0,0,1,1,0,2,2,1,1,1,0,3,0,0,0,0,0,0,1,3,1,0,0,4,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,0,3,0,1,0,0,0,5,3,0,0,0,0,2,1,4,0,0,0,0,0,0,1,0,0,0,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,2,0,1,0,0,0,3,5,3,0,0,1,4,0,1,1,0,1,0,0,1,1,0,1,0,4,0,1,1,1,0,2,0,0,0,2,0,3,2,3,0,1,3,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,3,1,0,1,0,0,2,0,4,1,0,0,5,0,0,0,0,1,0,1,3,0,0,1,2,0,0,1,0,1,0,0,1,1,1,2,2,3,0,0,2,0,1,3,0,3,0,4,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,4,1,1,0,3,1,0,1,1,0,5,0,3,0,0,0,0,0,1,1,0,1,2,0,0,2,0,1,1,0,0,0,1,0,0,0,4,1,0,0,0,1,0,0,0,2,0,0,3,0,0,0,3,3,1,2,0,1,1,0,0,2,0,0,0,0,0,0,0,1,1,2,0,1,1,0,2,0,0,1,1,0,0,0,3,3,0,1,0,2,0,3,4,0,0,0,0,0,0,0,0,0,0,0,0,1,4,2,0,0,1,0,3,3,5,0,1,0,0,1,0,0,1,0,0,1,0,0,2,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,3,2,1,1,0,0,2,0,1,1,0,0,1,2,0,3,0,0,3,0,0,0,0,1,4,0,0,0,0,1,1,1,0,1,0,5,4,1,0,0,5,0,0,0,1,1,3,0,0,0,1,1,0,0,0,2,0,0,0,0,0,0};while(guan_num<=20){loop1:select_guan(guan_all[guan_num-1],guan,subi_j,ijmax,guan_num,&fulfil);display(guan,ijmax[0],ijmax[1]);itoa(guan_num,s,10);setcolor(YELLOW);outtextxy(right_Step+50,top_Step,s);Step=0;while(fulfil!=3){if(bioskey(1))key=bioskey(0);else key=0;if(key)switch(key){case KEY_UP:point=1;break;case KEY_DOWN:point=2;break;case KEY_LEFT:point=3;break;case KEY_RIGHT:point=4;break;case KEY_ESC:Eixt();case Re:clrscr();goto loop1;break;/*default: printf("%x\n",key);*/}if(point){Move(point,guan,subi_j,ijmax[0],ijmax[1],&fulfil);point=0;itoa(Step,s,10);setfillstyle(1,0x0000);bar(right_Step+50,top_Step+20,right_Step+100,top_Step+40); setcolor(YELLOW);outtextxy(right_Step+50,top_Step+20,s);}}if(fulfil==3){YouWin();guan_num++;}}getch();closegraph();return 0;}。
CC++实现推箱⼦⼩游戏本⽂实例为⼤家分享了C/C++实现推箱⼦⼩游戏的具体代码,供⼤家参考,具体内容如下效果演⽰实现功能如上图所⽰。
按键控制⼩猪的运动,推箱⼦到达⽬的地。
如何实现1.⾸先思考要保存箱⼦,⼩猪等信息,添加多个map可以⽤到三维数组。
2.定义⼩猪,箱⼦,墙,空地等信息在三维数组⾥的数值。
空地 0墙 1⽬的地 2箱⼦ 3猪 4 2+4=6 猪到达⽬的地也显⽰猪箱⼦到达⽬的地 2+3=53.按键实现推箱⼦运动。
考虑多种情况:①.⼩猪的运动(空地,⽬的在)②.⼩猪推箱⼦运动(空地,⽬的地)⽤三维数组保存map信息:这⾥我只做了两种图,可⾃⾏添加int backgrand[MAP][ROW][COL] =//map图{{1, 1, 1, 1, 1, 1, 1, 1,1, 0, 0, 0, 2, 0, 0, 1,1, 1, 0, 0, 3, 1, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 3, 3, 2, 1,1, 1, 0, 3, 2, 0, 0, 1,1, 0, 0, 2, 0, 0, 1, 1,1, 1, 1, 1, 1, 1, 1, 1},{0, 1, 1, 1, 1, 1, 1, 1,1, 1, 0, 2, 0, 0, 0, 1,1, 1, 0, 0, 3, 0, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 0, 0, 1, 1,1, 1, 0, 3, 2, 3, 0, 1,1, 0, 0, 0, 0, 2, 0, 1,1, 1, 1, 1, 1, 1, 1, 1},};绘图⽤到了easyx库,加载图⽚和绘制窗⼝只⽤到了三条语句:很简单initgraph();//绘制窗⼝⼤⼩loadimage();//加载图⽚putinmage();//放出图⽚具体可看代码!代码块#include<stdio.h>#include<Windows.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<graphics.h>#define ROW 8#define COL 8#define MAP 2//map个可以⾃⼰添加数int count = 0;//哪个map图/*空地 0墙 1⽬的地 2箱⼦ 3猪 4 2+4=6 猪到达⽬的地也显⽰猪箱⼦到达⽬的地 2+3=5*/IMAGE image1, image2, image3, image4, image5, image6;int backgrand[MAP][ROW][COL] =//map图{{1, 1, 1, 1, 1, 1, 1, 1,1, 0, 0, 0, 2, 0, 0, 1,1, 1, 0, 0, 3, 1, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 3, 3, 2, 1,1, 1, 0, 3, 2, 0, 0, 1,1, 0, 0, 2, 0, 0, 1, 1,1, 1, 1, 1, 1, 1, 1, 1},{0, 1, 1, 1, 1, 1, 1, 1,1, 1, 0, 2, 0, 0, 0, 1,1, 1, 0, 0, 3, 0, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 0, 0, 1, 1,1, 1, 0, 3, 2, 3, 0, 1,1, 0, 0, 0, 0, 2, 0, 1,1, 1, 1, 1, 1, 1, 1, 1},};int Judge(){//p判断是否结束⼀局int i = 0;for (i = 0; i < ROW; i++){int j = 0;for (j = 0; j < COL; j++){if (backgrand[count][i][j] == 3 || backgrand[count][i][j] == 2){//判断是否还有箱⼦或者⽬的地 return 0;}}}return 1;}void Backgrand(){//绘制地图int i = 0;for (; i < ROW; i++){int j = 0;for (; j < COL; j++){int x = 80 * j;//横轴是y(列),数轴是x(⾏)。
设为首页收藏本站快捷导航论坛视频教程c/c++PHP 问答平台编程文章个人空间搜索QQ 群热搜:c 语言java 编程教程自学去学论坛编程语言C/C++c 语言编写小游戏系列教程之推动箱子返回列表电梯直达楼主admin 在线 |每日签到 |我的 |设置 |消息 |提醒(2) |门户管理 |管理中心 |退出积分: 9681 |用户组: 管理员请输入搜索内容帖子索删除主题|升降|置顶|直播|高亮|精华|图章|图标|关闭|移动|分类|复制|合并|分割|修复|警告|屏蔽|标签|生成文章查看: 519|回复: 1[精品文章] c语言编写小游戏系列教程之推动箱子 [复制链接]admin 790主题3975帖子9681积分管理员 发表于 201514 18:47:19 | 只看该作者 上节课:/thread1544811.html上节课中 我们已经实现了人物的移动,大家的可以发现,人物可以移动,但是却不能推动箱子,还能穿过障碍物和箱子。
这节课,我们的人物,就是解决这两个问题,推动箱子,还有障碍物检测。
在这之前不得不先说一个问题,随着程序代码越来越多,我们一个文件中代码已经很长了,这样不利于代码的阅读和维护,所以这节课我们决定将代码 按照功能来分成不同的文件,类似模块化编程,每个功能就是一个模块。
如何把代码放到多个文件呢?把代码的申明部分放到,头文件中,实现部分 放到源文件中。
消息新听众(3)坛友互动(1)我的帖子(1)积分9681IP 编辑禁止帖子清理比如,关于箱子操作的函数以及箱子的结构体定义,我们就放在 box.h 中 函数的具体功能实现就放在 box.c 中。
人物操作 就放在 person.h 和 person.c 中。
其他的也是 类似。
头文件如何写?我们看看例子,下面是 box.h 的所有内容01. #ifndef _BOX_H_02. #define _BOX_H_03.04. #include <config.h>05.06. //定义箱子结构体07. typedef struct{08. int x;09. int y;10. char flag;11. int state;12. } box_t;13.14. //设置箱子位置15. void set_box(box_t*, int x, int y);16. //移动箱子,返回0表示成功移动,返回非0表示不能移动17. int move_box(box_t*, dir_t);18. //根据地图坐标获取指定box19. box_t* get_box(int x, int y);20.21. #endif复制代码#ifndef _BOX_H_#define _BOX_H_.............#endif这段代码,作用是防止头文件被重复的包含,重复包含,这些函数就会被重复的申明,编译器将报错。
C语言实现推箱子Visualc++6.0#include#include#include#include#include#include#include#define qiang 1#define ren 2#define xiang 3#define jia 6#define men 8#define oxiang 9int v[13][17]={0};int fuben[13][17];int num_guan; //现在的关数int num_xiang; //箱子的个数int move_num=0; //人行走的次数int push_num=0; //人推箱子的次数int M[2]; //M[0] 是人所在位置的横坐标M[1]是人所在位置的纵坐标int door[2]; //门所在的坐标int tem=0;int cc;void play();void chushi2();void chushihua_guan1();void chushihua_guan2();void chushihua_guan3();void chushihua_guan4();void chushihua_guan5();void chushihua_guan6();void chushihua_guan7();void chushihua_guan8();void chushihua_guan9();void chushihua_guan10();void chushihua_guan11();void chushihua_guan12();void chushihua_guan13();void chushihua_guan14();void dayin();int control();int wancheng();/**********************************************************主方法******************************************************************* ******/int main(){void jiemian();void shuoming();void xuanguan();void chushi(int nn);void chushi1();int i;char c;chushi1();for(i=0;i<=999;i++){ jiemian();c=getche(); if(c=='1') play();else if(c=='2') xuanguan();else if(c=='3') shuoming();else if(c=='4') break;else system("cls");} }/*************************打印游戏主界面******************************/void jiemian(){printf("\n\n\n\n");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY | FOREGROUND_BLUE);printf(" ╭╮ ■ ■ □ □ ◆◆◆◆◆◆◆◆ \n");printf(" ││ ■ ■ □□□□ □□□□ ◆ \n");printf(" ╭─┘└╮ ■ ■■■■ □ ■ □ ■ ◆ ◆ \n");printf(" ╰─┐┌ ■ ■ ■ □ ┏━━━┓ ◆ ◆ \n");printf(" ││ ■ ■■■ □□□□┃┏━┓┃ ◆◆ \n");printf(" ╭─┘└╮ ■ ■ □ ┃┏━┓┃ ┏━━━━◆━━┓\n");printf(" ╰─┐┌╯ ■ ■■■ □□ ┃┏━┓┃ ┗━━━━◆━━┛\n");p rintf(" ╭─┘│ ■ ■ □ □ □┃┗━┛┃ ◆ \n");printf(" ╰──╯ ■■■■■ □ □ □┗━━━┛ ◆◆◆◆◆◆ \n\n");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf(" >>1 开始游戏\n\n");printf(" >>2 选择关卡\n\n");printf(" >>3游戏帮助\n\n");printf(" >>4 退出游戏\n\n");}void chushi1(){int i,j;for(i=0;i<=12;i++)for (j=0;j<=16;j++)fuben[i][j]=0;}void chushi2(){int i,j;move_num=0;push_num=0;for(i=0;i<=12;i++)for(j=0;j<=16;j++) {v[i][j]=0;fuben[i][j]=0;}}/*************************游戏规则及说明******************************/void shuoming(){int i;char c;for(i=0;i<=999;i++){system("cls");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("\t\t\t╭───────────╮\n");printf("\t\t\t│ 游戏规则及说明│\n");printf("\t\t\t╰───────────╯\n\n ");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),BACKGROUND_INTENSITY|FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE|FOREGROUND_RED|FOREGROUND_RED);printf("囧");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDL E),FOREGROUND_INTENSITY| FOREGROUND_RED |FOREGROUND_GREEN | FOREGROUND_BLUE);printf(" ");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("别看了,这就是你了,还挺cool的吧,嘿嘿\n\n\n");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);printf(" █ ");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("这个是墙,放心,不是豆腐渣工程,要不你可以去撞撞看,\n");printf(" 你会懂得......\n\n\n");printf(" ■ ");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("这个是箱子,就是要你去推的那个,不要试图一下推两个箱\n");printf(" 子,更不要想推着箱子把墙撞开,没用的...不要沮丧,再免\n");printf(" 费给你一句忠告,要是把箱子推到了死角,呵呵,直接下一\n");printf(" 关吧\n\n\n");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN | FOREGROUND_RED);printf(" ★ ");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf("这里就是箱子们的最终归宿了,箱子要是回不到家,哼哼,\n");printf(" 你自己掂量着办吧。
c语言推箱子代码推箱子是一款经典的益智游戏,也是计算机科学中常见的算法案例。
在这篇文章中,我们将通过C语言来实现推箱子游戏的代码。
推箱子游戏中,玩家需要控制一个人物,将箱子推到指定位置。
箱子只能被推,不能被拉,也不能被穿过其他箱子或墙壁。
游戏的目标是将所有的箱子推到指定位置,完成所有的关卡。
我们需要定义游戏中的元素,包括墙壁、箱子、玩家和目标位置。
我们可以使用二维数组来表示游戏地图,其中0表示空地,1表示墙壁,2表示箱子,3表示玩家,4表示目标位置。
例如,下面是一个简单的游戏地图:int map[5][5] = {{1, 1, 1, 1, 1},{1, 0, 0, 0, 1},{1, 0, 2, 4, 1},{1, 0, 3, 0, 1},{1, 1, 1, 1, 1}};接下来,我们需要实现玩家的移动。
玩家可以向上、下、左、右四个方向移动,但是需要避免撞到墙壁或箱子。
我们可以使用循环和条件语句来实现玩家的移动,例如:int x = 2; // 玩家的初始位置int y = 2;char input; // 读取玩家的输入while (1) { // 游戏循环// 打印游戏地图for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (map[i][j] == 0) printf(" "); if (map[i][j] == 1) printf("#"); if (map[i][j] == 2) printf("$"); if (map[i][j] == 3) printf("@"); if (map[i][j] == 4) printf("."); }printf("\n");}// 读取玩家的输入scanf("%c", &input);// 根据玩家的输入移动玩家int new_x = x, new_y = y;if (input == 'w') new_x--;if (input == 's') new_x++;if (input == 'a') new_y--;if (input == 'd') new_y++;// 判断新位置是否可行if (map[new_x][new_y] == 0 || map[new_x][new_y] == 4) { map[x][y] = 0;map[new_x][new_y] = 3;x = new_x;y = new_y;} else if (map[new_x][new_y] == 2) {// 判断箱子的移动int new_box_x = new_x, new_box_y = new_y;if (input == 'w') new_box_x--;if (input == 's') new_box_x++;if (input == 'a') new_box_y--;if (input == 'd') new_box_y++;if (map[new_box_x][new_box_y] == 0 || map[new_box_x][new_box_y] == 4) {map[x][y] = 0;map[new_x][new_y] = 3;map[new_box_x][new_box_y] = 2;x = new_x;y = new_y;}}// 判断游戏是否结束int count = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (map[i][j] == 2) count++;}}if (count == 0) {printf("Congratulations! You win!\n");break;}}我们需要添加一些辅助功能,例如读取游戏地图和保存游戏进度。
目录1 摘要.............................................................. .. (3)1.1设计题目............................................. (3)1.2设计内容.............................................. .. (3)1.3开发工具........................................................ . (3)1.4应用平台....................................................... .. (3)2 详细设计 (3)2.1程序结构...................................................... (3)2.2主要功能..................................................... (4)2.3函数实现..................................................... .. (4)2.4开发日志.................................................... (5)3 程序调试及运行 (5)3.1程序运行结果............................................... .. (6)3.2程序使用说明............................................. . (6)3.3程序开发总结.............................................. (7)4 附件(源程序)........................................... . (7)1 摘要1.1 设计题目推箱子游戏1.2 设计内容推箱子是一款经典的益智小游戏,目的是在训练人的逻辑思考能力。
推箱子c语言程序代码推箱子游戏是一款益智类游戏,在游戏中需要利用角色推动箱子到指定位置,并通过通关来获得胜利。
在这里,我将为您介绍一个简单的推箱子的C语言程序代码。
首先,我们需要定义一些变量和常量来描述游戏中的元素和状态:```c#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#define ROW 10 //地图行数#define COL 15 //地图列数//定义角色、箱子和目标的符号#define PLAYER 'P'#define BOX '$'#define TARGET '*'#define WALL '#'#define SPACE ' '接下来,我们需要定义一个结构体来表示地图上的每一个位置,包含如下元素:- `type`:表示该位置的类型,可以是空格、墙、箱子、目标或者角色。
- `hasBox`: 表示该位置上是否有箱子,是一个布尔值。
```cstruct Position {char type;bool hasBox;};```- `map`:表示地图,是一个二维数组,每个元素都是一个 `Position` 结构体。
- `playerRow` 和 `playerCol`:表示角色当前的位置。
- `boxRow` 和 `boxCol`:表示当前推动的箱子的位置。
```cint playerRow, playerCol, boxRow, boxCol;Position map[ROW][COL];```接下来,我们需要编写地图的初始化函数。
在这个函数中,我们先将地图上所有的位置都标记为空格,并将所有的箱子标记为 `false`。
然后,我们可以将墙、箱子、目标和角色放置到正确的位置上。
#include"stdio.h"#include"bios.h"#define LEFT 75#define RIGHT 77#define UPPER 72#define DOWN 80#define ESC 27struct Boxss /*定义箱子结构体,其中包含坐标属性*/{int x,y;};union keyboard /*定义读取键盘码的共用体类型*/{unsigned int iKeyInfo;char chKeyBit[2];};int fnGetKey(void) /*定义读取键盘码的函数*/{union keyboard uniKey1; /*定义读取键盘码的共用体变量*/while(bioskey(1)==0); /*检测用户是否按键*/uniKey1.iKeyInfo=bioskey(0); /*读取按键信息*/return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]); /*返回ASCII码或扩充码*/}void main(){int iKey,x=11,y=6,tx=11,ty=6; /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/struct Boxss Box[4]; /*定义箱子数量*/int chMap[10][10]={ /*用二维数组定义地图*/{0,0,0,0,0,0,0,0,0,0}, /*0表示墙1表示路2表示目标*/{0,1,0,0,0,0,1,1,1,0},{0,1,0,2,0,0,1,0,1,0},{0,1,0,1,0,0,1,0,1,0},{0,1,1,1,0,0,1,0,1,0},{0,1,0,0,0,0,1,0,1,0},{0,1,1,1,1,1,1,0,1,0},{0,1,0,1,0,0,0,0,2,0},{0,2,0,1,1,1,1,2,0,0},{0,0,0,0,0,0,0,0,0,0},};int i,j;Box[0].x=13; /*定义箱子的坐标属性*/Box[1].x=11;Box[2].x=14;Box[3].x=18;Box[0].y=8;Box[1].y=7;Box[2].y=13;Box[3].y=7;while(1) /*反复进行求移动的坐标运算*/{for(i=0;i<10;i++) /*输出新地图(刷新地图)*/{gotoxy(10,5+i);for(j=0;j<10;j++){if(chMap[i][j]==0)printf("#");if(chMap[i][j]==1)printf(" ");if(chMap[i][j]==2)printf("X");}}j=0; /*判断是否所有箱子都在目标坐标上*/for(i=0;i<4;i++)if(chMap[Box[i].y-5][Box[i].x-10]==2)j++;if(j==4) /*如果所有箱子都就位输出"YOU WIN!"退出*/{clrscr();printf("You Win!");break;}for(i=0;i<4;i++) /*在起始(或移动后)的坐标输出箱子*/{gotoxy(Box[i].x,Box[i].y);printf("0");}gotoxy(x,y); /*在起始(或移动后)的坐标输出人*/printf("*\b");tx=x; /*记录本次移动前的坐标*/ty=y;iKey=fnGetKey();if(iKey==LEFT&&chMap[y-5][x-1-10]!=0) /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/x--;if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0)x++;if(iKey==UPPER&&chMap[y-1-5][x-10]!=0)y--;if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)y++; /*输入ESC退出并输出"YOU LOST"*/if(iKey==ESC){clrscr();printf("You Lost");break;}for(i=0;i<4;i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/if(Box[i].x==x&&Box[i].y==y){Box[i].x+=(x-tx);Box[i].y+=(y-ty);if(chMap[Box[i].y-5][Box[i].x-10]==0) /*如果移动后的箱子坐标会出现在墙上,则使箱子坐标和人坐标都返回移动前的值*/{Box[i].x-=(x-tx);Box[i].y-=(y-ty);x=tx;y=ty;}break;}clrscr();}getch();}。
详解C语⾔实现推箱⼦的基本功能⽬录1.前⾔2.游戏效果展⽰3.项⽬分析4.地图实现4.1存储地图4.2打印地图5.控制⾓⾊移动5.1找到控制的⾓⾊5.2实现移动6.判断胜利总结1.前⾔⾸先推箱⼦是c语⾔的⼀个经典的项⽬,本篇⽂字将会介绍如何从零开始实现c语⾔如何实现推箱⼦2.游戏效果展⽰3.项⽬分析游戏元素:空地 0墙壁 1⾓⾊ 2箱⼦ 3胜利点 4游戏⽬的:玩家控制⾓⾊在地图的空地上进⾏移动,通过推动箱⼦躲避障碍,将所有的箱⼦推⾄胜利点即可成功。
4.地图实现4.1存储地图⾸先存储地图我们使⽤数组来进⾏存储,为什么我们会⽤到char⽽不是int?是因为int普遍为4字节,char为1字节,我们就可以⼤⼤减少存储地图所需要的内存。
如果要写多张地图的话,仅仅将数组扩充⾄三维即可,作者将会在之后的⽂章进⾏说明。
char map[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, 0, 0, 1, 1, 0, 0, 1 },{ 1, 0, 0, 0, 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 }};4.2打印地图对应地图的打印我们则需要对地图进⾏遍历,利⽤switch语句将地图打印在控制台上⾯。
for (size_t i = 0; i < 10; i++){for (size_t j = 0; j < 10; j++){switch (map[i][j]){case 0:printf(" "); // 注意⼀点是两个空格,如果是⼀个空格的时候会使地图打印出现⼀些问题break;case 1:printf("█");break;case 2:printf("♀");break;case 3:printf("●");break;case 4:printf("☆");break;default:break;}}printf("\n");}5.控制⾓⾊移动5.1找到控制的⾓⾊int posX = 0, posY = 0;for (size_t i = 0; i < 10; i++){for (size_t j = 0; j < 10; j++){if (2 == map[i][j] || 2 + 4 == map[i][j]){posX = i;posY = j;break;//找到⾓⾊,记录其所在的x轴和y轴的坐标}}}5.2实现移动// 控制(键盘:WSAD(上下左右))// 需要从键盘获取按键(字符)switch (getch()) // getch()该⽅法需要在开头导⼊#include <conio.h>{case 'w':case 'W':printf("向上\n");/*向上逻辑:改变数组元素的值以⼈为参考上⾯可能是:空地移动墙壁不动成功点移动箱⼦判断箱⼦上⾯是个啥空地移动成功点移动墙壁不动另⼀个箱⼦不动*/// 上⾯是空地或成功点 map[posX][posY]:主⾓所在的位置if (0 == map[posX - 1][posY] || 4 == map[posX - 1][posY]){// 当前位置⼈离开map[posX][posY] -= 2;// 上⾯位置⼈过来map[posX - 1][posY] += 2;}// 上⾯是箱⼦(将箱⼦从点上推⾛)else if (3 == map[posX - 1][posY] || 3 + 4 == map[posX - 1][posY]) {// 箱⼦上⾯是空地或成功点 map[posX - 1][posY]: 箱⼦位置if (0 == map[posX - 2][posY] || 4 == map[posX - 2][posY]){// 当前位置⼈离开map[posX][posY] -= 2;// 上⾯位置⼈过来map[posX - 1][posY] += 2;// 上⾯位置箱⼦离开map[posX - 1][posY] -= 3;// 上⾯的上⾯箱⼦过来map[posX - 2][posY] += 3;}}break;case 's':case 'S':printf("向下\n");break;case 'a':case 'A':printf("向左\n");break;case 'd':case 'D':printf("向右\n");break;default:break;}6.判断胜利对地图遍历搜索,如果发现没有箱⼦的话,就可以判断为胜利。
C语⾔实现简单推箱⼦游戏使⽤C语⾔实现超简单的推箱⼦游戏,供⼤家参考,具体内容如下感谢您打开了这篇⽂章,下⾯我将讲述⼀下推箱⼦是如何实现的。
另外附赠适配该程序简单好⽤专属推箱⼦地图编辑器让您在16 * 16⼤地图的条件下也能轻松编辑地图。
链接:本程序在没有检测到地图⽂件的情况下也能独⾃运⾏!代码中储存了推箱⼦游戏第⼀关的标准地图,让您在没有地图⽂件的情况下也能熟悉整个程序的流程!当然,拥有地图⽂件会也会获得更好的游戏体验,请⾃⾏编辑。
废话不多说!下⾯进⼊技术环节:C语⾔版多功能推箱⼦编译环境: Windows VS2019其他编译器,可通过查看下⽂的“注意事项”将代码更正为其他平台可正常版本需求:控制⼈物将箱⼦推⾄⽬标中,⽬标全部完成进⼊下⼀关。
思路:使⽤⼆维数组储存不同数字,数字包括了地图中所有的元素,通过按键控制⼈物完成推箱⼦的操作,达成关卡内的所有⽬标后,⾃动进⼊下⼀关。
做法:主要逻辑移动推箱⼦部分:按下⽅向键后,双重循环找到⼈物,根据移动⽅向储存⼈物、⼈物前⾯、箱⼦、箱⼦前⾯四⼤基础信息,并通过判断前⽅数组值是否是墙壁、⽬标等,进⾏⼈物移动和箱⼦移动操作。
具体详细做法我已经整理到了代码注释当中,以便⼀⼀对应查看。
使⽤到知识点:循环、⼆维数组、读取⽂件难点:在⼈物和箱⼦移动的同时,有需要注意当⼈物移动到了未完成⽬标或已完成⽬标、箱⼦移动到了已完成⽬标的情况,这种情况需要判断在⼈物/箱⼦离开之后,原地⼜再次变为原元素。
说明:程序前部分有较多代码⽤于写出未检测到⽂件的情况逻辑和关卡选择逻辑,如果要直接查看核⼼代码请移动到operation();操作⼈物函数和gbszszhs(char ch);修改⼆维数组函数。
注意:由于编译器原因,程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前⾯的“_”。
同时,要将⽂件打开函数fopen_s(&fp, FLPA, “r”);更改为fp = fopen(FLPA, “r”);fcanf_s更改为fcanf scanf_s()更改为scanf运⾏效果:菜单选择:游戏进⾏:代码实现:#include <stdio.h>#include <windows.h>#include <conio.h>//0代表空地,1代表墙,2代表未达成的⽬标,3代表箱⼦,4代表玩家,5代表已放箱⼦的⽬标,//6代表⼈暂时所在的未达成的⽬标,7代表⼈暂时所在的已达成的⽬标,8代表箱⼦暂时所在的已达成的⽬标#define WH 16 //地图的宽⾼#define BYT 529 //⼀关需要跳过的字数因为⽂件指针定位函数的原因,有时定位可能会不准确,可以通过修改BYT进⾏适配#define FLPA "C:\\Users\\ASUS\\Desktop\\推箱⼦地图.txt" //需要读取地图⽂件的路径游戏之前需进⾏设置!!//找不到路径将只能进⾏第⼀关游戏//注意:游戏地图边界不可以当做墙壁使⽤!#define INITMAP \int mapch_init[WH][WH] = { \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0}, \{0, 0, 0, 0, 1, 1, 1, 3, 0, 3, 2, 1, 0, 0, 0, 0}, \{0, 0, 0, 0, 1, 2, 0, 3, 4, 1, 1, 1, 0, 0, 0, 0}, \{0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \};int mapch[WH][WH];//所有函数之间不是独⽴和顺序的,会互相调⽤void HideCursor(); //隐藏光标void gotoxy(int x, int y);//光标定位void scmbxyhs(); //输出地图下⽅⽂字信息函数void wjzdwjzjjrqk(); //未找到⽂件直接进⼊第⼀关情况int gkxzhs(); //关卡选择函数void cwjzjrwkdhs(); //从⽂件中进⼊关卡的函数void gnxzjm(); //主菜单选择void cshhs(); //初始化函数void tranmap(); //翻译并画出地图void detection(); //寻找所有该地图中未完成的⽬标void gktgszxhs(); //判断关卡是否通过,是进⾏下⼀关卡void operation(); //操作⼈物主要函数***void gbszszhs(char ch); //改变数组数值函数int updatetime(); //获取⼀次电脑现在的时间void process(); //主要流程int main(){cshhs(); //初始化函数process(); //主要流程return 0;}//游戏开始初始化部分void scmbxyhs() //输出地图提⽰信息函数{gotoxy(34, 17);printf("本关剩余⽬标数:");gotoxy(34, 19);printf("本关已⾛步数:");gotoxy(32, 21);printf("您使⽤秒完成了本关!");gotoxy(49, 19);printf("0"); //输出初始的步数0}void wjzdwjzjjrqk() //未找到⽂件直接进⼊第⼀关情况{system("cls");printf("地图⽂件不存在,\n直接进⼊第⼀关");INITMAP //初始地图数组for (int i = 0; i < WH; i ) //如果地图⽂件不存在则将初始地图数组的值赋给需要使⽤的地图for (int j = 0; j < WH; j ) //将初始地图数组的值复制给当前地图数组mapch[i][j] = mapch_init[i][j];Sleep(2000); //等待两秒进⼊第⼀关system("cls"); //清屏tranmap(); //画出初始地图detection(); //⽬标信息scmbxyhs(); //输出地图下⽅⽂字信息}int n = 1; //输⼊关卡变量**int maxn = 0; //最⼤关数int dczdgshs() //最⼤关数{FILE* fp = NULL; //因为⽤于提⽰和限制输⼊情况,所以需要得到最⼤关卡数maxnfopen_s(&fp, FLPA, "r");if (fp == NULL){wjzdwjzjjrqk(); //未找到⽂件直接进⼊第⼀关情况return 0;}int temp = 0; //临时变量⽤来统计地图⽂件全字节数rewind(fp); //⽂件指针移动到⽂件⾸部while (!feof(fp)) //⽂件指针还没有到⽂件尾进⼊循环{fgetc(fp); //读字符函数从⽂件开头读,向后移动⽂件指针temp ; //每读⼀个字符则临时变量⾃增,统计出全⽂件有⼏个字符}fclose(fp); //⽂件使⽤完成关闭⽂件maxn = temp / BYT 1; //最⼤关数就是所有字符的数量除以⼀关的字符数return 1;}int gkxzhs() //选择关卡函数{system("cls"); //输出关卡选择提⽰gotoxy(26, 8);printf("请输⼊想要挑战的关卡:(回车确认)");if (!dczdgshs()) //得出最⼤关数函数,返回值为0代表未找到地图⽂件,直接进⼊流程return 0;gotoxy(36, 10);printf("请输⼊1- %d ", maxn);//输出提⽰最⼤关数信息srgk: //重新选择关卡gotoxy(41, 12);scanf_s("%d", &n);if (n<1 || n>maxn) //对输⼊的错误关卡信息加以限制{gotoxy(36, 12);printf(" ");gotoxy(33, 11);printf("请输⼊正确的关数");goto srgk; //如果输⼊错误的关卡输出提⽰信息并返回到输⼊的地⽅重新输⼊}return 1; //如果找到了⽂件就返回1}void cwjzjrwkdhs() //从⽂件中进⼊关卡,适⽤于可以找到地图⽂件的情况{//关数变量n的默认初始化值为1FILE* fp = NULL;fopen_s(&fp, FLPA, "rb");if (fp == NULL){wjzdwjzjjrqk(); //直接进⼊第⼀关函数return; //地图⽂件不存在则直接进⼊第⼀关}//读⽂件进⼊关卡的代码,从第⼀关进⼊和选择特定关从n关进⼊两种情况都会执⾏//流程如果⽤到该函数,检测已达成的⽬标和未达成⽬标的个数⼀直则调⽤函数,n关数⾃增1 int skip = (n - 1) * BYT; //到n关需要跳过的字数跳过⼀关需要的字数为512fseek(fp, skip, 0); //定位到地图⽂件第skip个字节处开始读取int i, j;for (i = 0; i < WH; i ) //读取512个字符{for (j = 0; j < WH; j ){fscanf_s(fp, "%d ", &mapch[i][j]);//格式读函数,直接以整数格式读取数值存⼊地图数组mapch中printf("%d ", mapch[i][j]);}printf("\n");}fclose(fp); //读取⽂件完毕,将⽂件关闭system("cls");}void gnxzjm() //主菜单页⾯选择{system("cls");gotoxy(39, 8);printf("推箱⼦");gotoxy(34, 10);printf("输⼊1 开始新游戏");gotoxy(34, 12);printf("输⼊2 选择关卡");gotoxy(34, 14);printf("输⼊3 退出游戏");Head: //⽤于返回的标签gotoxy(34, 17);char chn=_getch(); //选择游戏模式if (chn == '3'){system("cls"); //退出游戏则输出提⽰信息gotoxy(34, 12);printf("欢迎下次光临");Sleep(2000);gotoxy(0, 24);exit(0); //退出游戏}else if (chn == '2'){if (!gkxzhs()) //进⼊关卡选择return; //如果关卡选择函数返回值为0则代表未找到⽂件,直接跳出初始化函数//如果返回1找到⽂件则继续执⾏该函数下⾯的内容}else if (chn == '1')n = 1; //如果选择新游戏,直接从第⼀关开始else{gotoxy(34, 16);printf("请输⼊正确的选择:");goto Head; //选择错误的菜单,则重新返回选择菜单的地⽅}//选择1的情况:cwjzjrwkdhs(); //从⽂件读取关卡的函数detection(); //统计当前关卡的⽬标数tranmap(); //画出地图scmbxyhs(); //输出地图下⽅⽂字信息}int detunf;//检测未完成⽬标的变量,初始为⼀个关卡中未完成⽬标的个数,箱⼦碰到未完成⽬标时,⾃减void detection() //检测当前关中有多少个⽬标{//detunfdetunf = 0; //从0开始统计int i, j;for (i = 0; i < WH; i )for (j = 0; j < WH; j )if (mapch[i][j] == 2)detunf ;gotoxy(50,17); //在提⽰信息的位置输出剩余⽬标信息printf("%d", detunf);}void cshhs() //总初始化函数{system("title 推箱⼦");//控制台标题system("mode con cols=84 lines=26");//设置控制台⼤⼩,第⼀个参数为横轴,地图参数32 16gnxzjm(); //主菜单页⾯选择HideCursor(); //隐藏光标函数dczdgshs(); //找到地图⽂件的情况下得出最⼤关数}//游戏流程部分void tranmap() //翻译地图{gotoxy(26, 1); //输出地图时在控制台中间输出,地图最上⽅空⼀⾏int i, j;for (i = 0; i < WH; i ){for (j = 0; j < WH; j ){if (mapch[i][j] == 1)printf("■");else if (mapch[i][j] == 2)printf("★");else if (mapch[i][j] == 3 || mapch[i][j] == 8)printf("●");else if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7)printf("♀");else if (mapch[i][j] == 5)printf("--");elseprintf(" ");}gotoxy(26, i 1); //根据数组的y轴更改地图输出的y轴,地图最上⽅空⼀⾏}}int opnum; //每⼀关⾏⾛的步数int time;int time_2;void gktgszxhs() //判断当前关卡是否通过,是进⼊下⼀关{if (detunf == 0) //当前关卡⽬标为0时{n ; //关卡变量⾃增if (n > maxn) //如果关数n⼤于了最⼤关卡数则返回主菜单{tranmap(); //画出地图gotoxy(26, 22);printf("您已通关所有关卡,3秒后返回主菜单!");Sleep(3000); //等待三秒opnum = 0, time = updatetime(),time_2 = 0;//⾏⾛的步数,本关时间清0,重新获取当前时间,\因为需要输出的time_2是⽤当前时间-刚开始的时间gnxzjm(); //主菜单页⾯选择函数}else{tranmap(); //画出地图Sleep(2000); //等候两秒cwjzjrwkdhs(); //当前关卡⽬标为0时,从⽂件中向地图数组中读⼊下⼀关卡的信息detection(); //统计当前关卡⽬标个数scmbxyhs(); //输出地图下⽅的信息opnum = 0, time = updatetime(),time_2 = 0;//注释见297⾏//按键结束之后操控函数会调⽤画出地图函数}}}int i, j; //找到后的⼈的坐标int box_x, box_y; //箱⼦的坐标int boxnext_x, boxnext_y; //箱⼦前⾯的坐标int peonext_x, peonext_y; //⼈前⾯的坐标void gbszszhs(char ch) //修改地图数组值主要函数**{for (i = 0; i < WH; i ) //遍历 i是y轴,j是x轴{for (j = 0; j < WH; j ){if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7) //找到⼈的位置{if (ch == 'w') // ⽤于确定不同⽅向上箱⼦、箱⼦前⾯、⼈前⾯的坐标{box_y = i - 1; box_x = j; //箱⼦当前boxnext_y = i - 2; boxnext_x = j; //箱⼦前⾯peonext_y = i - 1; peonext_x = j; //⼈前⾯}else if (ch == 'a'){box_y = i; box_x = j - 1;boxnext_y = i; boxnext_x = j - 2;peonext_y = i; peonext_x = j - 1;}else if (ch == 's'){box_y = i 1; box_x = j;boxnext_y = i 2; boxnext_x = j;peonext_y = i 1; peonext_x = j;}else if (ch == 'd'){box_y = i; box_x = j 1;boxnext_y = i; boxnext_x = j 2;peonext_y = i; peonext_x = j 1;}//排除⼤的错误if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果⼈的前边是箱⼦if (mapch[boxnext_y][boxnext_x] == 1 || mapch[boxnext_y][boxnext_x] == 3 || mapch[boxnext_y][boxnext_x] == 8) return; //如果箱⼦前边是墙或者是箱⼦直接结束修改函数if (mapch[box_y][box_x] == 1) //⼈的前边不能是墙return; //如果⼈的前边是墙直接结束修改opnum ; //每次有效操作步数⾃增⼀次,并输出gotoxy(49, 19);printf("%d", opnum);//步数//箱⼦改变if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果⼈的前边是箱⼦{//箱⼦原地改变:if (mapch[box_y][box_x] == 3) //如果箱⼦所在的位置是⼀般箱⼦mapch[box_y][box_x] = 0; //改变为空地else if (mapch[box_y][box_x] == 8) //如果箱⼦所在的位置是箱⼦暂时所在已达成的⽬标mapch[box_y][box_x] = 5; //改变为已达成的⽬标//箱⼦的下⼀步改变:if (mapch[boxnext_y][boxnext_x] == 2) //如果箱⼦前⾯的格⼦是未放箱⼦的⽬标{mapch[boxnext_y][boxnext_x] = 5; //则该格⼦变为已放箱⼦的⽬标detunf--; //本关⽬标减1gotoxy(50, 17); //输出本关剩余⽬标个数printf("%d", detunf);}else if (mapch[boxnext_y][boxnext_x] == 0) //如果箱⼦前⾯是空地mapch[boxnext_y][boxnext_x] = 3; //则变为普通箱⼦else if (mapch[boxnext_y][boxnext_x] == 5) //如果箱⼦前⾯是已经放过箱⼦的⽬标mapch[boxnext_y][boxnext_x] = 8; //则变为箱⼦暂时所在已达成的⽬标}//原地改变if (mapch[i][j] == 6)mapch[i][j] = 2; //⾛出去之后原地⼜变回2 未达成的⽬标else if (mapch[i][j] == 7)mapch[i][j] = 5; //⾛出去之后原地⼜变回5 已达成的⽬标else if (mapch[i][j] == 4)mapch[i][j] = 0; //⾛出去之后原地变回4 ⼈的原型//⼈下⼀步改变if (mapch[peonext_y][peonext_x] == 0 || mapch[peonext_y][peonext_y] == 3)//如果他的下⼀步是普通箱⼦或者空地 mapch[peonext_y][peonext_x] = 4; //⼈是普通的⼈if (mapch[peonext_y][peonext_x] == 2) //如果他的下⼀步还是未达成的⽬标mapch[peonext_y][peonext_x] = 6; //⼈是⼈暂时所在未达成的⽬标if (mapch[peonext_y][peonext_x] == 5) //如果⼈的下⼀步是已经达成的⽬标mapch[peonext_y][peonext_x] = 7; //⼈是⼈暂时所在已经达成的⽬标if (mapch[peonext_y][peonext_x] == 8) //如果⼈的下⼀步是箱⼦暂时所在已达成的⽬标mapch[peonext_y][peonext_x] = 7; //⼈还是暂时所在已达成的⽬标goto L1; //修改完成后不需要遍历后⾯的数组,直接跳出所有循环}}}L1: //⽤于跳出的标签gktgszxhs(); //关卡通过则进⼊下⼀关}void operation() //操作⼈物函数{char ch = _getch(); //接收输⼊的⽅向 _getch()即使接收switch (ch){case 'w': //向不同⽅向移动gbszszhs(ch); //传递参数,修改⼆维数组break;case 'a':gbszszhs(ch);break;case 's':gbszszhs(ch);break;case 'd':gbszszhs(ch);break;}tranmap(); //重新画出地图}int updatetime() //获取⼀次电脑现在的时间{int now;SYSTEMTIME system_time;GetLocalTime(&system_time);now = system_time.wMinute * 60 system_time.wSecond;return now;}void process() //主要流程{time = updatetime(); //初始时间while (1){time_2 = updatetime() - time; //每关的时间time_2,值为当前时间减去当前关卡开始的时间gotoxy(39, 21);printf("%d s", time_2); //输出if(_kbhit())operation(); //操作⼈物、修改数值主要函数Sleep(20); //游戏帧率和⼿感休眠时间}}void gotoxy(int x, int y) //光标定位{COORD pos = { x,y };SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}void HideCursor() //光标隐藏{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}主要函数:gbszszhs()⾥⾯的逻辑是⽐较复杂的,我当时写这段代码的时候也是反反复复修改好多次甚⾄推翻重做才理通顺这些逻辑的。