推箱子~
昨天在网上上了C/C++的实践课~讲了关于推箱子的内容~于是九九就敲了一下~感觉效果不错~可以自己改改地图~程序代码:
#include<stdio.h> #include<conio.h> #include<windows.h> #define N 10//地图规模大小 int Game_Print(int map[N][N],int man[]); int Game_Play(int map[N][N],int x,int y); int Game_Move(); int main() { int map[N][N]= { {1,1,1,1,1,1,1,1,1,1},//0空地 {1,0,0,0,0,0,0,0,0,1},//1墙 {1,0,0,5,0,0,0,0,0,1},//3目的地 {1,0,0,0,0,0,0,3,0,1},//4箱子 {1,0,0,0,0,0,0,3,0,1},//7箱子+目的地 {1,0,0,0,1,0,0,3,0,1},//8人+目的地 {1,0,0,4,4,4,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}, }; int man[2]={0};//初始化人物坐标 int flag=Game_Print(map,man);//初始化地图 while (flag) if (Game_Play(map,man[0],man[1])) flag=Game_Print(map,man); printf("恭喜过关!\n"); return 0; } int Game_Print(int map[N][N],int man[]) { int i=0; int j=0; int flag=0; char p[]={" #!*@o!$&"};//地图元素 for (system("cls");i!=N;++i) for (j=0;j!=N+1;++j) { if (map[i][j]==5||map[i][j]==8)//获取人物坐标 { man[0]=i; man[1]=j; } flag+=(map[i][j]==4);//当地图有箱子时~ putchar(j!=N?p[map[i][j]]:'\n');//输出数据 } return flag; } int Game_Move() { char move=getch(); char a[]={'w','W',72,'s','S',80,'a','A',75,'d','D',77,'\0'}; int k=strcspn(a,&move)/3+1; return (((k+1)/2)*(1-2*(k%2)))%3; } int Game_Play(int map[N][N],int x,int y) { int move=Game_Move();//获取人物方向 int* k0=&map[x][y];//人的位置 int* k1=&map[x+move%2][y+(move+1)%2];//获取的前一个位置 int* k2=(*k1==4||*k1==7)?&map[x+2*(move%2)][y+2*((move+1)%2)]:NULL;//获取人物的前面二个位置 if (move==0)//如果无效输入 return 0; if (*k1==0||*k1==3)//如果第一个位置是空地或者是目的地 { *k0-=5; *k1+=5; return 1;//处理完毕 } if ((*k1==4||*k1==7)&&(*k2==0||*k2==3))//如果第一个位置是箱子或者是箱子+目的地 { *k0-=5; *k1+=1; *k2+=4; return 1;//处理完毕 } return 0;//无效移动 }
[此贴子已经被作者于2017-2-23 03:28编辑过]