Hint1:想象一个棋盘,我们可以在上面放一个棋子,无论棋子如何移动,棋盘是不会有任何改变的。同理,我们把“大熊弟”和地图分别想象成棋子和棋盘,将它们分离开来,地图归地图,“大熊弟”归”大熊弟”,然后就和棋子在棋盘上移动一样啦。
Hint2:我们用两个变量(x,y)表示”大熊弟“在地图上的位置,用一个二维数组来存下map[][]来存下地图,把大熊弟所在的初始位置map[i,j]赋值成空格’ ‘,以后无论大熊弟(棋子)怎么移动,我们都不改变地图(棋盘)。
Hint3:关于方向的问题,我们可以设一个数组来表示往不同的方向走
第一维表示方向,第二维的0对应x坐标,1对应y坐标。那么对于一次移动,我们就只需要
这样就从旧的大熊弟的坐标(x,y),得到相应移动后的新的大熊弟的坐标(nx,ny),这样就可以帮助我们减少代码量,避免200+,300+行的情况出现啦^_^。
Hint4:得到坐标之后,我们就要判断这个nx,ny是不是一个合法的坐标,不合法的话我们就对这个坐标进行maintain操作
Hint5:输出的时候我们就直接输出我们一开始存下来那个和棋子分离了的地图,在输出到i=x,j=y的时候改成输出’A’就可以了,其他的都不变。
//不要ctrl+c & ctrl+v!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 22
int n,x,y;
char map[MAXN][MAXN],con[5];
int dir[128][2];
_Bool flag;
void Scan(){
scanf("%d",&n);
getchar();
n+=2;
for (int i = 0; i < n; i ++) {
fgets(map[i],n+10,stdin);
map[i][n]=0;
}
}
void Maintain(int *x){
if (*x<1) *x = n - 2;
if (*x>n-2) *x = 1;
}
void Print(int x,int y){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++)
if ((i==x)&&(j==y))
printf("A");
else
printf("%c",map[i][j]);
printf("\n");
}
}
void Move(int k){
if (flag) {
Print(x,y);
flag=0;
}
else {
int nx=x+dir[k][0],ny=y+dir[k][1];
Maintain(&nx);
Maintain(&ny);
if (map[nx][ny]=='$') {
puts("Game Over!");
exit(0);
}
if (map[nx][ny]=='@') flag=1;
if (map[nx][ny]=='#') {
nx=x;
ny=y;
}
Print(nx,ny);
x=nx;
y=ny;
}
}
int Work(){
for (int i = 0 ;i < n; i ++)
for (int j = 0 ;j < n; j++){
if (map[i][j]=='A') {
x = i;
y = j;
map[i][j]=' ';
}
}
flag=0;
while (scanf("%s",con)!=EOF)
Move(con[0]);
}
void Preprocessing(){
dir['a'][0]=0;dir['a'][1]=-1;
dir['d'][0]=0;dir['d'][1]=1;
dir['w'][0]=-1;dir['w'][1]=0;
dir['s'][0]=1;dir['s'][1]=0;
}
int main(){
//freopen("in.txt","r",stdin);这两个函数很实用
//freopen("out.txt","w",stdout);建议学一下
Preprocessing();
Scan();
Work();
}