C语言编写的推箱子游戏源代码0304190104
推箱子C语言程序报告

推箱子C语言程序报告推箱子是一种极富智慧和策略性的游戏,是著名的益智游戏之一、它不仅可以锻炼人们的逻辑思维能力和创造力,而且还能提高人们的解决问题的能力和耐心。
本篇报告将介绍一个基于C语言开发的推箱子游戏,包括游戏规则、程序设计思路和实现效果等方面的内容。
一、游戏规则推箱子游戏的规则十分简单,玩家需要操作一个小人将该场景中的木箱全部推到指定位置。
在游戏开始时,场景中会放置一定数量的木箱和一个小人。
玩家可以通过键盘输入上下左右四个方向键来移动小人,小人可以推动场景中的木箱,但不能直接拉动或推动多个箱子。
当所有的木箱都被推到指定位置时,游戏胜利,反之则失败。
二、程序设计思路推箱子游戏的实现涉及到场景的渲染、小人和木箱的移动、游戏的逻辑判断等多个方面。
下面将分别介绍这些方面的程序设计思路。
1.场景渲染2.小人和木箱的移动玩家操作小人的移动,可以通过监听键盘输入的方向键来实现。
根据输入的方向,判断小人与目标位置的关系,如果目标位置是空地或者指定位置,则小人可以移动到目标位置,否则不能移动。
当小人移动后,如果目标位置是木箱,则需要判断木箱与目标位置的关系,如果目标位置是空地或者指定位置,则木箱可以被推动到目标位置,否则不能推动。
3.游戏逻辑判断在每一次小人移动后,需要判断游戏是否胜利或失败。
胜利的条件是所有的木箱都被推到指定位置,判断的方法是在遍历整个场景时,检查是否存在未推到指定位置的木箱。
失败的条件是小人无法再移动,判断的方法是在判断小人是否能够移动时,如果没有可移动的方向,则游戏失败。
三、实现效果通过以上的程序设计思路,可以开发出一个基于C语言的推箱子游戏。
该游戏可以提供丰富的关卡和难度选择,让玩家能够不断挑战和提高自己的智力。
游戏的界面简洁明了,操作方便快捷,给玩家带来舒适的游戏体验。
总结:推箱子是一种极富智慧的益智游戏,本篇报告介绍了一个基于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、这是本⼈对推箱⼦游戏的见解如果有什么错误请指正以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
推箱子游戏的代码)

#include <dos.h>#include <stdio.h>#include <ctype.h>#include <conio.h>#include <bios.h>#include <alloc.h>typedef struct winer{int x,y;struct winer *p;}winer;char status [20][20];char far *printScreen=(char far* )0xB8000000;void putoutChar(int y,int x,char ch,char fc,char bc);void printWall(int x, int y);void printBox(int x, int y);void printBoxDes(int x, int y);void printDestination(int x, int y);void printDestination1(int x,int y,winer **win,winer **pw); void printMan(int x, int y);void init();winer *initStep1();winer *initStep2();winer *initStep3();winer *initStep4();void moveBoxSpacetoSpace(int x ,int y, char a);void moveBoxDestoSpace(int x ,int y, char a) ;void moveBoxSpacetoDes(int x, int y, char a);void moveBoxDestoDes(int x, int y, char a);int judge(int x, int y);void move(int x, int y, char a);void reset(int i);void putoutChar(int y,int x,char ch,char fc,char bc){printScreen[(x*160)+(y<<1)+0]=ch;printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc;}void printWall(int x,int y){putoutChar(y-1,x-1,219,GREEN,BLACK);status[x][y]='w';}void printBox(int x,int y){putoutChar(y-1,x-1,10,WHITE,BLACK);status[x][y]='b';}void printDestination1(int x,int y,winer **win,winer **pw) {winer *qw;putoutChar(y-1,x-1,003,YELLOW,BLACK);status[x][y]='m';if(*win==NULL){*win=*pw=qw=(winer* )malloc(sizeof(winer));(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL;}else{qw=(winer* )malloc(sizeof(winer));qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;}}void printDestination(int x,int y){putoutChar(y-1,x-1,003,YELLOW,BLACK);status[x][y]='m';}void printMan(int x,int y){gotoxy(y,x);_AL=02;_CX=01;_AH=0xa;geninterrupt(0x10);}void printBoxDes(int x,int y){putoutChar(y-1,x-1,10,YELLOW,BLACK);status[x][y]='i';}void init(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)status[i][j]=0;_AL=3;_AH=0;geninterrupt(0x10);gotoxy(40,4);printf("Welcome to the box world!");gotoxy(40,6);printf("You can use up, down, left,");gotoxy(40,8);printf("right key to control it, or");gotoxy(40,10);printf("you can press Esc to quit it."); gotoxy(40,12);printf("Press space to reset the game."); gotoxy(40,14);printf("Wish you have a good time !");gotoxy(40,16);printf("April , 2007");}winer *initStep1(){int x;int y;winer *win=NULL;winer *pw;for(x=1,y=5;y<=9;y++)printWall(x+4,y+10);for(y=5,x=2;x<=5;x++)printWall(x+4,y+10);for(y=9,x=2;x<=5;x++)printWall(x+4,y+10);for(y=1,x=3;x<=8;x++)printWall(x+4,y+10);for(x=3,y=3;x<=5;x++)printWall(x+4,y+10);for(x=5,y=8;x<=9;x++)printWall(x+4,y+10);for(x=7,y=4;x<=9;x++)printWall(x+4,y+10);for(x=9,y=5;y<=7;y++)printWall(x+4,y+10);for(x=8,y=2;y<=3;y++)printWall(x+4,y+10);printWall(5+4,4+10);printWall(5+4,7+10);printWall(3+4,2+10);printBox(3+4,6+10);printBox(3+4,7+10);printBox(4+4,7+10);printDestination1(4+4,2+10,&win,&pw); printDestination1(5+4,2+10,&win,&pw); printDestination1(6+4,2+10,&win,&pw); printMan(2+4,8+10);return win;}winer *initStep2(){int x;int y;winer *win=NULL;winer *pw;for(x=1,y=4;y<=7;y++)printWall(x+4,y+10);for(x=2,y=2;y<=4;y++)printWall(x+4,y+10);for(x=2,y=7;x<=4;x++)printWall(x+4,y+10);for(x=4,y=1;x<=8;x++)printWall(x+4,y+10);for(x=8,y=2;y<=8;y++)printWall(x+4,y+10);for(x=4,y=8;x<=8;x++)for(x=4,y=6;x<=5;x++)printWall(x+4,y+10);for(x=3,y=2;x<=4;x++)printWall(x+4,y+10);for(x=4,y=4;x<=5;x++)printWall(x+4,y+10);printWall(6+4,3+10);printBox(3+4,5+10);printBox(6+4,6+10);printBox(7+4,3+10);printDestination1(5+4,7+10,&win,&pw); printDestination1(6+4,7+10,&win,&pw); printDestination1(7+4,7+10,&win,&pw); printMan(2+4,6+10);return win;}winer *initStep3(){int x;int y;winer *win=NULL;winer *pw;for(x=1,y=2;y<=8;y++)printWall(x+4,y+10);for(x=2,y=2;x<=4;x++)printWall(x+4,y+10);for(x=4,y=1;y<=3;y++)printWall(x+4,y+10);for(x=5,y=1;x<=8;x++)printWall(x+4,y+10);for(x=8,y=2;y<=5;y++)printWall(x+4,y+10);for(x=5,y=5;x<=7;x++)printWall(x+4,y+10);for(x=7,y=6;y<=9;y++)printWall(x+4,y+10);for(x=3,y=9;x<=6;x++)printWall(x+4,y+10);for(x=3,y=6;y<=8;y++)printWall(x+4,y+10);printWall(2+4,8+10);printWall(5+4,7+10);printBox(6+4,3+10);printBox(5+4,6+10);printDestination1(2+4,5+10,&win,&pw); printDestination1(2+4,6+10,&win,&pw); printDestination1(2+4,7+10,&win,&pw); printMan(2+4,4+10);return win;}winer *initStep4(){int x;int y;winer *win=NULL;winer *pw;for(x=1,y=1;y<=6;y++)printWall(x+4,y+10);for(x=2,y=7;y<=8;y++)printWall(x+4,y+10);for(x=2,y=1;x<=7;x++)printWall(x+4,y+10);for(x=7,y=2;y<=4;y++)printWall(x+4,y+10);for(x=6,y=4;y<=9;y++)printWall(x+4,y+10);for(x=3,y=9;x<=5;x++)printWall(x+4,y+10);for(x=3,y=3;y<=4;y++)printWall(x+4,y+10);printWall(3+4,8+10);printBox(3+4,5+10);printBox(4+4,4+10);printBox(4+4,6+10);printBox(5+4,5+10);printBox(5+4,3+10);printDestination1(3+4,7+10,&win,&pw); printDestination1(4+4,7+10,&win,&pw); printDestination1(5+4,7+10,&win,&pw); printDestination1(4+4,8+10,&win,&pw); printDestination1(5+4,8+10,&win,&pw); printMan(2+4,2+10);return win;}void moveBoxSpacetoSpace(int x,int y,char a) {switch(a){case 'u':status[x-1][y]=0;printf(" ");printBox(x-2,y);printMan(x-1,y);status[x-2][y]='b';break;case 'd':status[x+1][y]=0;printf(" ");printBox(x+2,y);printMan(x+1,y);status[x+2][y]='b';break;case 'l':status[x][y-1]=0;printf(" ");printBox(x,y-2);printMan(x,y-1);status[x][y-2]='b';break;case 'r':status[x][y+1]=0;printf(" ");printBox(x,y+2);printMan(x,y+1);status[x][y+2]='b';break;default:break;}}void moveBoxDestoSpace(int x,int y,char a) {switch(a){case 'u':status[x-1][y]='m';printf(" ");printBox(x-2,y);printMan(x-1,y);status[x-2][y]='b';break;case 'd':status[x+1][y]='m';printf(" ");printBox(x+2,y);printMan(x+1,y);status[x+2][y]='b';break;case 'l':status[x][y-1]='m';printf(" ");printBox(x,y-2);printMan(x,y-1);status[x][y-2]='b';break;case 'r':status[x][y+1]='m';printf(" ");printBox(x,y+2);printMan(x,y+1);status[x][y+2]='b';break;default:break;}}void moveBoxSpacetoDes(int x,int y,char a) {switch(a){case 'u':status[x-1][y]=0;printf(" ");printBoxDes(x-2,y);status[x-2][y]='i';break;case 'd':status[x+1][y]=0;printf(" ");printBoxDes(x+2,y);printMan(x+1,y);status[x+2][y]='i';break;case 'l':status[x][y-1]=0;printf(" ");printBoxDes(x,y-2);printMan(x,y-1);status[x][y-2]='i';break;case 'r':status[x][y+1]=0;printf(" ");printBoxDes(x,y+2);printMan(x,y+1);status[x][y+2]='i';break;default:break;}}void moveBoxDestoDes(int x,int y,char a) {switch(a){case 'u':status[x-1][y]='m';printf(" ");printBoxDes(x-2,y);printMan(x-1,y);status[x-2][y]='i';break;case 'd':status[x+1][y]='m';printf(" ");printMan(x+1,y);status[x+2][y]='i'; break;case 'l':status[x][y-1]='m'; printf(" ");printBoxDes(x,y-2); printMan(x,y-1);status[x][y-2]='i'; break;case 'r':status[x][y+1]='m'; printf(" ");printBoxDes(x,y+2); printMan(x,y+1);status[x][y+2]='i'; break;default:break;}}int judge(int x,int y) {int i;switch(status[x][y]) {case 0:i=1;break;case 'w':i=0;break;case 'b':i=2;break;case 'i':i=4;break;case 'm':i=3;break;default:break;}return i;}void move(int x,int y,char a){switch(a){case 'u':if(!judge(x-1,y)){gotoxy(y,x);break;}else if(judge(x-1,y)==1||judge(x-1,y)==3) {if(judge(x,y)==3){printDestination(x,y);printMan(x-1,y);break;}else{printf(" ");printMan(x-1,y);break;}}else if(judge(x-1,y)==2){if(judge(x-2,y)==1){moveBoxSpacetoSpace(x,y,'u');if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x-1);}else if(judge(x-2,y)==3){moveBoxSpacetoDes(x,y,'u');if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x-1);}elsegotoxy(y,x);break;}else if(judge(x-1,y)==4){if(judge(x-2,y)==1){moveBoxDestoSpace(x,y,'u');if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x-1);}else if(judge(x-2,y)==3){moveBoxDestoDes(x,y,'u');if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x-1);}elsegotoxy(y,x);break;}case 'd':if(!judge(x+1,y)){gotoxy(y,x);break;}else if(judge(x+1,y)==1||judge(x+1,y)==3) {if(judge(x,y)==3){printDestination(x,y);printMan(x+1,y);break;}else{printf(" ");printMan(x+1,y);break;}}else if(judge(x+1,y)==2){if(judge(x+2,y)==1){moveBoxSpacetoSpace(x,y,'d'); if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x+1);}else if(judge(x+2,y)==3){moveBoxSpacetoDes(x,y,'d'); if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x+1);}elsegotoxy(y,x);break;}else if(judge(x+1,y)==4){if(judge(x+2,y)==1){moveBoxDestoSpace(x,y,'d'); if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x+1);}else if(judge(x+2,y)==3){moveBoxDestoDes(x,y,'d');if(judge(x,y)==3)printDestination(x,y);gotoxy(y,x+1);}elsegotoxy(y,x);break;}case 'l':if(!judge(x,y-1)){gotoxy(y,x);break;}else if(judge(x,y-1)==1||judge(x,y-1)==3) {if(judge(x,y)==3){printDestination(x,y);printMan(x,y-1);break;}else{printf(" ");printMan(x,y-1);break;}}else if(judge(x,y-1)==2){if(judge(x,y-2)==1){moveBoxSpacetoSpace(x,y,'l');if(judge(x,y)==3)printDestination(x,y);gotoxy(y-1,x);}else if(judge(x,y-2)==3){moveBoxSpacetoDes(x,y,'l');if(judge(x,y)==3)printDestination(x,y);gotoxy(y-1,x);}elsegotoxy(y,x);break;}else if(judge(x,y-1)==4){{moveBoxDestoSpace(x,y,'l');if(judge(x,y)==3)printDestination(x,y);gotoxy(y-1,x);}else if(judge(x,y-2)==3){moveBoxDestoDes(x,y,'l');if(judge(x,y)==3)printDestination(x,y);gotoxy(y-1,x);}elsegotoxy(y,x);break;}case 'r':if(!judge(x,y+1)){gotoxy(y,x);break;}else if(judge(x,y+1)==1||judge(x,y+1)==3) {if(judge(x,y)==3){printDestination(x,y);printMan(x,y+1);break;}else{printf(" ");printMan(x,y+1);break;}}else if(judge(x,y+1)==2){if(judge(x,y+2)==1){moveBoxSpacetoSpace(x,y,'r');printDestination(x,y); gotoxy(y+1,x);}else if(judge(x,y+2)==3){moveBoxSpacetoDes(x,y,'r'); if(judge(x,y)==3)printDestination(x,y); gotoxy(y+1,x);}elsegotoxy(y,x);break;}else if(judge(x,y+1)==4){if(judge(x,y+2)==1){moveBoxDestoSpace(x,y,'r'); if(judge(x,y)==3)printDestination(x,y); gotoxy(y+1,x);}else if(judge(x,y+2)==3){moveBoxDestoDes(x,y,'r'); if(judge(x,y)==3)printDestination(x,y); gotoxy(y+1,x);}elsegotoxy(y,x);break;}default:break;}}void reset(int i){switch(i){case 0:init();initStep1();break;case 1:init();initStep2();break;case 2:init();initStep3();break;case 3:init();initStep4();break;default:break;}}void main(){int key;int x;int y;int s;int i=0;winer *win;winer *pw;_AL=3;_AH=0;geninterrupt(0x10); init();win=initStep1();do{_AH=3;geninterrupt(0x10); x=_DH+1;y=_DL+1;while(bioskey(1)==0);key=bioskey(0);switch(key){case 0x4800:move(x,y,'u');break;case 0x5000:move(x,y,'d');break;case 0x4b00:move(x,y,'l');break;case 0x4d00:move(x,y,'r');break;case 0x3920:reset(i);break;default:break;}s=0;pw=win;while(pw){if(status[pw->x][pw->y]=='m')s++;pw=pw->p;}if(s==0){free(win);gotoxy(25,2);printf("congratulate! You have done this step!"); getch();i++;switch(i){case 1:init();win=initStep2();break;case 2:init();win=initStep3();break;case 3:init();win=initStep4();break;case 4:gotoxy(15,21);printf("Congratulation! \n");gotoxy(15,23);printf("You have done all the steps, Welcome to play again!"); key=0x011b;getch();break;default:break;}}}while(key!=0x011b);_AL=3;_AH=0;geninterrupt(0x10);}。
推箱子c语言程序设计

推箱子c语言程序设计1.引言1.1 概述概述推箱子游戏作为一款经典的益智游戏,具有很高的趣味性和挑战性,受到了广大玩家的喜爱。
本文旨在介绍通过C语言程序设计实现推箱子游戏的过程。
本文将从游戏的背景介绍、基本规则和玩法等方面展开叙述。
推箱子游戏的背景是一个仓库,玩家需要控制一个工人将货物推到指定的放置点。
游戏地图由一系列的方块组成,每个方块可能是墙壁、货物、放置点、工人或者空地。
玩家通过移动工人将货物推动到目标位置,最终完成整个地图的挑战。
C语言作为一种基础的编程语言,广泛应用于各种程序设计中。
通过使用C语言来编写推箱子游戏的程序,我们可以深入理解游戏的基本逻辑和算法,并将其应用于其他类似的益智游戏中。
本文将首先介绍推箱子游戏的基本规则和玩法,包括工人的移动、货物的推动以及地图的布局等方面。
之后,我们将详细讲解如何使用C语言来实现推箱子游戏的各个功能,包括游戏的初始化、地图的生成、玩家操作的响应等。
通过本文的学习,读者可以掌握使用C语言来进行程序设计的基本技巧和方法,同时也能够熟悉并理解推箱子游戏的内部实现原理。
希望本文对读者有所帮助,能够引发对程序设计和游戏开发的兴趣,同时也能够为读者在后续的学习和实践中提供一定的参考价值。
1.2 文章结构文章结构部分的内容:文章的结构是为了使读者能够更好地理解和掌握推箱子游戏的C语言程序设计。
通过以下几个方面来介绍文章的结构:1. 简介:在本部分中,将对推箱子游戏的背景和意义进行简要介绍。
推箱子作为一种逻辑思维和策略性很强的游戏,对于培养思维能力和解决问题的能力有着重要意义。
因此,本文将介绍推箱子游戏的特点和玩法,以及C语言程序设计对于实现推箱子游戏的重要作用。
2. 目标:本部分将明确阐述本文的目标。
主要包括两个方面:一是介绍如何使用C语言进行推箱子游戏的程序设计;二是帮助读者理解和掌握C语言程序设计的基本原理和方法,为自己编写其他游戏程序打下基础。
3. 主体内容:本文的主要内容包括两个方面。
实验四【程序源码 8-3】推箱子(C版)学生实验讲解

/*实验要求:1.有些方向的移动不能工作,需要根据能工作的进行对比研究后修改,确保四个方向都能正常移动2.计数器工作有故障,需要根据实际效果找到问题解决之3.添加第四关的基础数据并使之在软件开始玩和重新玩中全部承认4.添加栈的机制使得可以在推到墙体时可以后退一步或者数步*///推箱子小游戏C版#include<stdio.h>#include<windows.h>#include<stdlib.h>#include<conio.h>const roomsize=9; //设计房间内部为正方形,边长为9int map[roomsize+2][roomsize+2]; //推箱子房间布局的数据结构:二维数组int data; //记录最短步骤数目int times=0;int array[2]={100,100}; //记录最好成绩char string[30]="正在装入..................";//以下为前几轮游戏房间中细节布局的数据结构:二维数组的实际内容int map1[roomsize+2][roomsize+2]={ //0,1,2,3,4,5,6,7,8,9,10{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, //0{-1,0,0,0,0,1,1,1,1,1,-1}, //1{-1,0,0,0,0,1,0,0,0,1,-1}, //2{-1,1,1,1,0,1,0,0,0,1,-1}, //3{-1,1,2,1,0,1,0,0,0,1,-1}, //4{-1,1,2,1,0,1,0,3,0,1,-1}, //5{-1,1,2,1,1,1,0,3,0,1,-1}, //6{-1,1,0,0,0,0,3,4,0,1,-1}, //7{-1,1,0,0,1,0,0,0,0,1,-1}, //8{-1,1,1,1,1,1,1,1,1,1,-1}, //9{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10};int map2[roomsize+2][roomsize+2]={ //0,1,2,3,4,5,6,7,8,9,10{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0{-1,0,1,1,1,1,0,0,0,-1,-1}, //1{-1,0,1,4,0,1,1,1,0,-1,-1}, //2{-1,0,1,0,3,0,0,1,0,-1,-1}, //3{-1,1,1,1,0,1,0,1,1,-1,-1}, //4{-1,1,2,1,0,1,0,0,1,-1,-1}, //5{-1,1,2,3,0,0,1,0,1,-1,-1}, //6{-1,1,2,0,0,0,3,0,1,-1,-1}, //7{-1,1,1,1,1,1,1,1,1,-1,-1}, //8{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 };int map3[roomsize+2][roomsize+2]={ //0,1,2,3,4,5,6,7,8,9,10{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0{-1,1,1,1,1,1,1,1,1,-1,-1}, //1{-1,1,4,0,0,0,1,1,1,-1,-1}, //2{-1,1,0,3,3,0,0,0,1,-1,-1}, //36{-1,1,0,2,1,2,0,0,1,-1,-1}, //4{-1,1,0,0,1,1,3,0,1,-1,-1}, //5{-1,1,0,0,1,1,2,1,1,-1,-1}, //6{-1,1,0,0,0,0,0,1,1,-1,-1}, //7{-1,1,1,1,1,1,1,1,1,-1,-1}, //8{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 };//其他关的房间布局模板int map4[roomsize+2][roomsize+2]={ //0,1,2,3,4,5,6,7,8,9,10{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0{-1,1,1,1,1,1,1,1,1,-1,-1}, //1{-1,1,0,0,1,0,0,0,1,-1,-1}, //2{-1,1,0,1,0,0,1,0,1,-1,-1}, //3{-1,1,0,0,0,3,1,0,1,-1,-1}, //4{-1,1,1,1,3,0,3,4,1,-1,-1}, //5{-1,1,0,0,0,0,1,0,1,-1,-1}, //6{-1,1,0,2,2,2,0,0,1,-1,-1}, //7{-1,1,1,1,1,1,1,1,1,-1,-1}, //8{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10};int positionh;//人的位置纵坐标int positionl;//人的位置横坐标int flag;//标志位,记录人在目标位置上int gate;//记录关数int step;//记录步数void initbox();//初始化函数void begin();//开始界面void choose_gate();//选关提示void choose();//游戏时c选项的提示void replay();//重玩void playing();//玩游戏时界面void display();//显示地图void moveleft();//移向左方向void moveright();//移向右方向void movedown();//移向下方向void moveup();//移向上方向void test_flag();//过关提示void record();//成绩排行榜//=====void playing()//Ascii码键盘键位:左为75 右为77 上为72 下为80 {int choice;step=0;printf("开始游戏!");while(1){display();switch(getch()){case 72:moveup();step++;break;case 80:movedown();step++;break;case 75:moveleft();step++;break;case 77:moveright();step++;break;case 'c':case 'C':choose();break;case 'q':case 'Q':printf(" ╭─────────────╮\n");printf(" │是退出游戏还是返回到主界面? │\n");printf(" │ 1. 返回主界面│\n");printf(" │ 2. 退出游戏│\n");printf(" ╰──────────────╯\n");scanf("%d",&choice);switch(choice){case 1:step=0;Sleep(500);system("cls");begin();break;case 2:exit(0);}default:break;}system("cls");}}void display(){printf("\n\n\n\n\n");for(int i=1;i<=roomsize;i++){printf(" ");for(int j=1;j<=roomsize;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("☇");//人if(map[i][j]==5) printf("㊣");//箱子在目标位置上}printf("\n");}printf("\n\n");printf("选项(c) 步数:%d\n",step);}void moveright(){if(map[positionh][positionl+1]==0)//向空白位置移动{map[positionh][positionl+1]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionl++;}else if(map[positionh][positionl+1]==2)//人要到目标位置上{map[positionh][positionl+1]=4;if(flag==1)//人在目标位置上map[positionh][positionl]=2;//恢复目标位置else{map[positionh][positionl]=0;//恢复原来的状态flag=1;//标志位,记录人在目标位置上}positionl++;}else if(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==0)//将箱子推到空白位置上{map[positionh][positionl+2]=3;map[positionh][positionl+1]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionl++;}else if(map[positionh][positionl+1]==5&&map[positionh][positionl+2]!=1)//要将箱子从目标位置上推出{if(map[positionh][positionl+2]==2)//下一个位置还是目标位置{map[positionh][positionl+2]=5;map[positionh][positionl+1]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0; flag=1; }}else if(map[positionh][positionl+2]==0)//下一个位置是空白{map[positionh][positionl+2]=3;map[positionh][positionl+1]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0; flag=1; }}positionl++;}else if(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==2)//要将箱子推到目标位置上{map[positionh][positionl+2]=5;//箱子在目标位置上map[positionh][positionl+1]=4;if(flag==1)//人在目标位置上{ map[positionh][positionl]=2; flag=0; }else //人不在目标位置上map[positionh][positionl]=0;positionl++;}else step--;//抵消人不动的情况test_flag();}void moveleft(){if(map[positionh][positionl-1]==0)//向空白位置移动{map[positionh][positionl-1]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionl--;}else if(map[positionh][positionl-1]==2)//人要到目标位置上{map[positionh][positionl-1]=4;if(flag==1)//人在目标位置上map[positionh][positionl]=2;//恢复目标位置else{map[positionh][positionl]=0;//恢复原来的状态flag=1;//标志位,记录人在目标位置上}positionl--;}else if(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==0)//将箱子推到空白位置上{map[positionh][positionl-2]=3;map[positionh][positionl-1]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionl--;}else if(map[positionh][positionl-1]==5&&map[positionh][positionl-2]!=1)//要将箱子从目标位置上推出{if(map[positionh][positionl-2]==2)//下一个位置还是目标位置{map[positionh][positionl-2]=5;map[positionh][positionl-1]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0; flag=1; }}else if(map[positionh][positionl-2]==0)//下一个位置是空白{map[positionh][positionl-2]=3;map[positionh][positionl-1]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0; flag=1; }}positionl--;}else if(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==2)//要将箱子推到目标位置上{map[positionh][positionl-2]=5;//箱子在目标位置上map[positionh][positionl-1]=4;if(flag==1)//人在目标位置上{ map[positionh][positionl]=2; flag=0; }else //人不在目标位置上map[positionh][positionl]=0;positionl--;}else step--;//抵消人不动的情况test_flag();}void moveup(){if(map[positionh-1][positionl]==0){map[positionh-1][positionl]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionh--;}else if(map[positionh-1][positionl]==2)//人要到目标位置上{map[positionh-1][positionl]=4;if(flag==1)map[positionh][positionl]=2;//恢复目标位置else{map[positionh][positionl]=0;//恢复原来的状态flag=1;//标志位,记录人在目标位置上}positionh--;}else if(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==0)//将箱子推到空白位置上{map[positionh-2][positionl]=3;map[positionh-1][positionl]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionh--;}else if(map[positionh-1][positionl]==5&&map[positionh-2][positionl]!=1)//要将箱子从目标位置上推出{if(map[positionh-2][positionl]==2)//下一个位置还是目标位置{map[positionh-2][positionl]=5;map[positionh-1][positionl]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0;flag=1; }}else if(map[positionh-2][positionl]==0)//下一个位置是空白{map[positionh-2][positionl]=3;map[positionh-1][positionl]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0;flag=1; }}positionh--;}else if(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==2)//要将箱子推到目标位置上{map[positionh-2][positionl]=5;//箱子在目标位置上map[positionh-1][positionl]=4;if(flag==1)//人在目标位置上{ map[positionh][positionl]=2;flag=0; }else //人不在目标位置上map[positionh][positionl]=0;positionh--;}else step--;//抵消人不动的情况test_flag();}void movedown(){if(map[positionh+1][positionl]==0){map[positionh+1][positionl]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionh++;}else if(map[positionh+1][positionl]==2)//人要到目标位置上{map[positionh+1][positionl]=4;if(flag==1)map[positionh][positionl]=2;//恢复目标位置else{map[positionh][positionl]=0;//恢复原来的状态flag=1;//标志位,记录人在目标位置上}positionh++;}else if(map[positionh+1][positionl]==3&&map[positionh+2][positionl]==0)//将箱子推到空白位置上{map[positionh+2][positionl]=3;map[positionh+1][positionl]=4;if(flag==1){ map[positionh][positionl]=2; flag=0; }elsemap[positionh][positionl]=0;positionh++;}else if(map[positionh+1][positionl]==5&&map[positionh+2][positionl]!=1)//要将箱子从目标位置上推出{if(map[positionh+2][positionl]==2)//下一个位置还是目标位置{map[positionh+2][positionl]=5;map[positionh+1][positionl]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0;flag=1; }}else if(map[positionh+2][positionl]==0)//下一个位置是空白{map[positionh+2][positionl]=3;map[positionh+1][positionl]=4;if(flag==1)map[positionh][positionl]=2;else{ map[positionh][positionl]=0;flag=1; }}positionh++;else if(map[positionh+1][positionl]==3&&map[positionh+2][positionl]==2)//要将箱子推到目标位置上{map[positionh+2][positionl]=5;//箱子在目标位置上map[positionh+1][positionl]=4;if(flag==1)//人在目标位置上{ map[positionh][positionl]=2;flag=0; }else //人不在目标位置上map[positionh][positionl]=0;positionh++;}else step--;//抵消人不动的情况test_flag();}void initbox()//初始化函数{positionh=0;positionl=0;flag=0;step=0;gate=0;}void begin(){printf(" ╭────────────────────────────────╮\n");printf(" ││\n");printf(" │★☆★推箱子★☆★│\n");printf(" │╭─────╮│\n");printf(" ││游戏简介││\n");printf(" │╰──────╯│\n");printf(" │推箱子游戏:最终目的是操作一个人(☇)将箱子(★)推到目标位置(○)上。
用C++实现推箱子

⽤C++实现推箱⼦本⽂实例为⼤家分享了C++实现推箱⼦游戏的具体代码,供⼤家参考,具体内容如下// 1.cpp : 此⽂件包含 "main" 函数。程序执⾏将在此处开始并结束。//
#include #include //■#include #include using std::cout;const int row = 12;const int col = 13;int x = 1;int y = 11;int map[row][col] = { {2,2,2,2,2,2,2,2,2,2,2,2,2}, {2,0,0,0,0,0,0,0,0,0,0,5,2}, {2,0,0,0,0,0,0,0,0,0,3,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,1,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,0,0,0,0,0,0,0,0,0,0,0,2}, {2,2,2,2,2,2,2,2,2,2,2,2,2},};
void draw() { int i; for (i = 0; i < 12; i++) { for (int j = 0; j < 13; j++) { switch (map[i][j]) { case 0: { cout << " ";//0代表可以⾛的空格 break; } case 1: { cout << "★";//1代表箱⼦,⽤我就★代替了 break; } case 2: { cout << "■";//2代表了墙,不能逾越 break; } case 3: { cout << "☆"; break; }
C语言推箱子程序设计
//printf("\n下\n");
manf_p.x=man_p.x;manff_p.x=man_p.x;
manf_p.y=man_p.y+1,manff_p.y=man_p.y+2;
X=0,Y=1;
break;
case UP:
//printf("\n上\n");
manf_p.x=man_p.x;manff_p.x=man_p.x;
void findman(int &a,int &b,int map[14][16]);/*找到小人坐标位置*/
unsigned char getKey();/*获得有效按键返回按键值*/
int getmap(Point p,int map[14][16]);/*获得点p的地图值*/
void moveman(Point man_p,Point manf_p,int X,int Y,int map[14][16]);/*人移动*/
#define N_AISLE 0
#define WALL "■" //墙壁
#define N_WALL 1
#define AIM "※" //未放箱子的目标
#define N_AIM 2
#define BOX "□" //未在目标位置的箱子
#define N_BOX 3
#define MAN "♀" //人
(注:VC运行时,分别新建两个文件BotIt.cpp和Maps.h,再在同一目录下运行其中cpp)
代码部分
文件“BoxIt.cpp”如下:
#include <stdio.h>
C语言快速入门——创建推箱子游戏场景
C语言快速入门——创建推箱子游戏场景学习指针之前在进入指针学习之前,让我们把前面的内容结合起来,一起编写一个有趣的例子。
你也看到了,我们构建了一个推箱子游戏。
事实上它还不能与你交互,也就是说还不能玩。
不过,单是构造这样一个游戏场景,看起来已经相当有趣了。
文件组织分析•common.h:提供整个程序使用的常量•scene.h:提供场景绘制接口•scene.c:场景绘制实现•main.c:应用程序框架开发过程中,一个项目总会有一些公用的数据供多个模块使用,这里我们使用common.h用于提供此类服务。
现阶段的程序的目的是构建场景,因此我们提供了scene.h/与scene.c,对应提供场景相关功能。
main.c中负责将整个程序装配起来。
Common.h我们固定窗口大小为512x576,地面每个贴片的大小为64x64,因此场景有9行8列。
Scene.hScene.h负责提供场景与主程序之间的装配接口,为此提供了三个接口声明(函数声明)。
Scene.cScene.c是程序的核心实现,因此我们分为多步讲解。
首先看一下需要的常量声明。
场景共需要6种不同的图像资源,因此我们为每种资源分配了一个索引,这样做是为了便于我们在数组中访问。
另一方面这可以使程序有更好的可读性。
想想看,当要使用路面图像时,images[WAY]明显比images[2]更友好。
接下来是程序的数据部分。
需要讲解的是地图部分。
地图中的数字与贴图索引一致,如1代表的就是墙面,绘制时将会使用images[WALL]索引的图像wall.png 来对地面进行贴图。
地图数组类型是char[],而不是int[]。
一方面因为地面贴片不会超过127个;另一方面,我们知道存储一个int要占用4字节的内存空间,而char只需要1字节,这样下来会节省不少内存。
接下来是一组内部函数声明,之所以要重点突出内部二字,是因为它们与Scene.h中的函数作用不一样。
它们仅为Scene.c内部使用而服务,而Scene.h中声明是为外部模块服务的,因此被称为接口。
c++实现推箱子游戏
c++实现推箱⼦游戏代码实现1 #include<stdio.h>2 #include<windows.h>3 #include<conio.h>4char* playerPosition, *boxPosition[2];5/*初始化地图6 map:地图数组7 n: 地图的⾏数8 m: 地图的列数*/9void csh(char map[15][15], int n, int m)10 {1112for (int i = 0;i < n;i++)13for (int j = 0;j < m;j++)14 map[i][j] = '';1516 }17/*控制⾓⾊向上移动18 map:地图数组*/19void move(int moveX, int moveY)20 {21int i = 0;2223 moveY = moveY * 15;24if (*(playerPosition + (moveX + moveY)) != '@')25 {26if (*(playerPosition + (moveX + moveY)) == '*' )27 {28if (*(playerPosition + 2* (moveX + moveY)) != '@')29 {30if (playerPosition + (moveX + moveY) == boxPosition[0])31 i = 0;32else33 i = 1;34 *boxPosition[i] = '';35 boxPosition[i] += (moveX + moveY);36 *boxPosition[i] = '*';37 *playerPosition = '';38 playerPosition += (moveX + moveY);39 *playerPosition = '8';40 }41 }42else43 {44 *playerPosition = '';45 playerPosition += (moveX+moveY);46 *playerPosition = '8';47 }48 }4950 }51/*输出结果52 map:地图数组53 n: 地图的⾏数54 m: 地图的列数*/55void sc(char map[15][15],int n,int m)56 {57for (int i = 0;i < n;i++)58 {59for (int j = 0;j < m;j++)60 printf("%c ", map[i][j]);61 printf("\n");62 }63 }64/*进⾏重开、跳关、移动的判断,进⼊相应的函数,并传参给相应函数65 map:地图数组*/66char pd(char map[15][15])67 {68char pd;6970 pd = _getch();71switch (pd)72 {73case'w':move(0,-1);break;74case's':move(0, 1);break;75case'a':move(-1, 0);break;76case'd':move(1, 0);break;77case13:return1;break;78case32:return2;79 }80return0;81 }8283/*第⼀关*/84void diyiguan()85 {86int cnt = 0;87char map[15][15],cz;88 boolean isEnd = false, isAgain = false, isNext = false;8990 csh(map, 8, 6);91//⽣成地图92 map[0][1] = map[0][2] = map[0][0] = map[1][0] = map[2][0] = map[3][0] = map[4][0] = map[5][0] = map[6][0] = map[7][0] = map[7][1] = map[7][2] = map[7][3] = map[6][3] = map[5][3] = map[4][3] = map[4][4] = map[4][5] = map[93 map[6][2] = 'O';94 playerPosition = &map[3][1];95 *playerPosition = '8';96 boxPosition[0] = &map[4][2];97 *boxPosition[0] = '*';9899100//开始游戏101 sc(map, 8, 6);102 printf("第⼀关");103while (!isEnd && !isAgain && !isNext)104 {105 cz = pd(map);106 cnt++;107if (map[6][2] == '')108 map[6][2] = 'O';109if (cz == 1) isAgain = true;110if (cz == 2) isNext = true;111 system("cls");112 sc(map, 8, 6);113 printf("已⾛ % d步\n第⼆关, 点击回车重开本关,点击空格跳过本关",cnt);114if (map[6][2] == '*')115 isEnd = true;116 }117 system("cls");118if (cz == 1)119 diyiguan();120121122123 }124/*第⼆关*/125void dierguan()126 {127int cnt = 0;128char map[15][15], cz;129 boolean isEnd = false, isAgain = false, isNext = false;130131 csh(map, 8, 6);132//⽣成地图133for (int i = 0;i <= 5; i++)134 map[0][i] = map[7][i]='@';135for (int i = 0;i <= 7; i++)136 map[i][0] = map[i][5] = '@';137 map[4][4]='@';138 map[6][2] = 'O';139 map[6][4] = 'O';140 playerPosition = &map[3][1];141 *playerPosition = '8';142 boxPosition[0] = &map[4][2];143 *boxPosition[0] = '*';144 boxPosition[1] = &map[3][3];145 *boxPosition[1] = '*';146147148//开始游戏149 sc(map, 8, 6);150 printf("第⼆关");151while (!isEnd && !isAgain && !isNext)152 {153 cz = pd(map);154 cnt++;155if (map[6][2] == '')map[6][2] = 'O';156if (map[6][4] == '')map[6][4] = 'O';157if (cz == 1) isAgain = true;158if (cz == 2) isNext = true;159 system("cls");160 sc(map, 8, 6);161 printf("已⾛%d步\n第⼆关,点击回车重开本关,点击空格跳过本关",cnt); 162if (map[6][2] == '*'&&map[6][4]=='*')163 isEnd = true;164 }165 system("cls");166if (cz == 1)167 dierguan();168 }169170void main()171 {172 diyiguan();173 dierguan();174 printf("\n恭喜你成功通关(这么简单的关卡真的有什么好恭喜的吗?)\n"); 175 }运⾏截图。
C语言完整游戏项目推箱子详细代码
C语⾔完整游戏项⽬推箱⼦详细代码话不多说我们今天就来创造出属于我们⾃⼰的《推箱⼦》,GOGOGO直接开始吧⾸先是我们⽤⼆维数组特定的数字描绘出这个地图int cas = 0;int map[3][8][8] ={1,1,1,1,1,1,1,1,1,3,4,0,0,4,3,1,1,0,1,3,0,1,0,1,1,0,1,4,0,1,0,1,1,0,0,5,0,0,0,1,1,0,1,0,0,1,0,1,1,3,4,0,0,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,0,0,4,3,1,1,0,1,3,0,1,0,1,1,0,1,4,0,1,0,1,1,3,4,5,0,0,0,1,1,0,1,0,0,1,0,1,1,3,4,0,0,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,0,0,4,3,1,1,0,1,3,0,1,0,1,1,0,1,4,0,1,0,1,1,3,4,5,0,4,3,1,1,0,1,0,0,1,0,1,1,3,4,0,0,4,3,1,1,1,1,1,1,1,1,1};然后来绘制我们的推箱⼦地图void drawGraph(){for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){//算贴图的坐标int x = 50 * j;int y = 50 * i;switch (map[cas][i][j]){case 0://⼀个汉字符号占⽤两个位置//printf(" ");putimage(x, y, img + 0);break;case 1:putimage(x, y, img + 1);//printf("■");break;case 3:putimage(x, y, img + 2);//printf("☆");break;case 4:putimage(x, y, img + 3);//printf("★");break;case 5:case 8:putimage(x, y, img + 4);//printf("⼈");break;case 7:putimage(x, y, img + 5);//printf("●");break;}}//printf("\n");}}之后就是我们的游戏函数,怎样去⽤什么按键去控制我们的⾓⾊void keyDown(){int userKey = _getch(); //不可见输⼊//定位:找到⼈的位置int i = 0;int j = 0;for (i = 1; i < 8; i++){for (j = 1; j < 8; j++){if (map[cas][i][j] == 5 || map[cas][i][j] == 8){goto NEXT;}}}NEXT://我们这个游戏⽤什么按键去玩switch (userKey){case 'W':case 'w':case 72:if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3){map[cas][i][j] -= 5;map[cas][i - 1][j] += 5;}if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7){if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3){map[cas][i][j] -= 5;map[cas][i - 1][j] += 1;map[cas][i - 2][j] += 4;}}break;case 's':case 'S':case 80:if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)map[cas][i][j] -= 5;map[cas][i + 1][j] += 5;}if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7) {if (map[cas][i + 2][j] == 0 || map[cas][i +2][j] == 3) {map[cas][i][j] -= 5;map[cas][i + 1][j] += 1;map[cas][i + 2][j] += 4;}}break;case 'a':case 'A':case 75:if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3) {//a+=1 a=a+1 复合赋值运算符map[cas][i][j] -= 5;map[cas][i][j - 1] += 5;}if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7) {if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3) {map[cas][i][j] -= 5;map[cas][i][j - 1] += 1;map[cas][i][j - 2] += 4;}}break;case 'd':case 'D':case 77:if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3) {map[cas][i][j] -= 5;map[cas][i][j + 1] += 5;}if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7) {if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3) {map[cas][i][j] -= 5;map[cas][i][j + 1] += 1;map[cas][i][j + 2] += 4;}}break;}}再然后就是我们如何去判断游戏的结果//胜负的判断:int gameOver(){//地图上没有箱⼦就可以结束for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){if (map[cas][i][j] == 4){return 0;}}}return 1;}最后运⾏我们的主函数就⾏啦int main()loadResource();mciSendString("open 1.mp3", 0, 0, 0);mciSendString("play 1.mp3 repeat", 0, 0, 0);initgraph(50 * 8, 50 * 8);while (1){drawGraph();if (gameOver()){cas++; //变换关卡if(cas==3)break;}keyDown();//system("cls");}closegraph();//printf("GameOver!\n");return 0;}其实代码并不是很多,当然啦,如果同学们想更加完善,可以增加关卡设定,再优化⼀下我们的开始界⾯以及游戏界⾯也是可以的,⼤家快去尝试吧希望看完了的同学可以获得⾃⼰想要的知识,也感谢⼤家的耐⼼观看,在这⾥想得到⼤家⼀波关注,后续UP主还会发布更多的项⽬源码以及学习资料,有什么问题可以回帖留⾔,我尽量回答。