推箱子~
昨天在网上上了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编辑过]










经典游戏。适合练习算法