C语言推箱子步伐
- 格式:pdf
- 大小:140.93 KB
- 文档页数:5
推箱子C语言程序报告推箱子是一种极富智慧和策略性的游戏,是著名的益智游戏之一、它不仅可以锻炼人们的逻辑思维能力和创造力,而且还能提高人们的解决问题的能力和耐心。
本篇报告将介绍一个基于C语言开发的推箱子游戏,包括游戏规则、程序设计思路和实现效果等方面的内容。
一、游戏规则推箱子游戏的规则十分简单,玩家需要操作一个小人将该场景中的木箱全部推到指定位置。
在游戏开始时,场景中会放置一定数量的木箱和一个小人。
玩家可以通过键盘输入上下左右四个方向键来移动小人,小人可以推动场景中的木箱,但不能直接拉动或推动多个箱子。
当所有的木箱都被推到指定位置时,游戏胜利,反之则失败。
二、程序设计思路推箱子游戏的实现涉及到场景的渲染、小人和木箱的移动、游戏的逻辑判断等多个方面。
下面将分别介绍这些方面的程序设计思路。
1.场景渲染2.小人和木箱的移动玩家操作小人的移动,可以通过监听键盘输入的方向键来实现。
根据输入的方向,判断小人与目标位置的关系,如果目标位置是空地或者指定位置,则小人可以移动到目标位置,否则不能移动。
当小人移动后,如果目标位置是木箱,则需要判断木箱与目标位置的关系,如果目标位置是空地或者指定位置,则木箱可以被推动到目标位置,否则不能推动。
3.游戏逻辑判断在每一次小人移动后,需要判断游戏是否胜利或失败。
胜利的条件是所有的木箱都被推到指定位置,判断的方法是在遍历整个场景时,检查是否存在未推到指定位置的木箱。
失败的条件是小人无法再移动,判断的方法是在判断小人是否能够移动时,如果没有可移动的方向,则游戏失败。
三、实现效果通过以上的程序设计思路,可以开发出一个基于C语言的推箱子游戏。
该游戏可以提供丰富的关卡和难度选择,让玩家能够不断挑战和提高自己的智力。
游戏的界面简洁明了,操作方便快捷,给玩家带来舒适的游戏体验。
总结:推箱子是一种极富智慧的益智游戏,本篇报告介绍了一个基于C语言开发的推箱子游戏。
通过对游戏规则、程序设计思路和实现效果的阐述,可以看出该游戏具有多样化的场景和难度选择,能够锻炼玩家的智力和思维能力。
C语⾔实现简单的推箱⼦游戏本⽂实例为⼤家分享了C语⾔实现简单的推箱⼦游戏的具体代码,供⼤家参考,具体内容如下项⽬实现的具体⽅案:先安装VS2019,后安装画图⼯具Easyx,安装以后就可以将推箱⼦中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)的图⽚加载到程序中显⽰出来。
游戏的实现是通过程序读取键盘中输⼊的字母,后控制加载到程序中的⼈物图⽚的移动实现⼩⼈的移动,通过⼈物图⽚和地板图⽚交换位置实现⼈物的⾏⾛,如果⼈物前⾯是箱⼦图⽚,箱⼦图⽚前⾯是地板图⽚,则⼈物图⽚和箱⼦图⽚⼀起移动,直到箱⼦图⽚前⾯是箱⼦⽬的地图⽚则箱⼦图⽚将箱⼦⽬的地替换,从⽽实现将箱⼦推到箱⼦⽬的地上。
这就是实现游戏的思路,程序中还有各种细节在下⾯进⾏讲解。
在开始编写程序时先创建⼀个c++空项⽬,把cpp⽂件和地图中相对应的元素图⽚(⼈物,墙壁,箱⼦⽬的地,箱⼦)放在同⼀个⽬录下⾯。
1、开始先进⾏地图⼤⼩的实现(1)我们先初始化图形界⾯的⼤⼩#define SCREEN_WIDTH 976#define SCREEN_HEIGHT 549//窗⼝初始化initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//括号中的是窗⼝的长和宽为了以后可以⽅便改变⼤⼩所以进⾏了宏定义(2)窗⼝⼤⼩初始化完以后进⾏开始游戏界⾯的实现IMAGE bg_img2; //申请⼀个句柄⽤来存放图⽚//游戏开始背景背景图loadimage(&bg_img2,_T("blachground.jpg"),732,549,true); //将图⽚blachground.jpg加载到&bg_img2GameStarSCREEN(&bg_img2);Sleep(1000); //休眠1000毫秒//函数GameStarSCREEN的实现//游戏开始界⾯void GameStarSCREEN(IMAGE *bg){putimage(0,0,bg); //把图⽚播放在(0,0)坐标//设置窗⼝标题HWND window = GetHWnd();//获取窗⼝SetWindowText(window,_T("推箱⼦ ***"));//设置窗⼝标题//设置⽂本样式及颜⾊settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("欢迎进⼊本⼈设置的游戏"));}游戏开始界⾯效果(3)游戏开始界⾯设置完以后进⾏游戏操作指南和游戏规则的界⾯设置//游戏正在进⾏界⾯void BeingGameSCREEN(){//清除界⾯cleardevice();//画⼀个矩形rectangle(762,30,952,244);settextcolor(WHITE); //设置字体颜⾊settextstyle(15,0,_T("宋体")); //设置字体的宽度和⾼度以及字体的类型outtextxy(772,40,_T("游戏操作指南:")); //在对应的坐标位置输出引号内的字符串outtextxy(772,60,_T("按 W 向上移动"));outtextxy(772,75,_T("按 S 向下移动"));outtextxy(772,90,_T("按 A 向左移动"));outtextxy(772,105,_T("按 D 向右移动"));outtextxy(772,130,_T("温馨提⽰:"));outtextxy(772,170,_T("请在 58 步以内完成任务"));rectangle(922,450,762,264);outtextxy(772,284,_T("您以⾛的步数为:"));}游戏操作指南效果图(4)进⾏游戏地图的实现先定义⼀个全局的⼆维数组⽤来保存地图中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)元素int map[COW][COLUMN]={{0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,2,1,0,2,1,0,0},{0,1,0,1,0,1,0,0,1,1,1,0},{0,1,0,2,0,1,1,4,1,1,1,0},{0,1,1,1,0,3,1,1,1,4,1,0},{0,1,2,1,1,4,1,1,1,1,1,0},{0,1,0,0,1,0,1,1,0,0,1,0},{0,0,0,0,0,0,0,0,0,0,0,0},};定义⼀个枚举类型⽤来设置地图中的(⼈物,墙壁,箱⼦⽬的地,箱⼦)元素enum _PROPS{WALL_RIGHT, //墙壁为数字0FLOOR, //地板为数字1DES, //箱⼦⽬的地为数字2MAN, //⼈物为数字3BOX, //箱⼦为数字4BOX_HIT, //把箱⼦推到箱⼦⽬的地为数字5MAN_DES, //⼈站在⽬的地上为数字6ALL //全部道具的数量为数字7}poc;地图定义完以后将地图元素加在到⼆维数组中#define RATIO 61 //地图元素⼤⼩//申请⼀个全局的⼀维的数组句柄IMAGE images[ALL];//加载地图元素loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);//⽤for循环遍历⼆维数组,⼆维数组中相应坐标对应的数字与后来设置的以为数组中对应的枚举值相对应这样⽅可进⾏地图的实现 for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图⽚加载到相应的位置if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}地图实现的效果图2、进⾏游戏控制环节的实现,游戏的控制是通过控制⼩⼈的移动实现所以我们先定义⼀个全局的结构体来表⽰⼩⼈在地图中的位置struct _pos{};struct _pos man;⼩⼈坐标定义好以后我们要获取⼩⼈在地图中的坐标才能对⼩⼈进⾏移动,⼩⼈的坐标随我们不断移动⽽改变所以饿哦们要不断获取⼩⼈的坐标for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);//根据相应的把相应的图⽚加载到相应的位置if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}(1)定义⼀个枚举类型⽤来表⽰移动的⽅向//枚举控制地图中⼩⼈的运动⽅向enum DURATION{UP,DOWN,LEFT,RIGHT};enum DURATION direct;(2)获取⼩⼈位置后对⼩⼈进⾏移动bool quit=false; //定义⼀个布尔类型do{if(_kbhit()){ //识别从键盘输⼊的字母char ch=_getch(); //从键盘输⼊字母cnt++;Record_Steps(); //记录⾛过的步数,每次进⼊识别键盘输⼊说明移动了⼀次从⽽进⾏步数加⼀if(ch==KEY_UP){gameControal(UP);}else if(ch==KEY_DOWN){gameControal(DOWN);}else if(ch==KEY_LEFT){gameControal(LEFT);}else if(ch==KEY_RIGHT){gameControal(RIGHT);}else if(ch==KEY_QUIT){quit=true;GameOverSCREEN(&bg_img);}if(isGameOver()){quit=true;GameOverSCREEN(&bg_img);}if(cnt>LEN){quit=true;FalseGameOverSCREEN(&bg_img1);}}Sleep(100);}while(quit==false);(3)⽤宏定义表⽰从键盘输⼊的字母#define KEY_UP 'W'#define KEY_DOWN 'S'#define KEY_LEFT 'A'#define KEY_RIGHT 'D'#define KEY_QUIT 'Q'(4)接下来进⾏⼈物的移动⽅向的判断//控制程序运⾏⼩⼈移动和⽅块移动void gameControal(enum DURATION direct){//对向上移动的控制if(direct==UP){if((x-1)>=STAR&&map[x-1][y]==DES){mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){mapChange(x,y,DES);mapChange(x-1,y,MAN);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){mapChange(x-2,y,BOX);mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==BOX){if(map[x-2][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX);man.x=x-1;}else if(map[x-2][y]==DES){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX_HIT);man.x=x-1;}}//对向下移动的控制}else if(direct==DOWN){if((x+1)>=STAR&&map[x+1][y]==DES){mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){mapChange(x,y,DES);mapChange(x+1,y,MAN);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){mapChange(x+2,y,BOX);mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){ mapChange(x+2,y,BOX);mapChange(x+1,y,MAN);mapChange(x,y,DES);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==BOX){if(map[x+2][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX);man.x=x+1;}else if(map[x+2][y]==DES){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX_HIT);man.x=x+1;}}//对向右移动的控制if((y+1)>=STAR&&map[x][y+1]==DES){mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){mapChange(x,y,DES);mapChange(x,y+1,MAN);man.y=y+1;}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){mapChange(x,y+2,BOX);mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((y+1)<COLUMN&&map[x][y+1]==BOX){if(map[x][y+2]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX);man.y=y+1;}else if(map[x][y+2]==DES){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX_HIT);man.y=y+1;}}//对向左移动的控制}else if(direct==LEFT){if((y-1)>=STAR&&map[x][y-1]==DES){mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){mapChange(x,y,DES);mapChange(x,y-1,MAN);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){mapChange(x,y-2,BOX);mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){ mapChange(x,y-2,BOX);mapChange(x,y-1,MAN);mapChange(x,y,DES);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==BOX){if(map[x][y-2]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX);man.y=y-1;}else if(map[x][y-2]==DES){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX_HIT);man.y=y-1;}}}}//改变地图元素void mapChange(int line,int colum,enum _PROPS poc){ map[line][colum]=poc;putimage(colum*RATIO,line*RATIO,&images[poc]);}3、⼈物控制结束以后进⾏游戏结束界⾯的设计(1)在规定步数内完成游戏的背景//游戏结束背景void GameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT}; settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}效果图(1)不在规定步数内完成游戏背景//游戏⾮正常结束背景void FalseGameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("⼩菜鸡这都完成不了真蠢")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}效果图4、具体代码实现(1)头⽂件编写#define LINE1 366#define COW1 183#define LINE2 427#define COW2 244#define RATIO 61#define LEN 100#define STAR 0#define SCREEN_WIDTH 976#define SCREEN_HEIGHT 549#define COW 9#define COLUMN 12#define KEY_UP 'W'#define KEY_DOWN 'S'#define KEY_LEFT 'A'#define KEY_RIGHT 'D'#define KEY_QUIT 'Q'int cnt=STAR;//枚举优化代码表⽰道具enum _PROPS{WALL_RIGHT,FLOOR,DES,MAN,BOX,ALL}poc;//enum _PROPS poc;//⼩⼈在⼆维数组中的位置struct _pos{int x;int y;};struct _pos man;//窗⼝初始化IMAGE images[ALL];//地图的实现int map[COW][COLUMN]={{0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,2,1,0,2,1,0,0},{0,1,0,1,0,1,0,0,1,1,1,0},{0,1,0,2,0,1,1,4,1,1,1,0},{0,1,1,1,0,3,1,1,1,4,1,0},{0,1,2,1,1,4,1,1,1,1,1,0},{0,1,0,0,1,0,1,1,0,0,1,0},{0,0,0,0,0,0,0,0,0,0,0,0},};//判断游戏是否结束//return->false 游戏未结束 return->true 游戏结束int isGameOver(){for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){if(map[i][j]==DES) return false;}}return true;}//游戏结束背景void GameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);RECT rec={0,0,SCREEN_WIDTH,SCREEN_HEIGHT}; settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("恭喜完成了本游戏你真棒")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}//游戏⾮正常结束背景void FalseGameOverSCREEN(IMAGE *bg){cleardevice();putimage(0,0,bg);settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("⼩菜鸡这都完成不了真蠢")); outtextxy(LINE2,COW2,_T("请按Q退出游戏"));}//游戏开始界⾯void GameStarSCREEN(IMAGE *bg){putimage(0,0,bg);//设置窗⼝标题HWND window = GetHWnd();//获取窗⼝SetWindowText(window,_T("推箱⼦ ***"));//设置窗⼝标题 //设置⽂本样式及颜⾊settextcolor(WHITE);settextstyle(20,0,_T("宋体"));outtextxy(LINE1,COW1,_T("欢迎进⼊本⼈设置的游戏")); }void BeingGameSCREEN(){//清除界⾯cleardevice();//画⼀个矩形rectangle(762,30,952,244);settextcolor(WHITE);settextstyle(15,0,_T("宋体"));outtextxy(772,40,_T("游戏操作指南:"));outtextxy(772,60,_T("按 W 向上移动"));outtextxy(772,75,_T("按 S 向下移动"));outtextxy(772,90,_T("按 A 向左移动"));outtextxy(772,105,_T("按 D 向右移动"));outtextxy(772,130,_T("温馨提⽰:"));outtextxy(772,170,_T("请在 58 步以内完成任务"));outtextxy(772,200,_T("退出请按 Q"));rectangle(922,450,762,264);outtextxy(772,284,_T("您以⾛的步数为:"));}//记录⼩⼈⾛过的步数void Record_Steps(){char str[16];settextstyle(40,0,_T("宋体"));sprintf(str,"%d",cnt);outtextxy(820,350,str);}//枚举控制地图中⼩⼈的运动⽅向enum DURATION{UP,DOWN,LEFT,RIGHT};enum DURATION direct;//改变地图元素void mapChange(int line,int colum,enum _PROPS poc){map[line][colum]=poc;putimage(colum*RATIO,line*RATIO,&images[poc]);}//控制程序运⾏⼩⼈移动和⽅块移动void gameControal(enum DURATION direct){int x=man.x;int y=man.y;if(direct==UP){if((x-1)>=STAR&&map[x-1][y]==DES){mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==FLOOR){mapChange(x,y,DES);mapChange(x-1,y,MAN);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==FLOOR){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x-1][y]==BOX_HIT&&map[x-2][y]==FLOOR){mapChange(x-2,y,BOX);mapChange(x-1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x-1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((x-1)>=STAR&&map[x-1][y]==BOX){if(map[x-2][y]==FLOOR){mapChange(x-1,y,MAN);man.x=x-1;}else if(map[x-2][y]==DES){mapChange(x-1,y,MAN);mapChange(x,y,FLOOR);mapChange(x-2,y,BOX_HIT);man.x=x-1;}}}else if(direct==DOWN){if((x+1)>=STAR&&map[x+1][y]==DES){mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==FLOOR){mapChange(x,y,DES);mapChange(x+1,y,MAN);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x+1][y]==BOX_HIT&&map[x+2][y]==FLOOR){mapChange(x+2,y,BOX);mapChange(x+1,y,MAN_DES);mapChange(x,y,FLOOR);man.x=x+1;}else if(map[x][y]==MAN_DES&&map[x+1][y]==BOX&&map[x+2][y]==FLOOR){ mapChange(x+2,y,BOX);mapChange(x+1,y,MAN);mapChange(x,y,DES);man.x=x+1;}else if((x+1)<COW&&map[x+1][y]==BOX){if(map[x+2][y]==FLOOR){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX);man.x=x+1;}else if(map[x+2][y]==DES){mapChange(x+1,y,MAN);mapChange(x,y,FLOOR);mapChange(x+2,y,BOX_HIT);man.x=x+1;}}}else if(direct==RIGHT){if((y+1)>=STAR&&map[x][y+1]==DES){mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x][y+1]==FLOOR){mapChange(x,y,DES);mapChange(x,y+1,MAN);man.y=y+1;}else if((y+1)<COLUMN&&map[x][y+1]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y+1]==BOX_HIT&&map[x][y+2]==FLOOR){mapChange(x,y+2,BOX);mapChange(x,y+1,MAN_DES);mapChange(x,y,FLOOR);man.y=y+1;}else if(map[x][y]==MAN_DES&&map[x-1][y]==BOX&&map[x-2][y]==FLOOR){ mapChange(x-2,y,BOX);mapChange(x-1,y,MAN);mapChange(x,y,DES);man.x=x-1;}else if((y+1)<COLUMN&&map[x][y+1]==BOX){if(map[x][y+2]==FLOOR){mapChange(x,y+1,MAN);mapChange(x,y,FLOOR);mapChange(x,y+2,BOX);man.y=y+1;}else if(map[x][y+2]==DES){mapChange(x,y+2,BOX_HIT);man.y=y+1;}}}else if(direct==LEFT){if((y-1)>=STAR&&map[x][y-1]==DES){mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==FLOOR){mapChange(x,y,DES);mapChange(x,y-1,MAN);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y-1]==BOX_HIT&&map[x][y-2]==FLOOR){mapChange(x,y-2,BOX);mapChange(x,y-1,MAN_DES);mapChange(x,y,FLOOR);man.y=y-1;}else if(map[x][y]==MAN_DES&&map[x][y-1]==BOX&&map[x][y-2]==FLOOR){ mapChange(x,y-2,BOX);mapChange(x,y-1,MAN);mapChange(x,y,DES);man.y=y-1;}else if((y-1)>=0&&map[x][y-1]==BOX){if(map[x][y-2]==FLOOR){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX);man.y=y-1;}else if(map[x][y-2]==DES){mapChange(x,y-1,MAN);mapChange(x,y,FLOOR);mapChange(x,y-2,BOX_HIT);man.y=y-1;}}}}(2)main⽂件的实现#include<graphics.h>#include<stdlib.h>#include<iostream>#include<Windows.h>#include<MMSystem.h>#include<conio.h>#pragma comment(lib,"winmm.lib")#include "box.h"using namespace std;int main(void){//申请⼀个句柄IMAGE bg_img;IMAGE bg_img1;IMAGE bg_img2;//窗⼝初始化initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//游戏开始背景背景图loadimage(&bg_img2,_T("blachground.jpg"),732,549,true);GameStarSCREEN(&bg_img2);Sleep(1000);//加载游戏未在规定规则内完成的背景loadimage(&bg_img1,_T("blackground.jpg"),732,549,true);//加载游戏在规定规则内完成的背景图loadimage(&bg_img,_T("blackground.jpg"),732,549,true);//加载背景⾳乐mciSendString(_T("play 南⽅.mp3 repeat"), 0, 0, 0);//加载地图元素loadimage(&images[WALL_RIGHT],_T("wall_right.bmp"),RATIO,RATIO,true);loadimage(&images[FLOOR],_T("floor.bmp"),RATIO,RATIO,true);loadimage(&images[DES],_T("des.bmp"),RATIO,RATIO,true);loadimage(&images[MAN],_T("man.bmp"),RATIO,RATIO,true);loadimage(&images[BOX],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[BOX_HIT],_T("box.bmp"),RATIO,RATIO,true);loadimage(&images[MAN_DES],_T("man.bmp"),RATIO,RATIO,true);for(int i=0;i<COW;i++){for(int j=0;j<COLUMN;j++){putimage(j*RATIO,i*RATIO,&images[map[i][j]]);if(map[i][j]==MAN){//获取⼩⼈在⼆维数组中的位置man.x=i;man.y=j;}putimage(j*RATIO,i*RATIO,&images[map[i][j]]);}}bool quit=false;do{if(_kbhit()){char ch=_getch();cnt++;Record_Steps();if(ch==KEY_UP){gameControal(UP);}else if(ch==KEY_DOWN){gameControal(DOWN);}else if(ch==KEY_LEFT){gameControal(LEFT);}else if(ch==KEY_RIGHT){gameControal(RIGHT);}else if(ch==KEY_QUIT){quit=true;GameOverSCREEN(&bg_img);}if(isGameOver()){quit=true;GameOverSCREEN(&bg_img);}if(cnt>LEN){quit=true;FalseGameOverSCREEN(&bg_img1);}}Sleep(100);}while(quit==false);system("pause");//游戏结束释放资源closegraph();return 0;}5、这是本⼈对推箱⼦游戏的见解如果有什么错误请指正以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
推箱子的c语言代码推箱子(Sokoban)是一种经典的益智游戏,也是计算机程序设计中常用的案例之一。
在这个游戏中,玩家需要移动箱子,将它们推到指定位置上,以完成关卡的目标。
在C语言中,我们可以使用二维数组来表示游戏的地图,其中不同的字符代表不同的元素。
例如,可以使用'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
玩家可以通过控制输入来移动,将箱子推到目标位置上。
为了实现这个游戏,我们可以先定义一个二维数组来表示地图,然后通过循环读取用户的输入,根据输入来移动玩家和箱子,最后判断是否完成了关卡的目标。
我们需要定义一个二维数组来表示地图。
假设地图的大小是10x10,我们可以这样定义:```c#define MAP_SIZE 10char map[MAP_SIZE][MAP_SIZE] = {"##########","# #","# $ #","# @ #","# #","# #","# #","# #","# #","##########"};```其中,'#'表示墙壁,'@'表示玩家,'$'表示箱子,'.'表示目标位置。
空格表示可通行的空地。
接下来,我们可以定义一个函数来打印地图,以便在每一次移动后显示最新的状态:```cvoid printMap() {for (int i = 0; i < MAP_SIZE; i++) {printf("%s\n", map[i]);}}```然后,我们可以定义一个循环,接收用户的输入,并根据输入来移动玩家和箱子。
推箱子c语言程序设计1.引言1.1 概述概述推箱子游戏作为一款经典的益智游戏,具有很高的趣味性和挑战性,受到了广大玩家的喜爱。
本文旨在介绍通过C语言程序设计实现推箱子游戏的过程。
本文将从游戏的背景介绍、基本规则和玩法等方面展开叙述。
推箱子游戏的背景是一个仓库,玩家需要控制一个工人将货物推到指定的放置点。
游戏地图由一系列的方块组成,每个方块可能是墙壁、货物、放置点、工人或者空地。
玩家通过移动工人将货物推动到目标位置,最终完成整个地图的挑战。
C语言作为一种基础的编程语言,广泛应用于各种程序设计中。
通过使用C语言来编写推箱子游戏的程序,我们可以深入理解游戏的基本逻辑和算法,并将其应用于其他类似的益智游戏中。
本文将首先介绍推箱子游戏的基本规则和玩法,包括工人的移动、货物的推动以及地图的布局等方面。
之后,我们将详细讲解如何使用C语言来实现推箱子游戏的各个功能,包括游戏的初始化、地图的生成、玩家操作的响应等。
通过本文的学习,读者可以掌握使用C语言来进行程序设计的基本技巧和方法,同时也能够熟悉并理解推箱子游戏的内部实现原理。
希望本文对读者有所帮助,能够引发对程序设计和游戏开发的兴趣,同时也能够为读者在后续的学习和实践中提供一定的参考价值。
1.2 文章结构文章结构部分的内容:文章的结构是为了使读者能够更好地理解和掌握推箱子游戏的C语言程序设计。
通过以下几个方面来介绍文章的结构:1. 简介:在本部分中,将对推箱子游戏的背景和意义进行简要介绍。
推箱子作为一种逻辑思维和策略性很强的游戏,对于培养思维能力和解决问题的能力有着重要意义。
因此,本文将介绍推箱子游戏的特点和玩法,以及C语言程序设计对于实现推箱子游戏的重要作用。
2. 目标:本部分将明确阐述本文的目标。
主要包括两个方面:一是介绍如何使用C语言进行推箱子游戏的程序设计;二是帮助读者理解和掌握C语言程序设计的基本原理和方法,为自己编写其他游戏程序打下基础。
3. 主体内容:本文的主要内容包括两个方面。
C语⾔实现推箱⼦游戏完整代码C语⾔实现推箱⼦游戏完整代码,供⼤家参考,具体内容如下前⾔⾃⼰做的,可能有些代码不够⼯整,或者有些⼩问题,但游戏的基本操作是可以实现的代码效果代码⼀共分为8个部分,4个控制上下左右移动,2个判断输赢,1个统计归为的个数,⼀个作图。
⼿动设置地图⽤'0'表⽰空格,“1”表⽰墙,“2”表⽰箱⼦,“3”表⽰⼈,“4”表⽰终点这样可以提⾼代码的移植性如需改为⼿动输⼊地图可以直接定义⼀个⼆维数组,在给他赋值就可以了int screen[9][11]={{0,1,1,1,1,1,1,1,1,0,0},{0,1,0,0,0,1,0,0,0,1,0},{0,1,0,2,2,2,2,2,0,1,0},{0,1,0,2,0,2,0,2,0,1,1},{0,1,0,0,0,3,0,0,2,0,1},{1,1,0,1,1,1,1,0,2,0,1},{1,0,4,4,4,4,4,1,0,0,1},{1,0,4,4,4,4,4,0,0,1,1},{1,1,1,1,1,1,1,1,1,1,0}};//定义为全局变量(地图) i表⽰⾏,j表⽰列计算地图中终点的个数这⼀步主要是为了后⾯判断游戏输赢的int cum(){int i,j,k=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(screen[i][j]==2){k++;}}}//遍历整个⼆维数组return k;}//计算地图中有多少个终点打印地图函数通过switch函数对⼆维数组中的值进⾏可视化,也就是画出地图注意:这⾥还定义出了6和7,是通过重叠的关系来算的,就是箱⼦在终点上,这个位置⼜有箱⼦⼜有终点2个标识,所以让两个的数值加起来,⽅便理解,也⽅便后⾯的计算void print(){int i,j;printf("请⽤wsad代表上下左右来进⾏游戏\n");for(i=0;i<9;i++){for(j=0;j<11;j++){switch(screen[i][j]){case 0:printf(" ");//空break;case 1:printf("■");//墙break;case 2:printf("★");//箱⼦break;case 3:printf("♀");//⼈break;case 4:printf("○");//终点break;case 6:printf("★");break;//箱⼦和终点case 7://⼈和终点显⽰⼈printf("♀");break;}}printf("\n");}}判断游戏输赢这⾥我写了2个函数,⼀个判断赢,⼀个判断输,并返回值,然后在主函数的最后⾯通过判断返回值来确定游戏的输赢判断赢int win(){int i,j,k=0;int t=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(screen[i][j]==6){k++;}}}//遍历整个⼆维数组,计算箱⼦在终点上的个数if(k==cum()){t=1;}//如果个数等于前⾯计算出的终点个数,则说明所有终点都放了箱⼦,说明游戏胜利return t;} //判断赢判断输int lose(){int i,j;int k=0;for(i=0;i<9;i++){for(j=0;j<11;j++){if(i>0 && j>0 ){if(screen[i][j] == 2 || screen[i][j] == 6){if(((screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6) && (screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6))|| ((screen[i][j-1] == 1 || screen[i][j-1] == 2 || screen[i][j-1] == 6) && (screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6))|| ((screen[i+1][j] == 1 || screen[i+1][j] == 2 || screen[i+1][j] == 6) && (screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6))|| ((screen[i][j+1] == 1 || screen[i][j+1] == 2 || screen[i][j+1] == 6) && (screen[i-1][j] == 1 || screen[i-1][j] == 2 || screen[i-1][j] == 6))){k++;}}}}/*这⾥也是遍历了整个数组,判断所有的箱⼦四个⽅向的情况,如果有三个⽅向被堵住了说明箱⼦⽆法移动了,也表明这个箱⼦失效了,⽤k来记录失效的个数,当全部失效时游戏失败(这是游戏的玩法,其实有⼀个被堵住就已经不可能胜利了)*/}if(k==cum()){k=1;return k;//返回1说明游戏失败}接下来是最重要的四个控制函数向上移动通过数字的变化来控制⼆维数组的变化,进⽽控制地图的更新这⾥⾮常重要的就是要理解:加1,加2,加3减3都是什么意思加1:箱⼦的值是2,⼈的值是3,所以箱⼦的位置变成⼈需要加1来实现加2:空地的值是0,箱⼦的值是2,箱⼦和终点在⼀起的值是6,所以在推箱⼦的时候,前⽅的空格或者终点放上箱⼦后数值会加2加3减3:⼈的值是3,⼈要动的话,它原先在的格⼦就会因为⼈⾛了导致数值减3,⾛到的那个格⼦就会因为站了⼈⽽加3如果这个理解的话,代码就⾮常简单了void movew(){if(x>0){if(screen[x-1][y]==1){return ;/*如果箱⼦的上⾯是墙,则地图不会发⽣变化,因为推不动嘛*/}else if(screen[x-1][y]==0){screen[x-1][y]+=3;screen[x][y]-=3;x--;/*如果前⾯是空地,则需要向前移动⼀格,也就是原先⼈的位置变成空地,前⽅的空地变成⼈,空地(0)变成⼈(3)需要加3,⼈变成空地需要减3*/}else if(screen[x-1][y]==4){screen[x-1][y]+=3;screen[x][y]-=3;x--;}//⼀样的else if(screen[x-1][y]==2||screen[x-1][y]==6){if(screen[x-2][y]==0){screen[x-2][y]+=2;//箱⼦前⾯的格变成箱⼦(2)screen[x-1][y]+=1;//箱⼦的位置变成⼈(3)screen[x][y]-=3;/*如果前⾯是空地,则需要向前移动⼀格,也就是原先是箱⼦的格⼦变成⼈,⼈的位置变成空地,原先的空地变成箱⼦,箱⼦(2)变成⼈(3)需要减3,空地变成⼈*/x--;}else if(screen[x-2][y]==1){return ;}else if(screen[x-2][y]==2){return;//如果箱⼦的前⾯是墙或者其他的箱⼦,则箱⼦推不动}else if(screen[x-2][y]==4){screen[x-2][y]+=2;screen[x-1][y]+=1;screen[x][y]-=3;x--;}//这个情况别漏了}}}其他三个⽅向的代码思路和这个是⼀样的向下移动void moves(){if(x<9){if(screen[x+1][y]==1){return ;}else if(screen[x+1][y]==0){screen[x+1][y]+=3;screen[x][y]-=3;x++;}else if(screen[x+1][y]==4){screen [x+1][y]+=3;screen[x][y]-=3;}else if(screen[x+1][y]==2||screen[x+1][y]==6){ if(screen[x+2][y]==1){return;}else if(screen[x+2][y]==0){screen[x+2][y]+=2;screen[x+1][y]+=1;screen[x][y]-=3;x++;}else if(screen[x+2][y]==2){return ;}else if(screen[x+2][y]==4){screen[x+2][y]+=2;screen[x+1][y]+=1;screen[x][y]-=3;x++;}}}}向左移动void movea(){if(y>0){if(screen[x][y-1]==1){return;}else if(screen[x][y-1]==4){screen[x][y-1]+=3;screen[x][y]-=3;y--;}else if(screen[x][y-1]==0){screen[x][y-1]+=3;screen[x][y]-=3;y--;}else if(screen[x][y-1]==2||screen[x][y-1]==6){ if(screen[x][y-2]==0){screen[x][y-2]+=2;screen[x][y-1]+=1;screen[x][y]-=3;y--;}else if(screen[x][y-2]==1){return;}else if(screen[x][y-2]==2){return;}else if(screen[x][y-2]=4){screen[x][y-2]+=2;screen[x][y-1]+=1;screen[x][y]-=3;y--;}}}}向右移动void moved(){if(y<9){if(screen[x][y+1]==1){return;}else if(screen[x][y+1]==4){screen[x][y+1]+=3;screen[x][y]-=3;y++;}else if(screen[x][y+1]==0){screen[x][y+1]+=3;screen[x][y]-=3;y++;}elseif(screen[x][y+1]==2||screen[x][y+1]==6){if(screen[x][y+2]==0){screen[x][y+2]+=2;screen[x][y+1]+=1;screen[x][y]-=3;y++;}else if(screen[x][y+2]==4){screen[x][y+2]+=2;screen[x][y+1]+=1;screen[x][y]-=3;y++;}else if(screen[x][y+2]==2){return;}else if(screen[x][y+2]==1){return;}}}}主函数这个主函数写的有点乱,直接看注释吧int main(){int n,t;int j,k;int b=1;here:system("cls");//printf("开始游戏请按1\n退出游戏请按2\n");scanf("%d",&j);if(j==1){printf("请⽤wsad代表上下左右来进⾏游戏\n");//这个就引导进⼊游戏while(1){system("cls");/*在每⼀次移动过后都清除上⼀个地图,不然就会每⾛⼀步⽣成⼀个图*/print();//先打印地图scanf("%c",&n);//读⼊⽤户的操作switch(n){case 'w':movew();break;case 's':moves();break;case 'a':movea();break;case 'd':moved();break;} //控制⼈移动t=win();if(t==1){goto there;}//每次操作完先判断游戏是否胜利,如果胜利了直接跳到函数最后if(b == lose()){system("cls");print();printf("游戏失败");return 0;} //游戏失败提⽰}}else {system("cls");printf("您确认要退出游戏吗\n确认退出按1\t返回上⼀层按2\n");scanf("%d",&k);if(k==1){printf("你已退出游戏,期待你的再次到来,谢谢");return 0;}else {goto here;}}//这⼀块是最前⾯⽤户进⼊游戏那⾥的,如果⽤户选择退出游戏执⾏的操作 there:printf("恭喜你通过了游戏!");return 0;}//主函数所有的代码就到这⾥了,如果需要完整代码可以留⾔以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
#include <stdio.h>#include <stdlib.h>//用到system()#include <conio.h>//因为需要用到getch()函数//推箱子_C语言版//写了一下午,第一个C语言游戏终于写好了,想想有点小激动....//蔚蓝之链编写//分享给大家参考下(在看得懂的情况下...),代码写得很凌乱.....,勿喷#define X 20#define Y 20#define REN 2 //表示人#define XIANGZI 3 //箱子#define WEIZHI 4 //箱子要推到的位置#define KONG 0 //空位#define QIANG 1 //墙#define RW 6 //人在箱子要推到的位置上#define XW 5 //箱子在箱子要推到的位置上#define bool short#define false 0#define true 1//数组内部数值表示内容:0表示空位,1表示墙体,2表示人,3表示箱子,4表示箱子要推到的位置,5表示既有箱子又有又位置,6表示既有位置又有人//01,2,3,4符号表示://0 :" " 1:■2:♀3:回4:◎void create_map_arr(int _x,int _y,int (*map_arr)[Y]);//创建地图数组void creata_map(int _x,int _y, int (*map)[Y]);//创建地图,重绘游戏画面void amend_map(int _x,int _y,char key , int (* arr_map)[Y]);//接收输入,修改游戏画面bool is_finish(int _x, int _y,int _total ,int (*arr_map)[Y]);//判断是否完成推箱子(地图x,地图y,总箱子数,地图数组)int main(void){int map_arr[X][Y];//存储地图的二维数组create_map_arr(X,Y,map_arr);//创建数组printf("C语言_推箱子v1.0 蔚蓝之链编写\n\n");printf("控制键:W↑,A←,S↓,D→\n");printf("提示:玩本游戏前请先关闭输入法\n");system("pause");system("cls");while(1){creata_map(X,Y,map_arr);//创建地图,重绘游戏画面if(is_finish(X,Y,2,map_arr) == true){printf("恭喜哦,推箱子完成!\n");system("pause");return 0;}amend_map(X,Y,getch(),map_arr);//接收输入,修改画面system("cls");//清空画面}getchar();return 0;}void create_map_arr (int _x,int _y,int (*map_arr)[Y])//创建地图数组{int x,y;for(x=0;x<_x;x++){for (y=0;y<_y;y++){if(y==0 || x==0 || x==_x-1 || y==_y-1){*(*(map_arr+x)+y) = QIANG;//printf ("■");}else{*(*(map_arr+x)+y) = KONG;//printf (" ");}}//printf("\n");}//这里可以修改箱子创建的位置,人创建的位置及箱子要达到的位置,默认两个箱子*(*(map_arr+3)+7)=REN;//人*(*(map_arr+5)+6)=XIANGZI;//箱子*(*(map_arr+5)+7)=XIANGZI;//箱子*(*(map_arr+1)+8)=WEIZHI;//箱子要推到的位置*(*(map_arr+2)+8)=WEIZHI;//箱子要推到的位置}void creata_map(int _x,int _y, int (*map)[Y])//创建地图(地图数组[][]){int x,y;for(x = 0; x < _x; x++){for (y = 0; y < _y; y++){if (*(*(map + x) + y) == QIANG){printf ("■");}else if(*(*(map + x) + y) == KONG){printf (" ");}else if(*(*(map + x) + y)==REN || *(*(map + x) + y)==RW){printf ("♀");}else if (* (*(map + x) + y)==XIANGZI){printf("□");}else if (*(*(map + x) + y)==WEIZHI){printf("◎");}else if(*(*(map + x) + y) == XW){printf("回");}}printf ("\n");}}//这个函数写的太乱了,自己看着也头大,不过还好,总算完成了^_^void amend_map(int _x,int _y,char key , int (* arr_map)[Y])//移动(地图x,地图y,按键值,地图数组){int x,y;for(x = 0; x < _x; x++){for (y = 0; y < _y; y++){if(*( * (arr_map + x ) + y) == REN || *( * (arr_map + x ) + y) == RW){if(key == 'a' || key == 'A')//←{if (y > 0){if(*(*(arr_map + x) +(y)) == RW)//人在最终位置{if(*( * (arr_map + x ) + (y-1)) == WEIZHI)//人左边还是最终位置{*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + y) = WEIZHI;}else if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + x) + (y - 1)) == KONG){*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + x ) + (y-1)) == WEIZHI)//人左边是最终位置{*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + x) + (y - 1)) == KONG){*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + x ) + (y-1)) == XW || *( * (arr_map + x ) + (y-1)) == XIANGZI)//人左边有箱子或箱子在最终位置{if(*( * (arr_map + x ) + (y-1)) == XIANGZI || *( * (arr_map + x ) + (y-1)) == XW){if(*( * (arr_map + x ) + (y-1)) == XW){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y - 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y-2)) == KONG){*( * (arr_map + x ) + (y-2)) = XIANGZI;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y-2)) = XW;*( * (arr_map + x ) + (y-1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + x) + (y-1)) == WEIZHI){*(*(arr_map + x) + (y-1)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + x) + (y-1)) == KONG){*(*(arr_map + x) + (y-1)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//←else if(key == 'd' || key == 'D')//→{if (y < _y){if(*(*(arr_map + x) +(y)) == RW)//人在最终位置{if(*( * (arr_map + x ) + (y+1)) == WEIZHI)//人右边还是最终位置{*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + y) = WEIZHI;}else if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + x) + (y + 1)) == KONG){*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + x ) + (y+1)) == WEIZHI)//人右边是最终位置{*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y-2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + x) + (y + 1)) == KONG){*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + x ) + (y+1)) == XW || *( * (arr_map + x ) + (y+1)) == XIANGZI)//人右边有箱子或箱子在最终位置{if(*( * (arr_map + x ) + (y+1)) == XIANGZI || *( * (arr_map + x ) + (y+1)) == XW){if(*( * (arr_map + x ) + (y+1)) == XW){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + x) + (y + 1)) == XIANGZI ){if (*( * (arr_map + x ) + (y+2)) == KONG){*( * (arr_map + x ) + (y+2)) = XIANGZI;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + x ) + (y+2)) == WEIZHI){*( * (arr_map + x ) + (y+2)) = XW;*( * (arr_map + x ) + (y+1)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + x) + (y+1)) == WEIZHI){*(*(arr_map + x) + (y+1)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + x) + (y+1)) == KONG){*(*(arr_map + x) + (y+1)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//→else if(key == 'w' || key == 'W')//↑{if (x-1 > 0){if(*(*(arr_map + (x)) +(y)) == RW)//人在最终位置{if(*( * (arr_map + (x-1) ) + (y)) == WEIZHI)//人上边还是最终位置{*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + (x) ) + y) = WEIZHI;}else if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW){if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + (x) ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + (x-1) ) + (y)) == WEIZHI)//人上边是最终位置{*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW)//人上边是箱子或在最终位置的箱子{if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + (x-1) ) + (y)) == XW || *( * (arr_map + (x-1) ) + (y)) == XIANGZI)//人上边有箱子或箱子在最终位置{if(*( * (arr_map + (x-1) ) + (y)) == XIANGZI || *( * (arr_map + (x-1) ) + (y)) == XW){if(*( * (arr_map + (x-1) ) + (y)) == XW){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x-1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x-2) ) + (y)) == KONG){*( * (arr_map + (x-2) ) + (y)) = XIANGZI;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x-2) ) + (y)) == WEIZHI){*( * (arr_map + (x-2) ) + (y)) = XW;*( * (arr_map + (x-1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + (x-1)) + (y)) == WEIZHI){*(*(arr_map + (x-1)) + (y)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + (x-1)) + (y)) == KONG){*(*(arr_map + (x-1)) + (y)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//↑else if(key == 's' || key == 'S')//↓{if (x < _x+1 > 0){if(*(*(arr_map + (x)) +(y)) == RW)//人在最终位置{if(*( * (arr_map + (x+1) ) + (y)) == WEIZHI)//人下边还是最终位置{*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + (x) ) + y) = WEIZHI;}else if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + (x) ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = WEIZHI;}}else if (*(*(arr_map + x) +(y)) == REN)//人在空位{if(*( * (arr_map + (x+1) ) + (y)) == WEIZHI)//人下边是最终位置{*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + y) = KONG;}else if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}//人在空位ENDelse if (*( * (arr_map + (x+1) ) + (y)) == XW || *( * (arr_map + (x+1) ) + (y)) == XIANGZI)//人下边有箱子或箱子在最终位置{if(*( * (arr_map + (x+1) ) + (y)) == XIANGZI || *( * (arr_map + (x+1) ) + (y)) == XW){if(*( * (arr_map + (x+1) ) + (y)) == XW){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = RW;*( * (arr_map + x ) + (y)) = KONG;}}else if(*(*(arr_map + (x+1)) + (y)) == XIANGZI ){if (*( * (arr_map + (x+2) ) + (y)) == KONG){*( * (arr_map + (x+2) ) + (y)) = XIANGZI;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}else if(*( * (arr_map + (x+2) ) + (y)) == WEIZHI){*( * (arr_map + (x+2) ) + (y)) = XW;*( * (arr_map + (x+1) ) + (y)) = REN;*( * (arr_map + x ) + (y)) = KONG;}}}}else if(*(*(arr_map + (x+1)) + (y)) == WEIZHI){*(*(arr_map + (x+1)) + (y)) = RW;*(*(arr_map + x) + (y)) = KONG;}else if(*(*(arr_map + (x+1)) + (y)) == KONG){*(*(arr_map + (x+1)) + (y)) = REN;*(*(arr_map + x) + (y)) = KONG;}}//IF(Y>0)END}//↓return;}}}}bool is_finish(int _x, int _y,int _total ,int (*arr_map)[Y])//判断是否完成推箱子(地图x,地图y,总箱子数,地图数组){int x,y,temp = 0;for (x = 0; x < _x; x++){for (y = 0; y < _y; y++){if (*(*(arr_map+x)+y) == XW){temp++;}}}if (_total == temp){return true;}return false;}。
C语⾔代码实现推箱⼦⼩游戏本⽂实例为⼤家分享了C语⾔实现推箱⼦⼩游戏的具体代码,供⼤家参考,具体内容如下本次游戏是个推箱⼦第⼀关最简单的⼩游戏有详细注释,下⾯是做出来的游戏界⾯游戏操作说明和功能说明:1、按wasd控制⼩⼈的上下左右移动。
2、按 r 重新开始游戏3、游戏开始有操作介绍4、游戏结束有胜利提⽰游戏原理分析1、游戏开始时的星星个数 = 箱⼦在星星上的个数时,游戏胜利。
2、按 r 键重新开始游戏,我们需要定义⼀个量 map_1[8][8] 来保存游戏初始时的界⾯,操作时我们将其赋值给 map[8][8] 来进⾏操作,以便重新归位,这⾥就⽤到了memcpy()函数。
3、wasd 代表上下左右操作⼈物移动,分别需要为其定义⼀个函数。
4、判断⼈物移动之前我们需要定位到⼈物的位置,这⾥我们⽤find()函数来定义。
⾸先从头⽂件开始介绍:#include<stdio.h>#include<stdlib.h> //malloc()函数#include<string.h> //memcpy()函数#include<conio.h> //getch()函数函数名称:malloc函数原型: void * malloc(unsigned size);函数功能: 分配size字节的存储区函数返回: 所分配的内存区地址,如果内存不够,返回0函数函数:memcpy函数原型:void *memcpy(void *dest, const void *src, size_t n);函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到⽬标dest所指的内存地址的起始位置中函数返回:函数返回指向dest的指针。
函数名称:getch函数原型: int getch(void);函数功能: 从控制台读取⼀个字符,但不显⽰在屏幕上函数返回: 读取的字符上图是简单的8*8的图,我们定义⼀个⼆维数组来保存整张图,⽤0,1,2,3,4 来代表游戏界⾯中的每个符号。
源程序:#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <dos.h>#define SIZE 20#define KEY_UP 0x4800#define KEY_DOWN 0x5000#define KEY_LEFT 0x4b00#define KEY_RIGHT 0x4d00#define KEY_ESC 0x011b#define Re 0x1372int Step=0,right_Step,top_Step;void cheshi(int a[][6],int n,int m) {int i,j;for(i=0;i<n;i++){for(j=0;j<m;j++)printf("%d ",a[i][j]);printf("\n");}}void Coloring(int x,int y,int subscript) {switch(subscript){case 0:{setfillstyle(1,DARKGRAY);break;}case 1:{setfillstyle(6,YELLOW);break;}case 2:{setfillstyle(8,DARKGRAY);break;}case 3:{setfillstyle(1,CYAN);break;}case 4:{setfillstyle(1,RED);break;}case 5:{setfillstyle(1,CYAN);break;}case 6:{setfillstyle(1,RED);break;}}bar(x,y,x+SIZE,y+SIZE);}void display(int guan[][6],int imax,int jmax){int gdriver = DETECT, gmode, errorcode;int left, top, right, bottom,x,y;int i,j;initgraph(&gdriver, &gmode, "");errorcode = graphresult();if (errorcode != grOk){printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:");getch();exit(1);}left=getmaxx()/2-jmax*SIZE+jmax*2+2;top=getmaxy()/2-((imax/2*SIZE)+(imax/2+4));right=left+jmax*SIZE+jmax*2+2;bottom=getmaxy()/2+(((imax-imax/2)*SIZE)+((imax-imax/2)+4));right_Step=right;top_Step=top;rectangle(left,top,right,bottom);for(i=0;i<imax;i++){for(j=0;j<jmax;j++){x=left+(j+1)*2+j*SIZE;y=top+(i+1)*2+i*SIZE;Coloring(x,y,guan[i][j]);}}setcolor(YELLOW);outtextxy(left,top-20,"UserYuH:BOX");setcolor(WHITE);outtextxy(right+10,top,"Guan:");outtextxy(right+10,top+20,"Step:");rectangle(left,bottom+4,left+82,bottom+20);settextjustify(LEFT_TEXT,TOP_TEXT);outtextxy(left+4,bottom+8,"R:refresh");rectangle(left+86,bottom+4,left+162,bottom+20);settextjustify(LEFT_TEXT,TOP_TEXT);outtextxy(left+92,bottom+8,"Esc:exit");}void CopyGuan(int guan[][6],int guan_all[][6],int imax,int jmax){int i,j;for(i=0;i<imax;i++)for(j=0;j<jmax;j++)guan[i][j]=guan_all[i][j];}void select_guan(int guan_all[][6],int guan[][6],int subi_j[],int ijmax[],int guan_num,int *fulfil) {int i,j;switch(guan_num){case 1:{*fulfil=2;subi_j[0]=2,subi_j[1]=0;ijmax[0]=6,ijmax[1]=4;CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);break;}case 2:{*fulfil=2;subi_j[0]=2,subi_j[1]=0;ijmax[0]=5,ijmax[1]=5;CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);break;}case 3:{*fulfil=1;subi_j[0]=3,subi_j[1]=3;ijmax[0]=6,ijmax[1]=6;break;}case 4:{*fulfil=0;subi_j[0]=1,subi_j[1]=1;ijmax[0]=6,ijmax[1]=6;break;}case 5:{*fulfil=0;subi_j[0]=4,subi_j[1]=2;ijmax[0]=5,ijmax[1]=6;break;}case 6:{*fulfil=1;subi_j[0]=0,subi_j[1]=4;ijmax[0]=6,ijmax[1]=5;break;}case 7:{*fulfil=0;subi_j[0]=2,subi_j[1]=4;ijmax[0]=6,ijmax[1]=5;break;}case 8:{*fulfil=0;subi_j[0]=0,subi_j[1]=4;ijmax[0]=6,ijmax[1]=6;break;}case 9:{*fulfil=0;subi_j[0]=3,subi_j[1]=1;ijmax[0]=4,ijmax[1]=6;break;}case 10:{*fulfil=1;subi_j[0]=3,subi_j[1]=3;ijmax[0]=6,ijmax[1]=5;break;}case 11:{*fulfil=1;subi_j[0]=4,subi_j[1]=1;ijmax[0]=6,ijmax[1]=5;break;}case 12:{*fulfil=0;subi_j[0]=0,subi_j[1]=2;ijmax[0]=5,ijmax[1]=6;break;case 13:{*fulfil=1;subi_j[0]=2,subi_j[1]=3;ijmax[0]=6,ijmax[1]=5;break;}case 14:{*fulfil=0;subi_j[0]=3,subi_j[1]=0;ijmax[0]=5,ijmax[1]=6;break;}case 15:{*fulfil=1;subi_j[0]=0,subi_j[1]=3;ijmax[0]=6,ijmax[1]=6;break;}case 16:{*fulfil=0;subi_j[0]=0,subi_j[1]=3;ijmax[0]=5,ijmax[1]=5;break;}case 17:{*fulfil=0;subi_j[0]=3,subi_j[1]=5;ijmax[0]=4,ijmax[1]=6;break;}case 18:{*fulfil=1;subi_j[0]=0,subi_j[1]=1;ijmax[0]=6,ijmax[1]=6;break;}case 19:*fulfil=0;subi_j[0]=5,subi_j[1]=4;ijmax[0]=6,ijmax[1]=6;break;}case 20:{*fulfil=2;subi_j[0]=1,subi_j[1]=4;ijmax[0]=5,ijmax[1]=6;break;}}CopyGuan(guan,guan_all,ijmax[0],ijmax[1]);}void Eixt(){exit(0);}void Move(int point,int guan[][6],int subi_j[],int imax,int jmax,int *fulfil) {int i,j,*ir,*jr,left,top;left=getmaxx()/2-jmax*SIZE+jmax*2+2;top=getmaxy()/2-((imax/2*SIZE)+(imax/2+4));ir=&subi_j[0],jr=&subi_j[1];i=*ir,j=*jr;switch(point){case 1:{if(i>0)i--;else break;if(guan[i][j]==0){if(guan[*ir][j]==6){guan[i][j]=4;guan[*ir][j]=2;}{guan[*ir][j]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]);*ir=i;Step++;}else if(guan[i][j]==3){if(i>0 && (guan[i-1][j]==0||guan[i-1][j]==2)){if(guan[i-1][j]==0)guan[i-1][j]=3;else{guan[i-1][j]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+(j+1)*2+j*SIZE,top+((i-1)+1)*2+(i-1)*SIZE,guan[i-1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(i>0 && (guan[i-1][j]==0||guan[i-1][j]==2)){if(guan[i-1][j]==0)guan[i-1][j]=3;else{guan[i-1][j]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+((i-1)+1)*2+(i-1)*SIZE,guan[i-1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}else if(guan[i][j]==2){guan[i][j]=6;if(guan[*ir][j]==4)guan[*ir][j]=0;elseguan[*ir][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]); *ir=i;Step++;}break;}case 2:{if(i<imax-1)i++;else break;if(guan[i][j]==0){if(guan[*ir][j]==6){guan[i][j]=4;guan[*ir][j]=2;}else{guan[*ir][j]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]); *ir=i;Step++;}else if(guan[i][j]==3){if(i<imax-1 && (guan[i+1][j]==0||guan[i+1][j]==2)){if(guan[i+1][j]==0)guan[i+1][j]=3;else{guan[i+1][j]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+(j+1)*2+j*SIZE,top+((i+1)+1)*2+(i+1)*SIZE,guan[i+1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(i<imax-1 && (guan[i+1][j]==0||guan[i+1][j]==2)){if(guan[i+1][j]==0)guan[i+1][j]=3;else{guan[i+1][j]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+((i+1)+1)*2+(i+1)*SIZE,guan[i+1][j]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[*ir][j]=4)guan[*ir][j]=0;elseguan[*ir][j]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(j+1)*2+j*SIZE,top+(*ir+1)*2+*ir*SIZE,guan[*ir][j]);*ir=i;Step++;}break;}case 3:{if(j>0)j--;else break;if(guan[i][j]==0){if(guan[i][*jr]==6){guan[i][j]=4;guan[i][*jr]=2;}else{guan[i][*jr]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}else if(guan[i][j]==3){if(j>0 && (guan[i][j-1]==0||guan[i][j-1]==2)){if(guan[i][j-1]==0)guan[i][j-1]=3;else{guan[i][j-1]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+((j-1)+1)*2+(j-1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j-1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(j>0 && (guan[i][j-1]==0||guan[i][j-1]==2)){if(guan[i][j-1]==0)guan[i][j-1]=3;else{guan[i][j-1]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+((j-1)+1)*2+(j-1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j-1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[i][*jr]==4)guan[i][*jr]=0;elseguan[i][*jr]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}break;}case 4:{if(j<jmax-1)j++;else break;if(guan[i][j]==0){if(guan[i][*jr]==6){guan[i][j]=4;guan[i][*jr]=2;}else{guan[i][*jr]=0;guan[i][j]=4;}Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}else if(guan[i][j]==3){if(j<jmax-1 && (guan[i][j+1]==0||guan[i][j+1]==2)){if(guan[i][j+1]==0)guan[i][j+1]=3;else{guan[i][j+1]=5;(*fulfil)++;}guan[i][j]=0;Coloring(left+((j+1)+1)*2+(j+1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j+1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;}}else if(guan[i][j]==5){if(j<jmax-1 && (guan[i][j+1]==0||guan[i][j+1]==2)){if(guan[i][j+1]==0)guan[i][j+1]=3;else{guan[i][j+1]=5;(*fulfil)++;}guan[i][j]=2;Coloring(left+((j+1)+1)*2+(j+1)*SIZE,top+(i+1)*2+i*SIZE,guan[i][j+1]); Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Step++;(*fulfil)--;}}else if(guan[i][j]==2){guan[i][j]=6;if(guan[i][*jr]==4)guan[i][*jr]=0;elseguan[i][*jr]=2;Coloring(left+(j+1)*2+j*SIZE,top+(i+1)*2+i*SIZE,guan[i][j]);Coloring(left+(*jr+1)*2+*jr*SIZE,top+(i+1)*2+i*SIZE,guan[i][*jr]);*jr=j;Step++;}break;}}}void YouWin(void){setcolor(RED);rectangle(getmaxx()/2-50,getmaxy()/2-20,getmaxx()/2+50,getmaxy()/2+15); settextjustify(LEFT_TEXT,TOP_TEXT);setcolor(WHITE);outtextxy(getmaxx()/2-46,getmaxy()/2-16,"YOU WIN!");outtextxy(getmaxx()/2-46,getmaxy()/2,"Next:Enter");getch();clrscr();}int main(void){int guan[6][6],subi_j[2],ijmax[2],guan_num=1,key,fulfil=0,point;char s[10];int guan_all[20][6][6]={0,0,2,0,0,0,0,1,0,5,0,0,4,0,3,0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,5,0,0,0,0,1,0,0,0,4,3,5,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,0,2,0,2,3,1,0,0,3,4,0,0,1,1,1,5,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,4,0,0,3,0,1,3,1,1,2,2,1,0,2,1,0,0,1,3,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,2,1,1,3,0,0,2,2,3,0,0,0,0,1,3,0,0,0,0,4,0,1,1,0,0,0,0,0,0,1,1,1,0,4,0,0,0,5,3,0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,3,0,1,1,0,1,0,2,1,1,0,2,1,1,1,2,0,0,1,0,0,2,0,0,3,3,0,4,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,0,4,1,1,1,1,0,0,0,2,0,1,3,3,0,0,0,0,0,0,1,2,0,0,3,1,1,1,2,0,0,1,1,0,2,2,1,1,1,0,3,0,0,0,0,0,0,1,3,1,0,0,4,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,0,3,0,1,0,0,0,5,3,0,0,0,0,2,1,4,0,0,0,0,0,0,1,0,0,0,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,2,0,1,0,0,0,3,5,3,0,0,1,4,0,1,1,0,1,0,0,1,1,0,1,0,4,0,1,1,1,0,2,0,0,0,2,0,3,2,3,0,1,3,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,3,1,0,1,0,0,2,0,4,1,0,0,5,0,0,0,0,1,0,1,3,0,0,1,2,0,0,1,0,1,0,0,1,1,1,2,2,3,0,0,2,0,1,3,0,3,0,4,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,4,1,1,0,3,1,0,1,1,0,5,0,3,0,0,0,0,0,1,1,0,1,2,0,0,2,0,1,1,0,0,0,1,0,0,0,4,1,0,0,0,1,0,0,0,2,0,0,3,0,0,0,3,3,1,2,0,1,1,0,0,2,0,0,0,0,0,0,0,1,1,2,0,1,1,0,2,0,0,1,1,0,0,0,3,3,0,1,0,2,0,3,4,0,0,0,0,0,0,0,0,0,0,0,0,1,4,2,0,0,1,0,3,3,5,0,1,0,0,1,0,0,1,0,0,1,0,0,2,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,3,2,1,1,0,0,2,0,1,1,0,0,1,2,0,3,0,0,3,0,0,0,0,1,4,0,0,0,0,1,1,1,0,1,0,5,4,1,0,0,5,0,0,0,1,1,3,0,0,0,1,1,0,0,0,2,0,0,0,0,0,0};while(guan_num<=20){loop1:select_guan(guan_all[guan_num-1],guan,subi_j,ijmax,guan_num,&fulfil);display(guan,ijmax[0],ijmax[1]);itoa(guan_num,s,10);setcolor(YELLOW);outtextxy(right_Step+50,top_Step,s);Step=0;while(fulfil!=3){if(bioskey(1))key=bioskey(0);else key=0;if(key)switch(key){case KEY_UP:point=1;break;case KEY_DOWN:point=2;break;case KEY_LEFT:point=3;break;case KEY_RIGHT:point=4;break;case KEY_ESC:Eixt();case Re:clrscr();goto loop1;break;/*default: printf("%x\n",key);*/}if(point){Move(point,guan,subi_j,ijmax[0],ijmax[1],&fulfil);point=0;itoa(Step,s,10);setfillstyle(1,0x0000);bar(right_Step+50,top_Step+20,right_Step+100,top_Step+40); setcolor(YELLOW);outtextxy(right_Step+50,top_Step+20,s);}}if(fulfil==3){YouWin();guan_num++;}}getch();closegraph();return 0;}。
CC++实现推箱⼦⼩游戏本⽂实例为⼤家分享了C/C++实现推箱⼦⼩游戏的具体代码,供⼤家参考,具体内容如下效果演⽰实现功能如上图所⽰。
按键控制⼩猪的运动,推箱⼦到达⽬的地。
如何实现1.⾸先思考要保存箱⼦,⼩猪等信息,添加多个map可以⽤到三维数组。
2.定义⼩猪,箱⼦,墙,空地等信息在三维数组⾥的数值。
空地 0墙 1⽬的地 2箱⼦ 3猪 4 2+4=6 猪到达⽬的地也显⽰猪箱⼦到达⽬的地 2+3=53.按键实现推箱⼦运动。
考虑多种情况:①.⼩猪的运动(空地,⽬的在)②.⼩猪推箱⼦运动(空地,⽬的地)⽤三维数组保存map信息:这⾥我只做了两种图,可⾃⾏添加int backgrand[MAP][ROW][COL] =//map图{{1, 1, 1, 1, 1, 1, 1, 1,1, 0, 0, 0, 2, 0, 0, 1,1, 1, 0, 0, 3, 1, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 3, 3, 2, 1,1, 1, 0, 3, 2, 0, 0, 1,1, 0, 0, 2, 0, 0, 1, 1,1, 1, 1, 1, 1, 1, 1, 1},{0, 1, 1, 1, 1, 1, 1, 1,1, 1, 0, 2, 0, 0, 0, 1,1, 1, 0, 0, 3, 0, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 0, 0, 1, 1,1, 1, 0, 3, 2, 3, 0, 1,1, 0, 0, 0, 0, 2, 0, 1,1, 1, 1, 1, 1, 1, 1, 1},};绘图⽤到了easyx库,加载图⽚和绘制窗⼝只⽤到了三条语句:很简单initgraph();//绘制窗⼝⼤⼩loadimage();//加载图⽚putinmage();//放出图⽚具体可看代码!代码块#include<stdio.h>#include<Windows.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<graphics.h>#define ROW 8#define COL 8#define MAP 2//map个可以⾃⼰添加数int count = 0;//哪个map图/*空地 0墙 1⽬的地 2箱⼦ 3猪 4 2+4=6 猪到达⽬的地也显⽰猪箱⼦到达⽬的地 2+3=5*/IMAGE image1, image2, image3, image4, image5, image6;int backgrand[MAP][ROW][COL] =//map图{{1, 1, 1, 1, 1, 1, 1, 1,1, 0, 0, 0, 2, 0, 0, 1,1, 1, 0, 0, 3, 1, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 3, 3, 2, 1,1, 1, 0, 3, 2, 0, 0, 1,1, 0, 0, 2, 0, 0, 1, 1,1, 1, 1, 1, 1, 1, 1, 1},{0, 1, 1, 1, 1, 1, 1, 1,1, 1, 0, 2, 0, 0, 0, 1,1, 1, 0, 0, 3, 0, 1, 1,1, 2, 3, 0, 4, 0, 0, 1,1, 0, 1, 0, 0, 0, 1, 1,1, 1, 0, 3, 2, 3, 0, 1,1, 0, 0, 0, 0, 2, 0, 1,1, 1, 1, 1, 1, 1, 1, 1},};int Judge(){//p判断是否结束⼀局int i = 0;for (i = 0; i < ROW; i++){int j = 0;for (j = 0; j < COL; j++){if (backgrand[count][i][j] == 3 || backgrand[count][i][j] == 2){//判断是否还有箱⼦或者⽬的地 return 0;}}}return 1;}void Backgrand(){//绘制地图int i = 0;for (; i < ROW; i++){int j = 0;for (; j < COL; j++){int x = 80 * j;//横轴是y(列),数轴是x(⾏)。
设为首页收藏本站快捷导航论坛视频教程c/c++PHP 问答平台编程文章个人空间搜索QQ 群热搜:c 语言java 编程教程自学去学论坛编程语言C/C++c 语言编写小游戏系列教程之推动箱子返回列表电梯直达楼主admin 在线 |每日签到 |我的 |设置 |消息 |提醒(2) |门户管理 |管理中心 |退出积分: 9681 |用户组: 管理员请输入搜索内容帖子索删除主题|升降|置顶|直播|高亮|精华|图章|图标|关闭|移动|分类|复制|合并|分割|修复|警告|屏蔽|标签|生成文章查看: 519|回复: 1[精品文章] c语言编写小游戏系列教程之推动箱子 [复制链接]admin 790主题3975帖子9681积分管理员 发表于 201514 18:47:19 | 只看该作者 上节课:/thread1544811.html上节课中 我们已经实现了人物的移动,大家的可以发现,人物可以移动,但是却不能推动箱子,还能穿过障碍物和箱子。
这节课,我们的人物,就是解决这两个问题,推动箱子,还有障碍物检测。
在这之前不得不先说一个问题,随着程序代码越来越多,我们一个文件中代码已经很长了,这样不利于代码的阅读和维护,所以这节课我们决定将代码 按照功能来分成不同的文件,类似模块化编程,每个功能就是一个模块。
如何把代码放到多个文件呢?把代码的申明部分放到,头文件中,实现部分 放到源文件中。
消息新听众(3)坛友互动(1)我的帖子(1)积分9681IP 编辑禁止帖子清理比如,关于箱子操作的函数以及箱子的结构体定义,我们就放在 box.h 中 函数的具体功能实现就放在 box.c 中。
人物操作 就放在 person.h 和 person.c 中。
其他的也是 类似。
头文件如何写?我们看看例子,下面是 box.h 的所有内容01. #ifndef _BOX_H_02. #define _BOX_H_03.04. #include <config.h>05.06. //定义箱子结构体07. typedef struct{08. int x;09. int y;10. char flag;11. int state;12. } box_t;13.14. //设置箱子位置15. void set_box(box_t*, int x, int y);16. //移动箱子,返回0表示成功移动,返回非0表示不能移动17. int move_box(box_t*, dir_t);18. //根据地图坐标获取指定box19. box_t* get_box(int x, int y);20.21. #endif复制代码#ifndef _BOX_H_#define _BOX_H_.............#endif这段代码,作用是防止头文件被重复的包含,重复包含,这些函数就会被重复的申明,编译器将报错。