推箱子游戏—c语言实训

合集下载

推箱子C语言程序报告

推箱子C语言程序报告

推箱子C语言程序报告推箱子是一种极富智慧和策略性的游戏,是著名的益智游戏之一、它不仅可以锻炼人们的逻辑思维能力和创造力,而且还能提高人们的解决问题的能力和耐心。

本篇报告将介绍一个基于C语言开发的推箱子游戏,包括游戏规则、程序设计思路和实现效果等方面的内容。

一、游戏规则推箱子游戏的规则十分简单,玩家需要操作一个小人将该场景中的木箱全部推到指定位置。

在游戏开始时,场景中会放置一定数量的木箱和一个小人。

玩家可以通过键盘输入上下左右四个方向键来移动小人,小人可以推动场景中的木箱,但不能直接拉动或推动多个箱子。

当所有的木箱都被推到指定位置时,游戏胜利,反之则失败。

二、程序设计思路推箱子游戏的实现涉及到场景的渲染、小人和木箱的移动、游戏的逻辑判断等多个方面。

下面将分别介绍这些方面的程序设计思路。

1.场景渲染2.小人和木箱的移动玩家操作小人的移动,可以通过监听键盘输入的方向键来实现。

根据输入的方向,判断小人与目标位置的关系,如果目标位置是空地或者指定位置,则小人可以移动到目标位置,否则不能移动。

当小人移动后,如果目标位置是木箱,则需要判断木箱与目标位置的关系,如果目标位置是空地或者指定位置,则木箱可以被推动到目标位置,否则不能推动。

3.游戏逻辑判断在每一次小人移动后,需要判断游戏是否胜利或失败。

胜利的条件是所有的木箱都被推到指定位置,判断的方法是在遍历整个场景时,检查是否存在未推到指定位置的木箱。

失败的条件是小人无法再移动,判断的方法是在判断小人是否能够移动时,如果没有可移动的方向,则游戏失败。

三、实现效果通过以上的程序设计思路,可以开发出一个基于C语言的推箱子游戏。

该游戏可以提供丰富的关卡和难度选择,让玩家能够不断挑战和提高自己的智力。

游戏的界面简洁明了,操作方便快捷,给玩家带来舒适的游戏体验。

总结:推箱子是一种极富智慧的益智游戏,本篇报告介绍了一个基于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、这是本⼈对推箱⼦游戏的见解如果有什么错误请指正以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

推箱子的c语言代码

推箱子的c语言代码

推箱子的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语言-推箱子实验报告

C语言-推箱子实验报告

福建工程学院计算机与信息科学系实验报告2011 – 2012 学年第 1 学期任课老师:聂明星课程名称结构化程序设计班级1002 座号15 姓名林左权实验题目推箱子实验时间实验开始日期:9/15 报告提交日期:9/20实验目的、要求一、实验题目:设计一个简单实用推箱子游戏程序。

二、推箱子游戏介绍推箱子游戏1981年由日本人今林宏行首创,是在1982年12月由Thinking Rabbit 公司首次发行,名“仓库番”。

游戏规则:在设定的游戏地图里面,箱子只可以推, 不可以拉, 而且一次只能推动一个。

胜利条件:把所有的箱子都推到目的地。

1.图1-1 推箱子游戏截图三、程序设计要求:2.地图大小为20*20,‘#’表示墙,‘0’表示箱子,‘*’表示‘人’,‘X’表示空位置,可以放箱子。

初始地图如图2-1所示,光标显示在’*’下方。

图2-1 推箱子初始地图3.使用方向键↑↓←→进行移动,在前进方向上没有墙阻挡时,可以一次移动‘人’(‘*’表示)一格;当‘人’与箱子(‘0’表示)相连接,如果对应方向没有墙‘#’阻挡,按方向键,则可以将箱子推动一格。

4.当‘人’将箱子‘0’推入到空位置‘X’后,‘X’消失。

5.当所有的箱子‘0’被推入箱子,游戏结束,在屏幕输出“You Win!”。

6.游戏过程中按‘空格’键,游戏结束。

7.游戏过程中按‘ESC’键,游戏结束。

实验步骤与内容:1、主要设计思想;(1)用状态数组status[20][20]保存每个坐标的信息,用bioskey函数接受键盘上的按键,以获取信息。

算法思路(当人的四周都没有阻碍的情况下就可以自由行动;当人的相应某个方向上有墙壁的时候,人就不能往相应的方向上行走;当人的相应方向有箱子,箱子的对应方向是墙壁的话也不能推动箱子行走;当人或箱子就在目标地,退出来时候要回复原来目标地的标志X)2、主要数据结构及其解释(1)textcolor(10);/*给标识符的颜色换成浅绿色*/clrscr();/*清屏后才会显示出换色后的图案*/(2)/*保存原来status[20][20]的信息,因为status[20][20]的信息在人移动的时候会改变*/char status1[20][20];(3)/*loop是用来当用户按下空格键的时候从新开始*/loop:goto loop;(4)gotoxy(40,5);/*跳到(40.5)这个坐标*/printf("* stand for people.");/*输出一些控制信息*/。

实验四【程序源码 8-3】推箱子(C版)学生实验讲解

实验四【程序源码 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语言编写的推箱子游戏源代码*//* 本游戏是字符模式的,请不要在中文dos下运行。

本游戏在TURBO C下调试通过*/#include <dos.h>#include <stdio.h>#include <ctype.h>#include <conio.h>#include <bios.h>#include <alloc.h>/* 定义二维数组ghouse来记录屏幕上各点的状态,其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。

*/char ghouse[20][20];/* 以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。

*/char far *screen=(char far* )0xb8000000;void putchxy(int y,int x,char ch,char fc,char bc){screen[(x*160)+(y<<1)+0]=ch;screen[(x*160)+(y<<1)+1]=(bc*16)+fc;}/* 定义判断是否胜利的数据结构*/typedef struct winer {int x,y;struct winer *p;}winer;/* 箱子位置的数据结构*/typedef struct boxs {int x,y;struct boxs *next;}boxs;/* 在特定的坐标上画墙壁并用数组记录状态的函数*/void printwall(int x,int y){putchxy(y-1,x-1,219,GREEN,BLACK);ghouse[x][y]='w';}/* 在特定的坐标上画箱子并用数组记录状态的函数*/void printbox(int x,int y){putchxy(y-1,x-1,10,WHITE,BLACK);ghouse[x][y]='b';}/* 在特定的坐标上画目的地并用数组记录状态的函数*/void printwhither1(int x,int y,winer **win,winer **pw){winer *qw;putchxy(y-1,x-1,'*',YELLOW,BLACK);ghouse[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 printwhither(int x,int y){putchxy(y-1,x-1,'*',YELLOW,BLACK);ghouse[x][y]='m';}/* 在特定的坐标上画人的函数*/void printman(int x,int y){gotoxy(y,x);_AL=02;_CX=01;_AH=0xa;geninterrupt(0x10);}/* 在特定的坐标上画箱子在目的地上并用数组记录状态的函数*/ void printboxin(int x,int y){putchxy(y-1,x-1,10,YELLOW,BLACK);ghouse[x][y]='i';}/* 初始化函数,初始化数组和屏幕*/void init(){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)ghouse[i][j]=0;_AL=3;_AH=0;geninterrupt(0x10);gotoxy(40,4);printf("Welcome to come box world!");gotoxy(40,6);printf("Press up,down,left,right to play.");gotoxy(40,8);printf("Press Esc to quit it.");gotoxy(40,10);printf("Press space to reset the game.");gotoxy(40,12);printf("Producer : wangdehao.");gotoxy(40,14);printf("Mar. 30th 2003."); }/* 第一关的图象初始化*/winer *inithouse1(){int x,y;winer *win=NULL,*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);printwhither1(4+4,2+10,&win,&pw); printwhither1(5+4,2+10,&win,&pw); printwhither1(6+4,2+10,&win,&pw); printman(2+4,8+10);return win;}/* 第三关的图象初始化*/winer *inithouse3(){int x,y;winer *win=NULL,*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(4+4,4+10);printbox(5+4,6+10);printwhither1(2+4,5+10,&win,&pw); printwhither1(2+4,6+10,&win,&pw); printwhither1(2+4,7+10,&win,&pw); printman(2+4,4+10);return win;}/* 第二关的图象初始化*/winer *inithouse2(){int x,y;winer *win=NULL,*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++)printwall(x+4,y+10);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);printwhither1(5+4,7+10,&win,&pw); printwhither1(6+4,7+10,&win,&pw); printwhither1(7+4,7+10,&win,&pw); printman(2+4,6+10);return win;}/* 第四关的图象初始化*/winer *inithouse4(){int x,y;winer *win=NULL,*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);printwhither1(3+4,7+10,&win,&pw); printwhither1(4+4,7+10,&win,&pw); printwhither1(5+4,7+10,&win,&pw); printwhither1(4+4,8+10,&win,&pw); printwhither1(5+4,8+10,&win,&pw); printman(2+4,2+10);return win;}/* 移动在空地上的箱子到空地上*/ movebox(int x,int y,char a){switch(a){case 'u':ghouse[x-1][y]=0;printf(" ");printbox(x-2,y);printman(x-1,y);ghouse[x-2][y]='b';break;case 'd':ghouse[x+1][y]=0;printf(" ");printbox(x+2,y);printman(x+1,y);ghouse[x+2][y]='b';break;case 'l':ghouse[x][y-1]=0;printf(" ");printbox(x,y-2);printman(x,y-1);ghouse[x][y-2]='b';break;case 'r':ghouse[x][y+1]=0;printf(" ");printbox(x,y+2);printman(x,y+1);ghouse[x][y+2]='b';break;default: break;}}/* 移动在目的地上的箱子到空地上*/ moveinbox(int x,int y,char a){switch(a){case 'u':ghouse[x-1][y]='m';printf(" ");printbox(x-2,y);printman(x-1,y);ghouse[x-2][y]='b';break;case 'd':ghouse[x+1][y]='m';printf(" ");printbox(x+2,y);printman(x+1,y);ghouse[x+2][y]='b';break;case 'l':ghouse[x][y-1]='m';printf(" ");printbox(x,y-2);printman(x,y-1);ghouse[x][y-2]='b';break;case 'r':ghouse[x][y+1]='m';printf(" ");printbox(x,y+2);printman(x,y+1);ghouse[x][y+2]='b';break;default: break;}}/* 移动在空地上的箱子到目的地上*/moveboxin(int x,int y,char a){switch(a){case 'u':ghouse[x-1][y]=0;printf(" ");printboxin(x-2,y);printman(x-1,y);ghouse[x-2][y]='i';break;case 'd':ghouse[x+1][y]=0;printf(" ");printboxin(x+2,y);printman(x+1,y);ghouse[x+2][y]='i';break;case 'l':ghouse[x][y-1]=0;printf(" ");printboxin(x,y-2);printman(x,y-1);ghouse[x][y-2]='i';break;case 'r':ghouse[x][y+1]=0;printf(" ");printboxin(x,y+2);printman(x,y+1);ghouse[x][y+2]='i';break;default: break;}}/* 移动在目的地上的箱子到目的地*/ moveinboxin(int x,int y,char a){switch(a){case 'u':ghouse[x-1][y]='m';printf(" ");printboxin(x-2,y);printman(x-1,y);ghouse[x-2][y]='i';break;case 'd':ghouse[x+1][y]='m';printf(" ");printboxin(x+2,y);printman(x+1,y);ghouse[x+2][y]='i';break;case 'l':ghouse[x][y-1]='m';printf(" ");printboxin(x,y-2);printman(x,y-1);ghouse[x][y-2]='i';break;case 'r':ghouse[x][y+1]='m';printf(" ");printboxin(x,y+2);printman(x,y+1);ghouse[x][y+2]='i';break;default: break;}}/* 判断特定的坐标上的状态*/int judge(int x,int y){int i;switch(ghouse[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;}/* 处理按下键盘后,人物移动的主函数*/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){ printwhither(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){movebox(x,y,'u');if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);}else if(judge(x-2,y)==3){ moveboxin(x,y,'u');if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);}else gotoxy(y,x);break;}else if(judge(x-1,y)==4){ if(judge(x-2,y)==1){moveinbox(x,y,'u');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);}else if(judge(x-2,y)==3){ moveinboxin(x,y,'u');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);}else gotoxy(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){ printwhither(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){movebox(x,y,'d');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);}else if(judge(x+2,y)==3){moveboxin(x,y,'d');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);}else gotoxy(y,x);break;}else if(judge(x+1,y)==4){ if(judge(x+2,y)==1){moveinbox(x,y,'d');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);}else if(judge(x+2,y)==3) {moveinboxin(x,y,'d');if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);}else gotoxy(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){ printwhither(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){movebox(x,y,'l');if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);}else if(judge(x,y-2)==3){moveboxin(x,y,'l');if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);}else gotoxy(y,x);break;}else if(judge(x,y-1)==4){ if(judge(x,y-2)==1){moveinbox(x,y,'l');if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);}else if(judge(x,y-2)==3){moveinboxin(x,y,'l');if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);}else gotoxy(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){printwhither(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){movebox(x,y,'r');if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);}else if(judge(x,y+2)==3){moveboxin(x,y,'r');if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);}else gotoxy(y,x);break;}else if(judge(x,y+1)==4){ if(judge(x,y+2)==1){moveinbox(x,y,'r');if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);}else if(judge(x,y+2)==3) {moveinboxin(x,y,'r');if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);}else gotoxy(y,x);break;}default: break;}}/* 按下空格键后,回到本关开头的函数*/ void reset(int i){switch(i){case 0: init();inithouse1();break;case 1: init();inithouse2();break;case 2: init();inithouse3();break;case 3: init();inithouse4();break;default:break;}}/* 主函数main */void main(){int key,x,y,s,i=0;winer *win,*pw;_AL=3;_AH=0;geninterrupt(0x10);init();win=inithouse1();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(ghouse[pw->x][pw->y]=='m') s++;pw=pw->p;}if(s==0){free(win);gotoxy(25,2);printf("congratulate! you did a good job!");getch();i++;switch(i){case 1: init();win=inithouse2();break;case 2: init();win=inithouse3();break;case 3: init();win=inithouse4();break;case 4: gotoxy(15,21);printf("My dear Friend, How smart you are! Welcome to play again!"); key=0x011b;getch();break;default: break;}}}while(key!=0x011b);_AL=3;_AH=0;geninterrupt(0x10);}。

推箱子游戏实践报告

推箱子游戏实践报告

推箱子游戏设计实践报告一、游戏介绍在一定的范围里,要求人把木箱从开始位置推放到指定的位置。

由于箱子只能推不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

该游戏一共有三道关卡,按下F1和F2可以切换关卡,并且通过移动上下左右键来控制小人的移动,从而推动箱子。

当人把箱子全部推到指定的目的地时过关。

附图:二、设计思想程序关键的地方有两部分,一是加载地图,二是用方向键控人的移动。

画地图主要由两个函数来实现,首先用加载位图函数来画出单个图片,然后再用调用加载位图的函数来画出整体的地图。

用方向键控制人的移动时,要注意全面地考虑到各方面的问题,需要详细的分析各种情况。

三、游戏的部分实现(1)加载地图部分程序void drawmap(HWND hWnd,int map[][8])//画地图函数{ HDC hdc;hdc = GetDC(hWnd);RECT rt;GetClientRect(hWnd, &rt);for(int y=0; y<8; y++){ for(int x=0; x<8; x++){switch(mapIndex[y][x]){case 2:drawImage(hdc, "aim.bmp", x * 48,y* 48,48,48);break;case 1:drawImage(hdc,"ground.bmp", x * 48,y* 48,48,48);break;case 0:drawImage(hdc, "wall.bmp", x* 48,y* 48,48,48);break;case 4:drawImage(hdc, "man.bmp", x* 48,y* 48,48,48);break;case 6:case 3:drawImage(hdc, "box.bmp", x* 48,y* 48,48,48);break;}}}ReleaseDC(hWnd, hdc)}voiddrawImage( HDC hdc, char * fileName, int x, int y , int w, int h){HDC srcdc = CreateCompatibleDC(hdc);HBITMAP hbmp = (HBITMAP)LoadImage(NULL, fileName,IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);SelectObject(srcdc, hbmp);BitBlt(hdc, x,y, w,h, srcdc, 0,0, SRCCOPY );DeleteObject(hbmp);DeleteDC(srcdc);}(2)方向键移动部分程序voidkeydown_down(HWND hWnd){switch (mapIndex[humans.y+1][humans.x]){case 0:break;case 1:case 2:humans.y+=1;break;case 3://人的下面为箱子switch (mapIndex[humans.y+2][humans.x]){case 0:case 6:case 3:break;case 1:MoveResult();mapIndex[humans.y+2][humans.x]=3;mapIndex[humans.y+1][humans.x]=1;humans.y+=1;break;case 2:MoveResult();mapIndex[humans.y+2][humans.x]=6;mapIndex[humans.y+1][humans.x]=1;humans.y+=1;break;}break;case 6://箱子在目标上switch (mapIndex[humans.y+2][humans.x]){case 0:break;case 6:break;case 3:break;case 1:MoveResult();mapIndex[humans.y+2][humans.x]=3;mapIndex[humans.y+1][humans.x]=2;humans.y+=1;break;case 2:MoveResult();mapIndex[humans.y+2][humans.x]=6;mapIndex[humans.y+1][humans.x]=2;humans.y+=1;break;}break;}}voidMoveResult(){if(mapIndex[humans.y][humans.x]!=2) {mapIndex[humans.y][humans.x]=1;}else if(mapIndex[humans.y][humans.x]==2){mapIndex[humans.y][humans.x]=2;} }四、测试结果五、设计心得体会在设计这个程序中我主要学会了如何运用以下有关C语言的知识1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。

C语言代码实现推箱子小游戏

C语言代码实现推箱子小游戏

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 来代表游戏界⾯中的每个符号。

C语言推箱子课程设计(附报告)

C语言推箱子课程设计(附报告)

(注:VC运行时,分别新建两个文件BotIt.cpp和Maps.h,再在同一目录下运行其中cpp)代码部分文件“BoxIt.cpp”如下:#include <stdio.h>#include <conio.h>#include <stdlib.h>#include "Maps.h"#define AISLE "" //走廊#define N_AISLE 0#define W ALL "■" //墙壁#define N_W ALL 1#define AIM "※" //未放箱子的目标#define N_AIM 2#define BOX "□" //未在目标位置的箱子#define N_BOX 3#define MAN "♀" //人#define N_MAN 4#define BOX_OK "▢" //■已经在目标位置的箱子[即已放箱子的目标]#define N_BOX_OK 5#define MAN_IN "* "#define N_MAN_IN 6#define ESC 0x1B#define UP 'w'#define DOWN 's'#define LEFT 'a'#define RIGHT 'd'#define RESTART 'r'#define SA VE 'x'#define PF(a) printf("%s",a)struct Point{int x;int y;}man_p;/*小人坐标*///struct Filename{int num;char name[20];}filename[10];//int N;/*存档总人数*/int M;/*关数*/int step;/*步数*/char x;void welcome();void ingame();void playgame(int map[14][16]);/*玩游戏*/void displaymap(int map[14][16]);/*展示当前游戏界面*/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]);/*人移动*/ void movebox(Point box_p,Point boxf_p,int map[14][16]);/*移箱子*/int win(int map[14][16]);/*判断当无※时赢*/void choosemap(int map[14][16],int i);/*选关*/void changemap(int map[14][16],int mapx[14][16]);/*换地图*/void save();/*保存当前*/int read();/*读取存档*/int a=0,b=0,c=0,d=0;//system("color a");int main(){x='0';while(x!='4'){welcome();if(x=='3'&&read()==0) continue;if(x!='4') ingame();}return 0;}void displaymap(int map[14][16]){int i,j;system("cls");printf("\t\t\tMisson %d\n\n",M);for(i=0;i<14;i++){for(j=0;j<16;j++){ switch(map[i][j]){case N_AISLE:PF(" ");break;case N_W ALL:PF(W ALL);break;case N_AIM:PF(AIM);break;case N_BOX:PF(BOX);break;case N_MAN:PF(MAN);break;case N_BOX_OK:PF(BOX_OK);break;case N_MAN_IN:PF(MAN_IN);default:;}}if(i==2) printf("Press the key:");if(i==3) printf("'w'、'a'、's'、'd' to control ♀");if(i==5) printf("'r' to replay");if(i==7) printf("'x' to save");if(i==9) printf("'ESC' back to the menu");if(i==12) printf("Step:%d",step);PF("\n");}}void playgame(int map[14][16]){ int X,Y;Point manf_p,manff_p;//findman(man_p.x,man_p.y,map);displaymap(map);step=0;while(win(map)==0){findman(man_p.x,man_p.y,map);//printf("输入:");switch(getKey()){case DOWN://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;manf_p.y=man_p.y-1,manff_p.y=man_p.y-2;X=0,Y=-1;break;case LEFT://printf("\n左\n");manf_p.x=man_p.x-1;manff_p.x=man_p.x-2;manf_p.y=man_p.y;manff_p.y=man_p.y;X=-1,Y=0;break;case RIGHT://printf("\n右\n");manf_p.x=man_p.x+1;manff_p.x=man_p.x+2;manf_p.y=man_p.y;manff_p.y=man_p.y;X=1,Y=0;break;case SA VE:save();continue;case RESTART:changemap(map,map0);M--;continue;case ESC:system("cls");changemap(map,map0);M=44;continue;default:;}//printf("\n人位置[%d %d]\n",man_p.y,man_p.x);//printf("\n人前方[%d %d]人前前方[%d %d]\n",manf_p.y,manf_p.x,manff_p.y,manff_p.x);switch(getmap(manf_p,map)){case N_AISLE://0case N_AIM://2moveman(man_p,manf_p,X,Y,map);break;case N_BOX://3case N_BOX_OK://5if(getmap(manff_p,map)==N_AISLE||getmap(manff_p,map)==N_AIM){movebox(manf_p,manff_p,map);moveman(man_p,manf_p,X,Y,map);}break;default:;}displaymap(map);}if(M==42) printf("\n\tCongratulation! Pass All!!!\n\n\n\t");}void findman(int &a,int &b,int map[14][16]){int i,j;for(i=0;i<14;i++)for(j=0;j<16;j++)if(map[i][j]==N_MAN||map[i][j]==N_MAN_IN)a=j,b=i;}unsigned char getKey(){unsigned char key;do{key = getch();}while(key != RESTART && key != ESC && key != LEFT && key != RIGHT && key != UP && key != DOWN && key!='x'&& key!=0x1B &&key!='r');return key;}int getmap(Point p,int map[14][16]){//printf("\n前方值%d\n",map[p.y][p.x]);return map[p.y][p.x];}void moveman(Point man_p,Point manf_p,int X,int Y,int map[14][16]){map[manf_p.y][manf_p.x]=(map[manf_p.y][manf_p.x]==N_AIM||map[manf_p.y][manf_p.x]==N_BOX _OK)?N_MAN_IN:N_MAN;map[man_p.y][man_p.x]=map[man_p.y][man_p.x]==N_MAN_IN?N_AIM:N_AISLE; //printf("\n移动后—小人位置值%d\n",map[manf_p.y][manf_p.x]);//printf("\n移动后—原小人位置值%d\n",map[man_p.y][man_p.x]);man_p.x+=X,man_p.y+=Y;step++;}void movebox(Point box_p,Point boxf_p,int map[14][16]){map[boxf_p.y][boxf_p.x]=map[boxf_p.y][boxf_p.x]==N_AISLE?N_BOX:N_BOX_OK; map[box_p.y][box_p.x]=map[box_p.y][box_p.x]==N_BOX?N_AISLE:N_AIM;}int win(int map[14][16]){int i,j;for(i=0;i<14;i++)for(j=0;j<16;j++)if(map[i][j]==2||map[i][j]==6)return 0;return 1;}void choosemap(int map[14][16],int i){switch(i){case 1:changemap(map,map1);break;case 2:changemap(map,map2);break;case 3:changemap(map,map3);break;case 4:changemap(map,map4);break;case 5:changemap(map,map5);break;case 6:changemap(map,map6);break;case 7:changemap(map,map7);break;case 8:changemap(map,map8);break;case 9:changemap(map,map9);break;case 10:changemap(map,map10);break;case 11:changemap(map,map11);break;case 12:changemap(map,map12);break;case 13:changemap(map,map13);break;case 14:changemap(map,map14);break;case 15:changemap(map,map15);break;case 16:changemap(map,map16);break;case 17:changemap(map,map17);break;case 18:changemap(map,map18);break;case 19:changemap(map,map19);break;case 20:changemap(map,map20);break;case 21:changemap(map,map21);break;case 22:changemap(map,map22);break;case 23:changemap(map,map23);break;case 24:changemap(map,map24);break;case 25:changemap(map,map25);break;case 26:changemap(map,map26);break;case 27:changemap(map,map27);break;case 28:changemap(map,map28);break;case 29:changemap(map,map29);break;case 30:changemap(map,map30);break;case 31:changemap(map,map31);break;case 32:changemap(map,map32);break;case 33:changemap(map,map33);break;case 34:changemap(map,map34);break;case 35:changemap(map,map35);break;case 36:changemap(map,map36);break;case 37:changemap(map,map37);break;case 38:changemap(map,map38);break;case 39:changemap(map,map39);break;case 40:changemap(map,map40);break;case 41:changemap(map,map41);break;case 42:changemap(map,map42);break;default:;}}void changemap(int map[14][16],int mapx[14][16]) {int i,j;for(i=0;i<14;i++)for(j=0;j<16;j++)map[i][j]=mapx[i][j];}void save(){int i,j;FILE *in;/*char filename[10][20];printf("put in the filename:");scanf("%s",filename);*/if((in=fopen("save game","w"))==NULL){printf("cannot open this file\n");exit(0);}for(i=0;i<14;i++)for(j=0;j<16;j++)fwrite(&map[i][j],sizeof(int),1,in);fwrite(&M,sizeof(int),1,in);fwrite(&step,sizeof(int),1,in);printf("\nGame Misson %d saved!\n",M);system("pause");fclose(in);}int read(){int i,j;FILE *out;/*char filename[10][20];printf("put in the filename:");scanf("%s",filename);*/if((out=fopen("save game","r"))==NULL){printf("\ncannot open this file\n");return 0;}else{for(i=0;i<14;i++)for(j=0;j<16;j++)fread(&map[i][j],sizeof(int),1,out);fread(&M,sizeof(int),1,out);fread(&step,sizeof(int),1,out);printf("\nM=%d\n",M);printf("Game read!\n");fclose(out);return 1;}}void welcome(){printf("\t\t ♀Box It \n");printf("\t\t1:New Game.\n\t\t2:Select Misson.\n\t\t3:Read Record.\n\t\t4:Exit Game.\n Choose-- ");switch(x=getch()){case '1':printf("1:");M=1;choosemap(map,M);break;case '2':printf("2:");printf("1-42 Misson to Choose:");scanf("%d",&M);choosemap(map,M);break;case '3':printf("3:");if(read()==1) printf("\n%d misson opened\n",M);break;case '4':printf("4:Exit Game.\n\n"); break;default:printf("Not 1-4\n");}}void ingame(){while(M<43){playgame(map);step=0;M++;choosemap(map,M);}}文件“Maps.h”如下:int map[14][16];int map0[14][16]={{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,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,4,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,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 map1[14][16]={{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}, };int map2[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0}, {0,0,0,1,4,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,1,0,3,3,1,0,1,1,1,0,0,0,0}, {0,0,0,1,0,3,0,1,0,1,2,1,0,0,0,0}, {0,0,0,1,1,1,0,1,1,1,2,1,0,0,0,0}, {0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0}, {0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0}, {0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0}, {0,0,0,0,1,1,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}, };int map3[14][16]={{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,1,1,1,1,0,0,0,0,0}, {0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0}, {0,0,0,1,1,3,1,1,1,0,0,0,1,0,0,0},{0,0,0,1,0,2,2,1,0,3,0,1,1,0,0,0}, {0,0,0,1,1,2,2,1,0,0,0,1,0,0,0,0}, {0,0,0,0,1,1,1,1,1,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}, };int map4[14][16]={{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,1,0,0,0,0,0,0,0,0}, {0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,1,4,3,0,1,0,0,0,0,0,0,0,0}, {0,0,0,1,1,3,0,1,1,0,0,0,0,0,0,0}, {0,0,0,1,1,0,3,0,1,0,0,0,0,0,0,0}, {0,0,0,1,2,3,0,0,1,0,0,0,0,0,0,0}, {0,0,0,1,2,2,5,2,1,0,0,0,0,0,0,0}, {0,0,0,1,1,1,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}, };int map5[14][16]={{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,1,1,0,0,0,0,0,0,0}, {0,0,0,0,1,4,0,1,1,1,0,0,0,0,0,0}, {0,0,0,0,1,0,3,0,0,1,0,0,0,0,0,0}, {0,0,0,1,1,1,0,1,0,1,1,0,0,0,0,0}, {0,0,0,1,2,1,0,1,0,0,1,0,0,0,0,0}, {0,0,0,1,2,3,0,0,1,0,1,0,0,0,0,0}, {0,0,0,1,2,0,0,0,3,0,1,0,0,0,0,0}, {0,0,0,1,1,1,1,1,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}, };int map6[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0},{0,1,0,0,0,2,1,1,1,0,1,0,0,0,0,0}, {0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0}, {0,1,0,1,0,3,0,3,1,2,0,1,0,0,0,0}, {0,1,0,1,0,0,5,0,0,1,0,1,0,0,0,0}, {0,1,0,2,1,3,0,3,0,1,0,1,0,0,0,0}, {0,1,1,0,0,0,0,1,0,1,0,1,1,1,0,0}, {0,0,1,0,1,1,1,2,0,0,0,0,4,1,0,0}, {0,0,1,0,0,0,0,0,1,1,0,0,0,1,0,0}, {0,0,1,1,1,1,1,1,1,1,1,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}, };int map7[14][16]={{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,1,1,1,1,1,0,0}, {0,0,0,0,0,0,1,1,0,0,1,0,4,1,0,0}, {0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0}, {0,0,0,0,0,0,1,3,0,3,0,3,0,1,0,0}, {0,0,0,0,0,0,1,0,3,1,1,0,0,1,0,0},{0,0,0,0,1,2,2,2,2,2,0,0,1,1,0,0}, {0,0,0,0,1,1,1,1,1,1,1,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}, };int map8[14][16]={{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,1,1,1,0,0,0,0}, {0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,0}, {0,0,0,1,1,2,0,3,1,1,0,1,1,0,0,0}, {0,0,0,1,2,2,3,0,3,0,0,4,1,0,0,0}, {0,0,0,1,2,2,0,3,0,3,0,1,1,0,0,0}, {0,0,0,1,1,1,1,1,1,0,0,1,0,0,0,0}, {0,0,0,0,0,0,0,0,1,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},};int map9[14][16]={{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,1,1,1,1,1,1,0,0,0,0}, {0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0}, {0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,0}, {0,0,0,1,3,0,1,1,1,0,3,1,0,0,0,0}, {0,0,0,1,0,1,2,2,2,1,0,1,0,0,0,0}, {0,0,1,1,0,1,2,2,2,1,0,1,1,0,0,0}, {0,0,1,0,3,0,0,3,0,0,3,0,1,0,0,0}, {0,0,1,0,0,0,0,0,1,0,4,0,1,0,0,0}, {0,0,1,1,1,1,1,1,1,1,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}, };int map10[14][16]={{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,0,0,0,0,1,0,0,0,0}, {0,0,0,0,1,1,1,3,3,3,0,1,0,0,0,0}, {0,0,0,0,1,4,0,3,2,2,0,1,0,0,0,0}, {0,0,0,0,1,0,3,2,2,2,1,1,0,0,0,0}, {0,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0}, {0,0,0,0,0,0,0,1,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}, };int map11[14][16]={{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,1,0,0,1,1,1,1,1,0,0}, {0,0,1,1,0,0,1,0,0,1,0,0,0,1,0,0}, {0,0,1,0,3,0,1,1,1,1,3,0,0,1,0,0}, {0,0,1,0,0,3,2,2,2,2,0,3,0,1,0,0}, {0,0,1,1,0,0,0,0,1,0,4,0,1,1,0,0}, {0,0,0,1,1,1,1,1,1,1,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}, };int map12[14][16]={{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,1,1,0,0,0,0,0}, {0,0,0,0,1,1,1,0,0,4,1,0,0,0,0,0}, {0,0,0,0,1,0,0,3,2,0,1,1,0,0,0,0}, {0,0,0,0,1,0,0,2,3,2,0,1,0,0,0,0}, {0,0,0,0,1,1,1,0,5,3,0,1,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0}, {0,0,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };int map13[14][16]={{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,1,0,0,0,0,0,0,0}, {0,0,0,0,0,1,2,2,1,0,0,0,0,0,0,0}, {0,0,0,0,1,1,0,2,1,1,0,0,0,0,0,0}, {0,0,0,0,1,0,0,3,2,1,0,0,0,0,0,0}, {0,0,0,1,1,0,3,0,0,1,1,0,0,0,0,0}, {0,0,0,1,0,0,1,3,3,0,1,0,0,0,0,0}, {0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,0}, {0,0,0,1,1,1,1,1,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}, };int map14[14][16]={{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,1,1,1,1,1,0,0,0,0,0}, {0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0}, {0,0,0,1,0,3,2,2,3,0,1,0,0,0,0,0},{0,0,0,1,0,3,2,2,3,0,1,0,0,0,0,0}, {0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0}, {0,0,0,1,1,1,1,1,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}, };int map15[14][16]={{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,1,1,1,1,1,0,0,0,0}, {0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0}, {0,0,0,0,1,0,3,0,3,3,0,1,0,0,0,0}, {0,0,0,0,1,2,2,2,2,2,2,1,0,0,0,0}, {0,0,0,0,1,0,3,3,0,3,0,1,0,0,0,0}, {0,0,0,0,1,1,1,0,4,1,1,1,0,0,0,0}, {0,0,0,0,0,0,1,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}, };int map16[14][16]={{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,1,1,1,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0}, {0,0,0,0,0,0,1,0,3,0,0,0,0,1,0,0}, {0,0,0,0,1,1,1,0,3,0,1,1,0,1,0,0}, {0,0,0,0,1,2,2,2,0,3,0,0,0,1,0,0}, {0,0,0,0,1,2,2,2,3,1,3,0,1,1,0,0}, {0,0,0,0,1,1,1,1,0,1,0,3,0,1,0,0}, {0,0,0,0,0,0,0,1,0,0,4,0,0,1,0,0}, {0,0,0,0,0,0,0,1,1,1,1,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}, };int map17[14][16]={{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,1,1,1,0,0,0,0,0,0}, {0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0}, {0,0,0,0,1,0,3,3,3,1,1,0,0,0,0,0}, {0,0,0,0,1,0,0,1,2,2,1,1,1,0,0,0}, {0,0,0,0,1,1,0,0,2,2,3,0,1,0,0,0}, {0,0,0,0,0,1,0,4,0,0,0,0,1,0,0,0}, {0,0,0,0,0,1,1,1,1,1,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}, };int map18[14][16]={{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,1,1,1,1,1,0,0,0}, {0,0,0,0,0,1,0,0,0,1,2,0,1,0,0,0}, {0,0,0,0,1,1,0,0,3,2,2,2,1,0,0,0}, {0,0,0,0,1,0,0,3,0,1,5,2,1,0,0,0}, {0,0,0,1,1,0,1,1,3,1,0,1,1,0,0,0}, {0,0,0,1,0,0,0,3,0,0,3,0,1,0,0,0},{0,0,0,1,1,1,1,1,1,1,4,0,1,0,0,0}, {0,0,0,0,0,0,0,0,0,1,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}, };int map19[14][16]={{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,1,1,1,1,0,0,0,0,0}, {0,0,0,0,1,2,2,2,2,0,1,0,0,0,0,0}, {0,0,0,1,1,1,2,2,2,3,1,1,1,0,0,0}, {0,0,0,1,0,0,3,1,3,0,3,0,1,0,0,0}, {0,0,0,1,0,3,3,0,0,1,3,0,1,0,0,0}, {0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0}, {0,0,0,1,1,1,1,0,4,0,1,1,1,0,0,0}, {0,0,0,0,0,0,1,1,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},};int map20[14][16]={{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,1,1,1,1,0,0,0,0,0}, {0,0,0,0,1,2,2,3,2,2,1,0,0,0,0,0}, {0,0,0,0,1,2,2,1,2,2,1,0,0,0,0,0}, {0,0,0,0,1,0,3,3,3,0,1,0,0,0,0,0}, {0,0,0,0,1,0,0,3,0,0,1,0,0,0,0,0}, {0,0,0,0,1,0,3,3,3,0,1,0,0,0,0,0}, {0,0,0,0,1,0,0,1,4,0,1,0,0,0,0,0}, {0,0,0,0,1,1,1,1,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}, };int map21[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0}, {0,0,0,0,0,1,0,2,2,2,1,0,0,0,0,0}, {0,0,1,1,1,1,2,2,2,2,1,0,0,0,0,0},{0,0,1,0,3,0,3,0,0,3,3,0,1,0,0,0}, {0,0,1,0,0,3,0,3,0,0,0,0,1,0,0,0}, {0,0,1,4,0,0,1,1,1,0,0,0,1,0,0,0}, {0,0,1,1,1,1,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0}, };int map22[14][16]={{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,1,1,1,1,1,0,0,0,0,0,0}, {0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0}, {0,0,1,0,1,3,3,0,0,1,0,0,0,0,0,0}, {0,0,1,0,2,2,2,1,0,1,0,0,0,0,0,0}, {0,0,1,1,2,2,2,3,0,1,1,0,0,0,0,0}, {0,0,0,1,0,1,1,0,3,0,1,0,0,0,0,0}, {0,0,0,1,3,0,0,3,0,0,1,0,0,0,0,0}, {0,0,0,1,0,0,1,4,0,0,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}, };int map23[14][16]={{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,1,1,0,0,0,0,0}, {0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0}, {0,0,0,0,1,0,0,0,3,0,3,0,0,1,0,0}, {0,0,0,0,1,0,3,0,0,0,3,0,4,1,0,0}, {0,0,0,0,1,1,1,3,3,1,1,1,1,1,0,0}, {0,0,0,0,0,0,1,0,0,2,2,1,0,0,0,0}, {0,0,0,0,0,0,1,2,2,2,2,1,0,0,0,0}, {0,0,0,0,0,0,1,1,1,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}, };int map24[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0}, {1,0,0,0,0,1,1,1,0,1,0,0,2,1,0,0}, {1,0,0,3,0,3,0,1,0,1,2,2,2,1,0,0}, {1,0,1,0,0,3,0,1,1,1,0,0,2,1,0,0}, {1,0,0,3,3,3,0,0,0,3,0,4,2,1,0,0}, {1,1,1,0,0,3,0,0,3,1,0,0,2,1,0,0}, {0,0,1,0,0,3,1,3,0,1,2,2,2,1,0,0}, {0,0,1,1,0,0,0,0,0,1,0,0,2,1,0,0}, {0,0,0,1,1,1,1,1,1,1,1,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}, };int map25[14][16]={{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,1,1,1,0,0,0}, {0,0,0,1,1,1,1,1,2,0,0,0,1,0,0,0}, {0,0,0,1,0,0,1,2,2,1,1,0,1,0,0,0}, {0,0,0,1,0,0,3,2,2,0,0,0,1,0,0,0}, {0,0,0,1,0,0,1,0,2,1,0,1,1,0,0,0},{0,0,1,0,3,0,0,0,0,3,3,0,1,0,0,0}, {0,0,1,0,1,3,1,0,0,1,0,0,1,0,0,0}, {0,0,1,4,0,0,1,1,1,1,1,1,1,0,0,0}, {0,0,1,1,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}, };int map26[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, {0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0}, {0,0,1,0,3,0,0,0,0,0,0,0,0,1,0,0}, {0,0,1,1,3,1,1,1,0,1,1,0,0,1,0,0}, {0,0,1,0,0,1,1,0,5,0,1,0,1,1,0,0}, {0,0,1,0,3,2,2,2,2,2,2,0,1,0,0,0}, {0,1,1,0,1,1,1,0,2,0,1,0,1,0,0,0}, {0,1,0,0,0,0,0,3,1,1,1,3,1,0,0,0}, {0,1,0,0,0,1,0,0,0,0,3,4,1,0,0,0}, {0,1,1,1,1,1,3,1,0,1,1,1,1,0,0,0}, {0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };int map27[14][16]={{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0}, {0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0}, {0,0,0,0,0,0,1,0,0,3,0,3,1,0,1,0}, {1,1,1,1,1,1,1,0,0,0,3,0,0,0,1,0}, {1,2,2,1,0,0,1,1,0,3,0,3,1,0,1,0}, {1,2,2,0,0,0,1,1,0,3,0,3,0,0,1,0}, {1,2,2,1,0,0,1,1,0,1,1,1,1,1,1,0}, {1,2,2,1,0,1,0,3,0,3,0,1,0,0,0,0}, {1,2,2,0,0,0,0,0,3,0,0,1,0,0,0,0}, {1,0,0,1,1,1,0,4,0,1,1,1,0,0,0,0}, {1,1,1,1,0,1,1,1,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}, };int map28[14][16]={{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0},{1,0,0,0,3,0,0,1,0,1,5,2,5,2,5,1}, {1,1,0,3,0,3,0,1,1,1,2,5,2,5,2,1}, {1,1,3,0,3,0,0,1,0,0,5,2,5,2,5,1}, {1,1,4,3,0,3,0,0,0,0,2,5,2,5,1,1}, {1,1,3,0,3,0,0,1,0,0,5,2,5,2,5,1}, {1,1,0,3,0,3,0,1,1,1,2,5,2,5,2,1}, {1,0,0,0,3,0,0,1,0,1,5,2,5,2,5,1}, {1,0,0,3,0,3,0,1,0,1,1,1,1,1,1,1}, {1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,1,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}, };int map29[14][16]={{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,1,1,1,1,1,0,0,0,0}, {0,0,0,0,1,2,2,2,2,2,2,1,0,0,0,0}, {0,0,0,0,1,0,0,3,0,1,0,1,1,0,0,0}, {0,0,0,0,1,0,3,0,1,0,3,0,1,0,0,0},{0,0,0,0,1,1,3,0,3,0,3,0,1,0,0,0}, {0,0,0,0,0,1,0,0,4,0,0,0,1,0,0,0}, {0,0,0,0,0,1,1,1,1,1,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}, };int map30[14][16]={{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,1,1,1,1,1,1,1,0}, {0,0,0,1,1,1,0,0,0,2,0,0,0,0,1,0}, {0,0,0,1,0,0,0,1,1,3,1,1,0,0,1,0}, {0,0,0,1,0,4,3,2,0,2,0,2,3,1,1,0}, {0,0,0,1,1,0,3,1,1,3,1,1,0,1,0,0}, {0,0,0,0,1,0,0,0,0,2,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,1,1,1,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},};int map31[14][16]={{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,1,1,1,0,0,0}, {0,0,0,0,1,1,1,1,2,0,0,4,1,0,0,0}, {0,0,0,0,1,0,0,3,3,3,0,0,1,0,0,0}, {0,0,0,0,1,2,1,1,2,1,1,2,1,0,0,0}, {0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0}, {0,0,0,0,1,0,0,3,2,1,0,1,1,0,0,0}, {0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0}, {0,0,0,0,0,0,0,1,1,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}, };int map32[14][16]={{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,1,1,1,0,0,0,0,0},{0,0,0,0,0,1,2,0,3,2,1,0,0,0,0,0}, {0,0,0,0,1,1,1,0,0,3,1,1,0,0,0,0}, {0,0,0,0,1,0,3,0,0,3,0,1,0,0,0,0}, {0,0,0,0,1,0,1,3,1,1,0,1,0,0,0,0}, {0,0,0,0,1,0,0,0,4,0,0,1,0,0,0,0}, {0,0,0,0,1,1,1,1,1,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}, };int map33[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0}, {0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0}, {0,0,1,0,0,0,1,3,0,0,0,1,1,1,0,0}, {0,0,1,0,0,0,3,0,0,0,3,3,0,1,0,0}, {0,0,1,0,3,3,0,1,3,0,0,0,0,1,0,0}, {0,0,1,1,0,0,0,3,0,0,0,3,0,1,0,0}, {1,1,1,1,1,1,0,1,3,1,1,1,1,1,0,0}, {1,2,2,4,0,1,3,0,0,1,0,0,0,0,0,0}, {1,2,1,2,2,0,0,3,1,1,0,0,0,0,0,0},{1,2,2,2,2,0,0,0,1,0,0,0,0,0,0,0}, {1,1,1,1,1,1,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}, };int map34[14][16]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0}, {1,0,3,0,1,3,0,1,0,3,1,1,3,0,1,0}, {1,0,1,0,0,3,0,1,0,0,0,0,0,0,1,0}, {1,0,0,0,1,1,3,1,3,1,1,3,3,0,1,0}, {1,0,1,0,1,0,2,2,2,0,1,0,0,0,1,0}, {1,0,3,0,0,2,0,1,0,2,3,0,1,0,1,0}, {1,0,3,1,4,3,2,2,2,1,0,1,0,0,1,0}, {1,0,0,0,0,2,0,1,0,2,0,0,3,0,1,0}, {1,0,1,1,2,3,1,1,1,3,2,0,1,0,1,0}, {1,0,1,0,3,2,2,2,2,2,0,1,1,0,1,0}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };int map35[14][16]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0}, {0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0}, {0,0,0,1,0,1,0,3,0,3,0,1,0,0,0,0}, {0,0,0,1,0,0,5,2,1,0,0,1,0,0,0,0}, {0,0,0,1,1,0,1,2,4,2,1,1,0,0,0,0}, {0,0,0,1,1,3,1,1,1,5,1,1,1,0,0,0}, {0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0}, {0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0}, {0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0}, {0,0,0,0,0,0,0,0,1,1,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}, };int map36[14][16]={{1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {1,0,3,3,0,0,0,1,1,1,0,0,0,0,0,0}, {1,0,0,3,0,3,3,3,0,1,1,1,1,1,0,0}, {1,1,0,1,1,0,2,2,2,0,0,0,0,1,1,0}, {0,1,0,1,4,1,2,2,2,1,1,1,3,0,1,0},{1,1,0,1,0,3,2,2,2,3,0,1,0,1,1,0}, {1,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0}, {1,0,0,0,0,0,0,3,0,0,0,3,0,1,0,0}, {1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0}, {0,0,0,0,0,0,0,0,0,0,1,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}, };int map37[14][16]={{0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0}, {0,1,2,2,1,0,0,0,0,0,0,1,2,2,1,0}, {0,1,2,2,1,1,1,1,1,1,1,1,2,2,1,0}, {0,1,0,3,0,2,2,2,2,2,2,3,2,3,1,0}, {0,1,3,0,3,0,3,0,3,0,3,0,3,0,1,0}, {0,1,0,3,0,3,0,3,4,3,0,3,0,3,1,0}, {0,1,3,0,3,0,3,0,3,0,3,0,3,0,1,0}, {0,1,0,3,0,3,0,3,0,3,0,3,0,3,1,0}, {0,1,3,2,3,2,2,2,2,2,2,0,3,0,1,0}, {0,1,2,2,1,1,1,1,1,1,1,1,2,2,1,0}, {0,1,2,2,1,0,0,0,0,0,0,1,2,2,1,0}, {0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0},。

推箱子游戏课程设计c

推箱子游戏课程设计c

推箱子游戏课程设计c一、教学目标本课程旨在通过推箱子游戏的学习,让学生掌握游戏规则、策略,培养学生的逻辑思维、空间想象力及问题解决能力。

具体目标如下:1.知识目标:学生能理解并掌握推箱子游戏的规则,知道如何通过操作使角色推动箱子到达目标位置。

2.技能目标:学生能够运用逻辑思维和空间想象力,设计出将箱子推到目标位置的步骤和方法。

3.情感态度价值观目标:学生在游戏中体会到解决问题带来的成就感,增强自信心,培养面对挑战的勇气。

二、教学内容本课程的教学内容主要包括以下几个部分:1.推箱子游戏规则的讲解:介绍游戏的基本规则,让学生明白如何进行游戏。

2.游戏策略的探讨:引导学生思考如何通过操作达到目标,培养学生的问题解决能力。

3.游戏实践:学生亲自操作进行游戏,巩固所学知识和技能。

4.游戏拓展:引导学生思考如何优化解题步骤,提高解题效率。

三、教学方法为了提高教学效果,本课程将采用以下几种教学方法:1.讲授法:教师讲解游戏规则和基本策略。

2.案例分析法:分析具体游戏案例,引导学生思考和探讨。

3.实验法:学生亲自操作进行游戏,实践所学知识。

4.讨论法:分组讨论,分享解题心得和经验。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《推箱子游戏教程》。

2.参考书:提供一些与推箱子游戏相关的书籍,供学生课后拓展阅读。

3.多媒体资料:制作课件、视频等,辅助教学。

4.实验设备:提供推箱子游戏道具,让学生亲身体验游戏过程。

五、教学评估为了全面、客观地评估学生在推箱子游戏课程中的学习成果,我们将采用以下评估方式:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,了解学生的学习态度和实际操作能力。

2.作业完成情况:评估学生完成作业的质量,包括游戏策略的设计、解题步骤的合理性等。

3.考试:设置有关推箱子游戏的知识和技能的考试,测试学生对课程内容的掌握程度。

4.游戏比赛:推箱子游戏比赛,评估学生在实际操作中的表现,培养学生的团队协作能力和竞争意识。

推箱子游戏实习报告书

推箱子游戏实习报告书

信息工程学院数据结构与C语言综合训练报告(2012~2013学年第二学期)报告题目:____推箱子的最短路径_ __姓名:_ __ 程榜____专业:软件工程年级班级:___2012级2班___指导教师:刘全中完成日期: 2013年7月21号一、综合训练目的和要求本综合训练是计算机科学与技术、信息管理与信息系统、软件工程、电子商务专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。

本课综合训练的目的和任务:1. 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言、数据结构解决实际问题的能力二、综合训练任务内容1.题目要求:推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个5×5的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.同时,房间里头还有若干障碍物(用阴影部分表示)。

现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.2.扩展实现的内容:绘制图形界面,通过按钮实现推箱子的整个过程,整个过程中可以动态的看到箱子的移动。

游戏界面如下图:游戏动态移动的过程图如下:三、总体设计所用算法主要是根据广度优先搜索,纪录路径,然后利用回溯法实现最短路径的查找并纪录保存下来。

所用的数据结构主要为顺序结构。

四、详细设计说明1、推箱子游戏具有的功能(1)能够显示主菜单和界面游戏需要提供主菜单进行选择,同时能够把地图文件中的信息转换成为图像显示到游戏界面上。

(2)能够实现键盘操作功能能够接收到空格键信息,按照软件内部实现的箱子移动到相应的位置。

c语言实验报告

c语言实验报告

武汉大学2012级C语言及程序设计基础上机实验大作业报告推箱子参与人员[姓名:郑燕青] [学号:2012301500014] [分工:move及show函数] [姓名:王瑶] [学号:2012301500014] [分工:主函数]一、【实验内容】:1.设计一个简单实用推箱子游戏程序。

2. 【开发工具】:Dev-C++ 4.9.9.2二、【推箱子游戏介绍】经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。

在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

记得几年前,《推箱子》在PC机上刮起了一股不小的益智类游戏的旋风,现在许多资深玩家也都对《推箱子》赞不绝口,可见有深度的益智类游戏是非常受大家欢迎的。

推箱子游戏1981年由日本人今林宏行首创,是在1982年12月由Thinking Rabbit 公司首次发行,名“仓库番”。

箱子只可以推, 不可以拉, 而且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。

游戏规则:在设定的游戏地图里面,箱子只可以推, 不可以拉, 而且一次只能推动一个。

胜利条件:把所有的箱子都推到目的地。

三、【程序设计要求】:1.地图大小为9*9,,,,。

初始地图如图所示,光标显示在地图下方。

2.使用方向键w,s,a,d代表上,下,左,右方向进行移动,在前进方向上没有墙阻挡时,可以一次移动一格;当与相连接,如果对应方向没有阻挡,按方向键,则可以将箱子推动一格。

3.当将推入到空位置后,消失,被代替。

4.当所有的被推入,游戏结束,屏幕将输出代表胜利的语段。

5.游戏过程中按p键,结束本关,重新选关。

6.游戏过程中按k键,退出程序。

四.【实验步骤与内容】1.用状态数组map[9][9]保存每个坐标的信息,算法思路(当人的四周都没有阻碍的情况下就可以自由行动;当人的相应某个方向上有墙壁的时候,人就不能往相应的方向上行走;当人的相应方向有箱子,箱子的对应方向是墙壁的话也不能推动箱子行走;当人或箱子就在目标地,退出来时候要回复原来目标地的标志)2.主要数据结构及其解释1)头文件及宏定义#include<stdio.h>#include<stdlib.h>#define X 6#define Y 1#define XX 2#define YY 6#define XXX 7#define YYY 42)几个副函数/*输出函数*/void show(char map1[9][9],int level)/*移动函数*/int move(char map2[9][9],int *x,int *y)3)/*判断输入的数据类型是否正确*/while(scanf("%d",&level)!=1){while(getchar()!='\n');system("cls");printf("\n\n 输入数据类型有误,请重新输入\n");printf("\n 本游戏分3关,请选择关卡(0--结束程序退出,1--第一关,2--第二关,3--第三关):");}4)/*移动循环*/for(choice=2;choice=2;){choice=move(map,&x,&y);if(choice==0) break;/*判断是否放弃当前游戏,重新选关*/else if(choice==1) return 0;/*判断是否结束程序,退出*/else if(choice==2)/*判断是否继续游戏*/show(map,level);if(map[X][Y]==5)/*判断是否闯关成功*/{printf("\n\n 亲,恭喜闯过第一关!!!你真聪明!!!继续加油哦!!!!\n\n\n\n");system("PAUSE”);break;/*跳出移动循环,重新选关*/}}5)/*输出地图*/for(i=0;i<9;i++){printf("\n ");for(k=0;k<9;k++){printf(" %c ",map1[i][k]);}}6)/*a--左移*/if(inputdata=='a'){if(map2[*x][*y-1]=='#')/*1、人遇到墙*/{}else{if(map2[*x][*y-1]==5&&map2[*x][*y-2]==0)/*2、推箱子进空地*/{map2[*x][*y]=0;*y-=1;map2[*x][*y]=1;map2[*x][*y-1]=5;}else if(map2[*x][*y-1]==5&&map2[*x][*y-2]==3)/*3、推箱子进目的地*/{map2[*x][*y]=0;*y-=1;map2[*x][*y]=1;map2[*x][*y-1]=5;}else{if(map2[*x][*y-1]==5&&map2[*x][*y-2]=='#')/*4、推箱子遇到墙,推不动*/{}else{if(map2[*x][*y-1]==3)/*5、人进到目的地*/{map2[*x][*y]=0;*y-=1;map2[*x][*y]=1;}else{if(map2[*x][*y]==map2[X][Y]||map2[*x][*y]==map2[XX][YY]||map2[*x][*y]==map2[XXX][YYY])/*6、人退出目的地*/{map2[*x][*y]=3;*y-=1;map2[*x][*y]=1;}else /*7、人进入空地*/{map2[*x][*y]=0;*y-=1;map2[*x][*y]=1;}}}}}}7)/*s--下移*/if(inputdata=='s'){if(map2[*x+1][*y]=='#')/*1、人遇到墙*/{}else{if(map2[*x+1][*y]==5&&map2[*x+2][*y]==0)/*2、推箱子进空地*/{map2[*x][*y]=0;*x+=1;map2[*x][*y]=1;map2[*x+1][*y]=5;}else if(map2[*x+1][*y]==5&&map2[*x+2][*y]==3)/*3、推箱子进目的地*/{map2[*x][*y]=0;*x+=1;map2[*x][*y]=1;map2[*x+1][*y]=5;}else{if(map2[*x+1][*y]==5&&map2[*x+2][*y]=='#')/*4、推箱子遇到墙,推不动*/{}else{if(map2[*x+1][*y]==3)/*5、人进到目的地*/{map2[*x][*y]=0;*x+=1;map2[*x][*y]=1;}else{if(map2[*x][*y]==map2[X][Y]||map2[*x][*y]==map2[XX][YY]||map2[*x][*y]==map2[XXX][YYY])/*6、人退出目的地*/{map2[*x][*y]=3;*x+=1;map2[*x][*y]=1;}else /*7、人进入空地*/{map2[*x][*y]=0;*x+=1;map2[*x][*y]=1;}}}}}}8)/*w--上移*/if(inputdata=='w'){if(map2[*x-1][*y]=='#')/*1、人遇到墙*/{}else{if(map2[*x-1][*y]==5&&map2[*x-2][*y]==0)/*2、推箱子进空地*/{map2[*x][*y]=0;*x-=1;map2[*x][*y]=1;map2[*x-1][*y]=5;}else if(map2[*x-1][*y]==5&&map2[*x-2][*y]==3)/*3、推箱子进目的地*/{map2[*x][*y]=0;*x-=1;map2[*x][*y]=1;map2[*x-1][*y]=5;}else{if(map2[*x-1][*y]==5&&map2[*x-2][*y]=='#')/*4、推箱子遇到墙,推不动*/{}else{if(map2[*x-1][*y]==3)/*5、人进到目的地*/{map2[*x][*y]=0;*x-=1;map2[*x][*y]=1;}else{if(map2[*x][*y]==map2[X][Y]||map2[*x][*y]==map2[XX][YY]||map2[*x][*y]==map2[XXX][YYY])/*6、人退出目的地*/{map2[*x][*y]=3;*x-=1;map2[*x][*y]=1;}else /*7、人进入空地*/{map2[*x][*y]=0;*x-=1;map2[*x][*y]=1;}}}}}}9)/*d--右移*/if(inputdata=='d'){if(map2[*x][*y+1]=='#')/*1、人遇到墙*/{}else{if(map2[*x][*y+1]==5&&map2[*x][*y+2]==0)/*2、推箱子进空地*/{map2[*x][*y]=0;*y+=1;map2[*x][*y]=1;map2[*x][*y+1]=5;}else if(map2[*x][*y+1]==5&&map2[*x][*y+2]==3)/*3、推箱子进目的地*/{map2[*x][*y]=0;*y+=1;map2[*x][*y]=1;map2[*x][*y+1]=5;}else{if(map2[*x][*y+1]==5&&map2[*x][*y+2]=='#')/*4、推箱子遇到墙,推不动*/{}else{if(map2[*x][*y+1]==3)/*5、人进到目的地*/{map2[*x][*y]=0;*y+=1;map2[*x][*y]=1;}else{if(map2[*x][*y]==map2[X][Y]||map2[*x][*y]==map2[XX][YY]||map2[*x][*y]==map2[XXX][YYY])/*6、人退出目的地*/{map2[*x][*y]=3;*y+=1;map2[*x][*y]=1;}else /*7、人进入空地*/{map2[*x][*y]=0;*y+=1;map2[*x][*y]=1;}}}}}}}}}}10)system("cls");/*清屏:清除上一个回车的内容*/11)按下p键,退出本关,重新选关。

推箱子(C语言小游戏代码)

推箱子(C语言小游戏代码)

#include<stdio.h> #include<stdlib.h>#include<windows.h>#include<conio.h>//打印地图void DrawMap();//设置颜色void SetColor(int nColor);//获取玩家坐标POINT GetGamerPosition();//上void Up();//下void Down();//左void Left();//右void Right();//获取空箱子个数int GetSpareBox();//地图//0:空地;3箱子的目的地4箱子// 6人7箱子与目的地的集合//1:墙壁;9人在箱子的目的地int g_map[2][10][12]={{{0,0,0,0,1,1,1,0,0,0,0,0 },{0,0,0,0,1,3,1,0,0,0,0,0 },{0,0,0,0,1,0,1,1,1,1,1,1 },{1,1,1,1,1,4,0,4,0,0,3,1 },{1,3,0,0,0,4,6,1,1,1,1,1 },{1,1,1,1,1,1,4,1,0,0,0,0 },{0,0,0,0,0,1,0,1,0,0,0,0 },{0,0,0,0,0,1,0,1,0,0,0,0 },{0,0,0,0,0,1,3,1,0,0,0,0 },{0,0,0,0,0,1,1,1,0,0,0,0 },},{{1,1,1,1,1,0,0,0,0,0,0,0 },{1,0,0,0,1,0,1,1,1,0,0,0 },{1,0,4,0,1,0,1,1,1,1,1,1 },{1,0,4,6,1,0,1,0,0,0,3,1 },{1,1,1,4,1,1,1,0,0,0,3,1 },{1,1,1,0,0,0,0,0,0,0,3,1 },{0,1,0,0,0,1,0,0,0,0,0,1 },{0,1,0,0,0,1,0,0,0,0,0,1 },{0,1,0,0,0,1,1,1,1,1,1,1 },{1,1,1,1,1,1,0,0,0,0,0,0 },}};int g_nCurrentLevel = 0;//当前管卡int main(){//设置窗口大小system("mode con cols=26 lines=11");//设置标题//SetConsoLeTitle("推箱子");char nInput = 0;//输入字符while(1){//如果箱子推完了过关if (0==GetSpareBox())g_nCurrentLevel++;//清屏system("cls");//如果没有关卡,那就恭喜你成功通关。

推箱子c语言程序代码

推箱子c语言程序代码

推箱子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`。

然后,我们可以将墙、箱子、目标和角色放置到正确的位置上。

推箱子游戏C语言程序

推箱子游戏C语言程序

#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语言推箱子程序

C语言推箱子程序
m[x+a][y+b]=8;
m[x-a][y-b]=0;}
else if(m[x][y]==3) //人在成功点
{
x+=a;
y+=b;
m[x][y]=3;
m[x+a][y+b]=8;
m[x-a][y-b]=4;
}
}
else if(m[x+a][y+b]==5&&m[x+2*a][y+2*b]==4) //人物前面是成功箱子箱子前面是成功点
printf("⊙");
else if(m[i][j]==4)
printf("□");
else if(m[i][j]==5)
{
count++; //每扫描到一个成功值计数加1
printf("★");}
}
printf("\n");
}
return count;
}
void key() //按键操作
{
char z;
{
x+=a;
y+=b;
m[x][y]=3;
m[x+a][y+b]=5;
m[x-a][y-b]=0;
}
}
void game()
{
m[2][1]=2; //初始化人物模型点
for(;;)
{
prnmap(); //地图打印
key(); //操作指令
move(); //移动判断函数
if(prnmap()==4) //通关条件
{x+=a;
y+=b;

推箱子程序设计实训报告

推箱子程序设计实训报告

一、实训背景与目的随着计算机技术的发展,程序设计已成为计算机科学与技术专业学生必须掌握的核心技能之一。

为了提高学生的编程能力、逻辑思维能力和团队协作能力,我们选择了“推箱子”游戏作为程序设计实训的项目。

推箱子游戏是一款经典的益智游戏,玩家需要通过控制角色将箱子推到指定位置,游戏中包含多种障碍和复杂路径,对玩家的策略思维和操作技巧提出了挑战。

本次实训旨在通过设计和实现推箱子游戏,让学生掌握以下技能:1. 熟悉C语言编程环境,掌握基本的语法和编程技巧。

2. 理解数据结构和算法在游戏设计中的应用。

3. 学会使用图形库进行游戏界面设计。

4. 提高团队协作能力和沟通能力。

二、实训内容本次实训分为以下几个阶段:1. 需求分析:明确游戏的目标、规则和功能,确定游戏界面和交互方式。

2. 系统设计:设计游戏的数据结构、算法和流程图。

3. 编码实现:使用C语言编写游戏代码,实现游戏功能。

4. 测试与调试:对游戏进行测试,修复bug,优化性能。

5. 文档编写:撰写实训报告,总结实训过程和经验。

三、系统设计1. 数据结构:游戏使用二维数组存储地图信息,包括墙壁、箱子、目标点、玩家位置等。

同时,使用结构体存储玩家的状态,包括位置、方向、速度等。

2. 算法:游戏采用穷举法寻找最短路径,将玩家的移动方向和箱子移动方向进行组合,遍历所有可能的移动方案,找到最短路径。

3. 流程图:游戏流程包括初始化、游戏循环、输入处理、移动计算、碰撞检测、界面绘制等。

四、编码实现1. 初始化:读取地图数据,初始化玩家、箱子、目标点等状态。

2. 游戏循环:不断检测玩家的输入,根据输入更新玩家的状态,计算箱子移动方向,进行碰撞检测和地图更新。

3. 输入处理:监听键盘输入,根据输入更新玩家的移动方向。

4. 移动计算:根据玩家的移动方向计算箱子移动方向,更新箱子和玩家的位置。

5. 碰撞检测:检测玩家和箱子是否与墙壁、其他箱子或目标点发生碰撞,根据碰撞结果调整移动方向或停止移动。

c语言推箱子源代码及实验报告

c语言推箱子源代码及实验报告

《C语言推箱子源代码及实验报告》一、概述随着计算机科学技术的迅速发展,编程语言成为了计算机科学领域的重要组成部分。

C语言作为一种通用的编程语言,被广泛应用于系统软件,应用软件,驱动程序等领域。

本次实验将用C语言实现一个推箱子的小游戏,并编写实验报告。

二、实验目的1. 掌握C语言的基本语法和编程技巧;2. 学习如何利用C语言实现简单的游戏功能;3. 提高对C语言的理解和运用能力。

三、实验内容1. 设计并编写一个推箱子的小游戏;2. 实现游戏中的推箱子逻辑,包括箱子的移动、目标检测等功能;3. 编写实验报告,记录游戏设计思路、源代码分析和遇到的问题及解决方法。

四、实验步骤1. 设计游戏地图- 定义地图大小和布局- 设计箱子、目标点和玩家的初始位置2. 确定游戏规则- 确定箱子和玩家的移动规则- 确定胜利条件和失败条件3. 编写C语言代码- 定义地图的数据结构- 实现游戏初始化和终止的函数- 实现玩家和箱子的移动函数- 实现胜利和失败条件的检测函数4. 调试和测试- 对代码进行调试,确保游戏逻辑正确 - 测试不同情况下的游戏表现五、源代码展示以下展示部分游戏源代码:```#include <stdio.h>#include <stdlib.h>#include <conio.h>int m本人n() {// 游戏初始化initMap();drawMap();while(1) {// 监听玩家输入char input = getch();// 根据玩家输入移动玩家或者箱子 // 绘制移动后的地图// 判断胜利或失败条件// 提示玩家胜利或失败}return 0;}```六、实验结果分析通过本次实验,我们成功实现了一个简单的推箱子游戏。

在编写代码的过程中,我们熟练掌握了C语言的各种语法和逻辑结构,同时也加深了对C语言的理解和应用。

七、实验总结本次实验不仅让我们掌握了C语言的编程技巧,还提高了我们的逻辑思维能力和问题解决能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实训四:游戏篇4.1推箱子游戏【实训内容】(1)功能要求经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。

在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。

在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。

(1)初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。

(2)按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。

(3)每一关都可以重置,按空格键可以重置当前关。

(4)按Esc键可以在任何时候退出游戏。

(2)技术要求定义二维数组char status[20][20],用于记录屏幕一各点的状态。

其中,“0”表示什么都没有,“b”表示箱子,“w”表示目的地,“i”表示箱子在目的地。

首先将屏幕20*20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为“b”;在画墙壁时,将墙壁所在点的状态改为“w”;在画目的地时,将目的地所在点的状态改为“m”;当箱子被推到目的地时,箱子所在点的状态改为“i”,如果每一关中所有目的地的状态都为“i”,则说明该关已完成。

定义字符指针char far *printScreen=(char far*)0xB8000000,用于在屏幕上输出字符。

彩色显示器的字符缓冲区首地址为0xB8000000,每一个字符占2个字节(第一个字节为ASCII值,第二个字节为颜色值),字符模式下屏幕宽80像素,高25像素,一屏可以写80*25个字符。

定义结构体typedef struct winer{int x; int y; struct winer *p; }winer;定义结构体struct winer用于判断每一关是否已完成。

其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。

如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则表示已经过关,可以进入下一关。

该结构体的初始化在每一关的初始化时进行。

【概要设计】本程序采用模块化设计,包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块。

各个模块的功能描述如下:(1)初始化模块。

该模块包括屏幕初始化和游戏第一关的初始化。

屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。

(2)画图模块。

该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。

(3)移动箱子模块。

该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。

(4)移动小人模块。

该模块用于控制小人移动,从而推动箱子到目的地。

(5)功能控制模块。

该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。

如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。

【详细设计及实现】(1)课题中的函数原型及功能说明。

1、 putoutChar()函数原型:void putoutChar(int y,int x,char ch,char fc,char bc)putoutChar()函数在屏幕上的指定位置输出指定的字符。

其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。

2、 printWall()函数原型:void printWall(int x,int y)printWall()函数用于画墙壁,传入参数x、y指明位置。

该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。

3、 printBox()函数原型:void printBox(int x,int y)printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。

该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。

4、 printBoxDes()函数原型:void printBoxDes(int x,int y)printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。

该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。

5、 printDestination()函数原型:void printDestination(int x,int y)printDestination()函数用于画目的地,传入参数x、y指明位置。

该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心型表示(ASCII值为003)。

6、 printDestination1()函数原型: void printDestination1(int x,int y,winer **win,winer **pw)printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。

其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。

7、 printMan()函数原型: void printMan(int x,int y)printMan()函数用于画小人。

X、y指明画的位置。

该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII 值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。

8、 init()函数原型: void init()init()函数用于初始化屏幕。

该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX 的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。

9、初始化游戏函数原型:winer *initStep1()、winer *initStep2()、winer *initStep3()、winer *initStep4()这几个函数分别初始化游戏的第一关到第四关。

这些函数的功能和实现步骤相似。

首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。

游戏的第一关至第四关难度依次增加。

然后分别调用printDestination1()和printMan()函数画目的地和小人。

函数返回包含各个目的地位置的链表。

10、移动箱子函数原型: 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)这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。

X、y指明小人当前所处的位置,字符a表示移动的方向,有“u”、“d”、“l”和“r”4个值,分别表示向上、下、左、右移动。

这几个函数的实现原理大致相似。

对于前面两个函数,首先判断移动的方向,人小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printBox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printBoxDes()函数),并设置状态为“i”,表明箱子在目的地上。

11、 judge()函数原型: int judge(int x,int y)judge()根据结构体struct[x][y]中存的值来判断该点的状态。

12、 move()函数原型: void moid(int x,int y,char a)。

Move()函数根据按下的键来处理小人的移动。

小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。

首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。

若下一步所在位置的状态为墙壁(“w”),则直接退出,不作任何处理。

若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),则:若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函数)、在下一步位置画小人(调用printMan()函数)。

若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位置画小人(调用printMan()函数)。

若下一步所在位置的状态为箱子(“b”),则:①如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion()函数))。

②如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。

③其它情况则直接返回,不作任何处理。

若下一步所在位置的状态为箱子在目的地(“i”),则:如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。

如果下下一步位置的状态为目的地,则把箱子从目的地移动到目的地(调用moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。

相关文档
最新文档