C语言小程序——推箱子(窄字符Version)

推箱子.c

 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include "Game.h" #define N 100 /* 二维数组最大100*100 */
#define NTAB 24 /* 调整界面位置 */
#define YES 1 /* 可以移动 */
#define NO 0 /* 不能移动 */
#define MAP_MAX 6 /* 最大关卡数 */ int suc = ;/* 通关判定 */ void OpenMap(FILE **fp, int map); /* 打开地图文件 */
void InitMap(char (*map)[N]); /* 地图初始化 */
void JudgeFopen_s(errno_t err); /* 判断文件打开是否成功 */
void ReadMap(char (*map)[N], FILE *fp, int *x, int *y, int *suc); /* 读取地图 */
void DisplyMap(char (*map)[N]); /* 打印地图 */ void PlayerMove(int move, int *x, int *y, char (*map)[N]); /* 玩家移动*/
void JudgePlayerMove(int move, int *x, int *y, char (*map)[N]); /* 判断玩家移动方向 */
int JudgeBarr(int move, int *x, int *y, char(*map)[N]); /* 判断玩家移动方向上是否有障碍物 */
int JudgeBarrType(int move, int *x, int *y, char(*map)[N]); /* 判断障碍物类别 */
void BoxMove(int move, int *x, int *y, char(*map)[N]); /* 箱子移动 */
int IsBox(int move, int *x, int *y, char(*map)[N]); /* 判断是否推动的是箱子*/
int JudgeBoxBoun(int move, int *x, int *y, char(*map)[N]); /* 判断箱子能否被推动 */
void RefreshBox(int move, int *x, int *y, char(*map)[N]); /* 更新移动后的箱子的位置 */
void RefreshPlayer(int move, int *x, int *y, char(*map)[N]);/* 更新移动后的玩家位置 */
int JudgePlayerOri(int move, int *x, int *y, char(*map)[N]);/* 判断玩家原位置是不是空地 */
int JudgeBoxDes(int move, int *x, int *y, char(*map)[N]); /* 判断箱子移动后的位置是不是目标点 */
int JudgeBoxOri(int move, int *x, int *y, char(*map)[N]); /* 判断箱子原位置是不是目标点 */
int JudgePlayerDes(int move, int *x, int *y, char(*map)[N]);/* 判断玩家移动后的位置是不是目标点 */
int JudgeSuc(FILE **fp, int *suc, int *num, char (*map)[N], int *x, int *y); /* 判断是否通关 */
void SucCount(int move, int *x, int *y, char(*map)[N], int *suc); /* 通关条件计数 */ /* Game: 推箱子 */
/* WASD移动 */
int main()
{
FILE *fp;
int order; /* 指令 */
int move; /* 移动方向 */
char ss[N][N]; /* 地图 */
int x, y; /* 玩家坐标 */
int level = ; /* 当前关卡数 */ OpenMap(&fp, level); /* 打开存储地图的文件 */ HideCursor(); /* 隐藏光标 */
InitMap(ss); /* 初始化地图 */
ReadMap(ss, fp, &x, &y, &suc);/* 读取地图 */
DisplyMap(ss); /* 打印地图 */
while ()
{
order = _getch(); /* 接收指令 */
move = MoveByWasd(order); /* 判断移动方向 */
JudgePlayerMove(move, &x, &y, ss); /* 玩家移动 */
JudgeSuc(&fp, &suc, &level, ss, &x, &y); /* 判断是否通关 */
} return ;
} /* Function: 打开地图文件*/
void OpenMap(FILE **fp, int map)
{
errno_t err; switch(map)
{
case :
{
err = fopen_s(fp, "m1.txt", "r"); /* 文件打开成功返回0值,否则返回非0值*/
JudgeFopen_s(err); /* 判断文件打开是否成功 */
break;
}
case :
{
err = fopen_s(fp, "m2.txt", "r");
JudgeFopen_s(err);
break;
}
case :
{
err = fopen_s(fp, "m3.txt", "r");
JudgeFopen_s(err);
break;
}
case :
{
err = fopen_s(fp, "m4.txt", "r");
JudgeFopen_s(err);
break;
}
case :
{
err = fopen_s(fp, "m5.txt", "r");
JudgeFopen_s(err);
break;
}
case :
{
err = fopen_s(fp, "m6.txt", "r");
JudgeFopen_s(err);
break;
}
default:
{
system("cls");
printf("\t\t\t没有更多了关卡了,即将退出游戏");
Sleep();
exit();
}
}
}
/* Function: 通关条件计数 */
void SucCount(int move, int *x, int *y, char(*map)[N],int *suc)
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
return;
}
else /* 箱子移动后的位置是目标点*/
{
(*suc)--;
return;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
(*suc)++;
return;
}
else /* 箱子移动后的位置是目标点*/
{
return;
}
}
} /* Function: 判断是否通关 */
int JudgeSuc(FILE **fp, int *suc, int *num, char (*map)[N], int *x, int *y)
{
if ((*suc) == )
{
(*suc) = ; /* 关卡通关计数重置 */
(*num)++; /* 关卡数+1 */ system("cls");
if ((*num) <= MAP_MAX)
{
printf("\t\t\t通关!即将进入第下一关");
}
else
{
system("cls");
printf("\t\t\t没有更多了关卡了,即将退出游戏");
Sleep();
exit();
} Sleep();
system("cls"); OpenMap(fp,*num); /* 打开地图文件 */
InitMap(map); /* 初始化地图 */
ReadMap(map, *fp, x, y, suc);/* 读取地图 */
DisplyMap(map); /* 打印地图 */ return YES; /* 通关 */
}
else
{
return NO;
}
}
/* Function: 玩家移动*/
void PlayerMove(int move, int *x, int *y, char (*map)[N])
{
switch(move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*x+NTAB, *y);printf(" ");(*y)--;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */
}
else /* 玩家原位置是目标点 */
{
gotoxy(*x+NTAB, *y);printf("*");(*y)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */
}
}
case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*x+NTAB, *y);printf(" ");(*y)++;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */
}
else
{
gotoxy(*x+NTAB, *y);printf("*");(*y)++;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */
}
}
case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*x+NTAB, *y);printf(" ");(*x)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */
}
else
{
gotoxy(*x+NTAB, *y);printf("*");(*x)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*x+NTAB, *y);printf(" ");(*x)++;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */
}
else
{
gotoxy(*x+NTAB, *y);printf("*");(*x)++;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */
}
}
default: break;
}
}
/* Function: 判断玩家移动后的位置是不是目标点 */
int JudgePlayerDes(int move, int *x, int *y, char(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == '*') /* 移动后的位置是目标点 */
{
return YES;
}
else
{
return NO;
}
}
case DOWN:
{
if (map[(*y)+][*x] == '*')
{
return YES;
}
else
{
return NO;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '*')
{
return YES;
}
else
{
return NO;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '*')
{
return YES;
}
else
{
return NO;
}
}
default: return NO;
}
} /* Function: 判断箱子原位置是不是目标点 */
int JudgeBoxOri(int move, int *x, int *y, char(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == '$') /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == '$') /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '$') /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '$') /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
}
/* Function: 判断箱子移动后的位置是不是目标点 */
int JudgeBoxDes(int move, int *x, int *y, char(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == '*') /* 箱子移动后是目标点 */
{
return NO;
}
else /* 箱子移动后不是目标点 */
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == '*')
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '*')
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '*')
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
}
/* Function: 判断障碍物类别 */
int JudgeBarrType(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == '#') /* 如果目标地点是墙壁 */
{
return NO; /* 无法移动 */
}
else
{
return YES;/* 不是墙,需要进一步判断 */
}
}
case DOWN:
{
if (map[(*y)+][*x] == '#')
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '#')
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '#')
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function: 更新移动后的玩家位置 */
void RefreshPlayer(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = ' ';map[(*y)-][*x] = '*';break;
}
else
{
map[*y][*x] = ' ';map[(*y)-][*x] = 'I';break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = '*';map[(*y)-][*x] = '*';break;
}
else
{
map[*y][*x] = '*';map[(*y)-][*x] = 'I';break;
}
}
}
case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = ' ';map[(*y)+][*x] = '*';break;
}
else
{
map[*y][*x] = ' ';map[(*y)+][*x] = 'I';break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = '*';map[(*y)+][*x] = '*';break;
}
else
{
map[*y][*x] = '*';map[(*y)+][*x] = 'I';break;
}
}
}
case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = ' ';map[*y][(*x)-] = '*';break;
}
else
{
map[*y][*x] = ' ';map[*y][(*x)-] = 'I';break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = '*';map[*y][(*x)-] = '*';break;
}
else
{
map[*y][*x] = '*';map[*y][(*x)-] = 'I';break;
}
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = ' ';map[*y][(*x)+] = '*';break;
}
else
{
map[*y][*x] = ' ';map[*y][(*x)+] = 'I';break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = '*';map[*y][(*x)+] = '*';break;
}
else
{
map[*y][*x] = '*';map[*y][(*x)+] = 'I';break;
}
}
}
}
} /* Function: 判断玩家原位置是不是空地*/
int JudgePlayerOri(int move, int *x, int *y, char(*map)[N])
{
if (map[*y][*x] == '*')
{
return NO;
}
else
{
return YES; /* 是空地 */
}
}
/* Function: 判断箱子移动之后的位置是不是目标点 */ /* FunctionL 更新移动后的箱子位置 */
void RefreshBox(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)-][*x] = ' ';map[(*y)-][*x] = '@';break;
}
else
{
map[(*y)-][*x] = ' ';map[(*y)-][*x] = '$';break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)-][*x] = '*';map[(*y)-][*x] = '@';break;
}
else
{
map[(*y)-][*x] = '*';map[(*y)-][*x] = '$';break;
}
}
}
case DOWN:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)+][*x] = ' ';map[(*y)+][*x] = '@';break;
}
else
{
map[(*y)+][*x] = ' ';map[(*y)+][*x] = '$';break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)+][*x] = '*';map[(*y)+][*x] = '@';break;
}
else
{
map[(*y)+][*x] = '*';map[(*y)+][*x] = '$';break;
}
}
}
case LEFT:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)-] = ' ';map[*y][(*x)-] = '@';break;
}
else
{
map[*y][(*x)-] = ' ';map[*y][(*x)-] = '$';break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)-] = '*';map[*y][(*x)-] = '@';break;
}
else
{
map[*y][(*x)-] = '*';map[*y][(*x)-] = '$';break;
}
}
} case RIGHT:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)+] = ' ';map[*y][(*x)+] = '@';break;
}
else
{
map[*y][(*x)+] = ' ';map[*y][(*x)+] = '$';break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)+] = '*';map[*y][(*x)+] = '@';break;
}
else
{
map[*y][(*x)+] = '*';map[*y][(*x)+] = '$';break;
}
}
}
}
}
/* Functioni: 判断箱子能否被推动 */
int JudgeBoxBoun(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == '#' || map[(*y)-][*x] == '@' || map[(*y)-][*x] == '$') /* 箱子被推动的方向 是墙壁,或者是另一个箱子*/
{
return NO;
}
else
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == '#' || map[(*y)+][*x] == '@' || map[(*y)+][*x] == '$')
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '#' || map[*y][(*x)-] == '@' || map[*y][(*x)-] == '$')
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '#' || map[*y][(*x)+] == '@' || map[*y][(*x)+] == '$')
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function: 判断移动方向上是否有箱子 */
int IsBox(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == '@' || map[(*y)-][*x] == '$') /* 如果是在空地上的箱子 或 在目标点上的箱子 */
{
return YES;
}
else
{
return NO;
}
}
case DOWN:
{
if (map[(*y)+][*x] == '@' || map[(*y)+][*x] == '$')
{
return YES;
}
else
{
return NO;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '@' || map[*y][(*x)-] == '$')
{
return YES;
}
else
{
return NO;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '@' || map[*y][(*x)+] == '$')
{
return YES;
}
else
{
return NO;
}
}
default: return NO; }
} /* Function: 箱子移动 */
void BoxMove(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*x+NTAB, (*y)-);printf(" ");gotoxy(*x+NTAB, (*y)-);printf("@");break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy(*x+NTAB, (*y)-);printf(" ");gotoxy(*x+NTAB, (*y)-);printf("$");break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*x+NTAB, (*y)-);printf("*");gotoxy(*x+NTAB, (*y)-);printf("@");break; /* 箱子移动 */
}
else
{
gotoxy(*x+NTAB, (*y)-);printf("*");gotoxy(*x+NTAB, (*y)-);printf("$");break; /* 箱子移动 */
}
}
}
case DOWN:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*x+NTAB, (*y)+);printf(" ");gotoxy(*x+NTAB, (*y)+);printf("@");break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy(*x+NTAB, (*y)+);printf(" ");gotoxy(*x+NTAB, (*y)+);printf("$");break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*x+NTAB, (*y)+);printf("*");gotoxy(*x+NTAB, (*y)+);printf("@");break; /* 箱子移动 */
}
else
{
gotoxy(*x+NTAB, (*y)+);printf("*");gotoxy(*x+NTAB, (*y)+);printf("$");break; /* 箱子移动 */
}
}
}
case LEFT:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*x+NTAB)-, *y);printf(" ");gotoxy((*x+NTAB)-, *y);printf("@");break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy((*x+NTAB)-, *y);printf(" ");gotoxy((*x+NTAB)-, *y);printf("$");break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*x+NTAB)-, *y);printf("*");gotoxy((*x+NTAB)-, *y);printf("@");break; /* 箱子移动 */
}
else
{
gotoxy((*x+NTAB)-, *y);printf("*");gotoxy((*x+NTAB)-, *y);printf("$");break; /* 箱子移动 */
}
}
}
case RIGHT:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*x+NTAB)+, *y);printf(" ");gotoxy((*x+NTAB)+, *y);printf("@");break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy((*x+NTAB)+, *y);printf(" ");gotoxy((*x+NTAB)+, *y);printf("$");break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*x+NTAB)+, *y);printf("*");gotoxy((*x+NTAB)+, *y);printf("@");break; /* 箱子移动 */
}
else
{
gotoxy((*x+NTAB)+, *y);printf("*");gotoxy((*x+NTAB)+, *y);printf("$");break; /* 箱子移动 */
}
}
}
default: break;
}
} /* Function:判断玩家移动方向上是否有障碍物 */
int JudgeBarr(int move, int *x, int *y, char(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == '#' || map[(*y)-][*x] == '@' || map[(*y)-][*x] == '*' || map[(*y)-][*x] == '$') /* 如果是墙壁、箱子、目标点 */
{
return NO; /* 需要进一步判断 */
}
else
{
return YES; /* 没有障碍物 */
}
}
case DOWN:
{
if (map[(*y)+][*x] == '#' || map[(*y)+][*x] == '@' || map[(*y)+][*x] == '*' || map[(*y)+][*x] == '$')
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == '#' || map[*y][(*x)-] == '@' || map[*y][(*x)-] == '*' || map[*y][(*x)-] == '$')
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == '#' || map[*y][(*x)+] == '@' || map[*y][(*x)+] == '*' || map[*y][(*x)+] == '$')
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function:玩家移动 */
void JudgePlayerMove(int move, int *x, int *y, char (*map)[N])
{
switch (move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else /* 玩家原位置为目标点 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
} case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
} case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
}
default: break;
}
}
} /* Function: 打印地图 */
void DisplyMap(char (*map)[N])
{
int i, j; for (i = ; i < N ;i++)
{
printf("\t\t\t");
for (j = ; j < N; j++)
{
if (map[i][j] == -)
{
break;
}
if (map[i][j] != '\n')
{
printf("%c", map[i][j]);
}
else if (map[i][j] == '\n')
{
printf("%c", map[i][j]);
break;
} }
if (map[i][j] == -)
{
break;
}
}
} /* Function: 读取地图 */
void ReadMap(char (*map)[N], FILE *fp, int *x, int *y,int *suc)
{
int i, j;
int n; i = j = ;
while(!feof(fp)) /* 未读到文件末尾 */
{
fscanf_s(fp, "%c", &map[i][j], sizeof(char));
if (map[i][j] == '*')
{
(*suc)++; /* suc的值为当前关卡目标点的个数 */
}
if (map[i][j] == 'I') /* 读取到玩家图标 */
{
*x = j;
*y = i;
}
n = j; /* 存储j自增之前的值,方便判断是不是换行符*/
j++;
if (map[i][n] == '\n')
{
i++;
j = ;
} }
map[i][j-] = EOF;/* 作为文件结束标志的EOF不会被读取存储到二维数组中,需要手动添加 */
} /* Function: 初始化地图 */
void InitMap(char (*map)[N])
{
int i, j; for (i = ;i < N; i++)
{
for (j = ; j < N; j++)
{
map[i][j] = ' ';
}
}
} /* Function: 判断文件打开是否成功 */
void JudgeFopen_s(errno_t err)
{
if (err != )
{
printf("地图文件打开失败,请检查地图文件\n");
system("pause");
exit();
}
}

刚开始想尝试下多文件编程就把两个子函数写在另外一个c文件里面了,函数的声明放在的Game.h里面

Move.c

 #include <Windows.h>
#include "Game.h" /* Function: WASD移动*/
/* Date:2019/4/10 */
int MoveByWasd(int move)
{
switch(move)
{
case 'A':case 'a': return LEFT;
case 'D':case 'd': return RIGHT;
case 'W':case 'w': return UP;
case 'S':case 's': return DOWN;
default: return WRONG;
}
} /* Function: 隐藏光标 */
/* Date:2019/4/10 */
void HideCursor ()
{
HANDLE hOut;
CONSOLE_CURSOR_INFO cur; cur.bVisible = ; /* 光标不可见 */
cur.dwSize = ; /* 光标大小必须要设定一个1~100之间的值,不然光标无法隐藏 */
hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */
SetConsoleCursorInfo(hOut, &cur); /* 隐藏光标 */
} /* Function: 光标转移到指定位置 */
/* Date:2019/4/12 */
void gotoxy(int x, int y)
{
COORD pos = {x, y}; /* 光标坐标 */
HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */
SetConsoleCursorPosition(hOut,pos); /* 移动光标到指定位置 */
}

Game.h

 int MoveByWasd(int move);
void gotoxy(int x, int y);
void HideCursor (); #ifndef _GAME_H
#define _GAME_H #define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
#define WRONG 5 #endif

代码本身存在很多问题,函数命名不规范、if-else嵌套过多、switch重复判断,后面会尝试优化下逻辑,将代码行数控制到1000行以内

最终效果:

下面大概列出在完成推箱子这个C程序时大概的过程:

第一步:玩家移动

第二步:玩家移动同时控制边界(碰到墙('#')就停下来)

第三步:加入箱子,玩家推箱子时,箱子('@')和玩家('I')一起移动

第四步:推箱子时控制边界(碰到墙('#')就停下来),当推两个同一方向上连着的两个箱子时,不允许箱子移动

第五步:加入目标点('*')

第六步:箱子到达目标点('*')时,改变箱子显示符号为('$'),箱子从目标点到空地时,复原目标点('*'),改变箱子符号为('@')

第七步:玩家从目标点移动到空地时,复原目标点('*')

第八步:加入通关计数

需要考虑的情况如下:

在前面窄字符的基础上改了一个宽字符版本的的推箱子,只修改了一下推箱子.c中的代码,另外两个文件Move.c和Game.h中的内容不做修改

 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include "Game.h"
#include <locale.h>
#include <tchar.h> #define N 100 /* 二维数组最大100*100 */
#define NTAB 24 /* 调整界面位置 */
#define YES 1 /* 可以移动 */
#define NO 0 /* 不能移动 */
#define MAP_MAX 6 /* 最大关卡数 */ int suc = ;/* 通关判定 */ void OpenMap(FILE **fp, int map); /* 打开地图文件 */
void InitMap(wchar_t (*map)[N]); /* 地图初始化 */
void JudgeFopen_s(errno_t err); /* 判断文件打开是否成功 */
void ReadMap(wchar_t (*map)[N], FILE *fp, int *x, int *y, int *suc); /* 读取地图 */
void DisplyMap(wchar_t (*map)[N]); /* 打印地图 */ void PlayerMove(int move, int *x, int *y, wchar_t (*map)[N]); /* 玩家移动*/
void JudgePlayerMove(int move, int *x, int *y, wchar_t (*map)[N]); /* 判断玩家移动方向 */
int JudgeBarr(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断玩家移动方向上是否有障碍物 */
int JudgeBarrType(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断障碍物类别 */
void BoxMove(int move, int *x, int *y, wchar_t(*map)[N]); /* 箱子移动 */
int IsBox(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断是否推动的是箱子*/
int JudgeBoxBoun(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断箱子能否被推动 */
void RefreshBox(int move, int *x, int *y, wchar_t(*map)[N]); /* 更新移动后的箱子的位置 */
void RefreshPlayer(int move, int *x, int *y, wchar_t(*map)[N]);/* 更新移动后的玩家位置 */
int JudgePlayerOri(int move, int *x, int *y, wchar_t(*map)[N]);/* 判断玩家原位置是不是空地 */
int JudgeBoxDes(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断箱子移动后的位置是不是目标点 */
int JudgeBoxOri(int move, int *x, int *y, wchar_t(*map)[N]); /* 判断箱子原位置是不是目标点 */
int JudgePlayerDes(int move, int *x, int *y, wchar_t(*map)[N]);/* 判断玩家移动后的位置是不是目标点 */
int JudgeSuc(FILE **fp, int *suc, int *num, wchar_t (*map)[N], int *x, int *y); /* 判断是否通关 */
void SucCount(int move, int *x, int *y, wchar_t(*map)[N], int *suc); /* 通关条件计数 */ /* Game: 推箱子 */
/* WASD移动 */
int main()
{
FILE *fp;
int order; /* 指令 */
int move; /* 移动方向 */
wchar_t ss[N][N]; /* 地图 */
int x, y; /* 玩家坐标 */
int level = ; /* 当前关卡数 */ setlocale(LC_ALL, "chs");
OpenMap(&fp, level); /* 打开存储地图的文件 */ HideCursor(); /* 隐藏光标 */
InitMap(ss); /* 初始化地图 */
ReadMap(ss, fp, &x, &y, &suc);/* 读取地图 */
DisplyMap(ss); /* 打印地图 */ while ()
{
order = _getch(); /* 接收指令 */
move = MoveByWasd(order); /* 判断移动方向 */
JudgePlayerMove(move, &x, &y, ss); /* 玩家移动 */
JudgeSuc(&fp, &suc, &level, ss, &x, &y); /* 判断是否通关 */
} return ;
} /* Function: 打开地图文件*/
void OpenMap(FILE **fp, int map)
{
switch(map)
{
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m1.txt"), _T("r")); /* 文件打开成功返回0值,否则返回非0值*/
JudgeFopen_s(err); /* 判断文件打开是否成功 */
break;
}
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m2.txt"), _T("r"));
JudgeFopen_s(err);
break;
}
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m3.txt"), _T("r"));
JudgeFopen_s(err);
break;
}
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m4.txt"), _T("r"));
JudgeFopen_s(err);
break;
}
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m5.txt"), _T("r"));
JudgeFopen_s(err);
break;
}
case :
{
errno_t err;
err = _wfopen_s(fp,_T("m6.txt"), _T("r"));
JudgeFopen_s(err);
break;
}
default:
{
system("cls");
printf("\t\t\t没有更多了关卡了,即将退出游戏");
Sleep();
exit();
}
}
}
/* Function: 通关条件计数 */
void SucCount(int move, int *x, int *y, wchar_t(*map)[N],int *suc)
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
return;
}
else /* 箱子移动后的位置是目标点*/
{
(*suc)--;
return;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
(*suc)++;
return;
}
else /* 箱子移动后的位置是目标点*/
{
return;
}
}
} /* Function: 判断是否通关 */
int JudgeSuc(FILE **fp, int *suc, int *num, wchar_t (*map)[N], int *x, int *y)
{
if ((*suc) == )
{
(*suc) = ; /* 关卡通关计数重置 */
(*num)++; /* 关卡数+1 */ system("cls");
if ((*num) <= MAP_MAX)
{
printf("\t\t\t通关!即将进入第下一关");
}
else
{
system("cls");
printf("\t\t\t没有更多了关卡了,即将退出游戏");
Sleep();
exit();
} Sleep();
system("cls"); OpenMap(fp,*num); /* 打开地图文件 */
InitMap(map); /* 初始化地图 */
ReadMap(map, *fp, x, y, suc);/* 读取地图 */
DisplyMap(map); /* 打印地图 */ return YES; /* 通关 */
}
else
{
return NO;
}
}
/* Function: 玩家移动*/
void PlayerMove(int move, int *x, int *y, wchar_t (*map)[N])
{
switch(move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T(" "));(*y)--;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break;/* 玩家移动 */
}
else /* 玩家原位置是目标点 */
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T("☆"));(*y)--;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break; /* 玩家移动 */
}
}
case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T(" "));(*y)++;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break;/* 玩家移动 */
}
else
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T("☆"));(*y)++;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break;/* 玩家移动 */
}
}
case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T(" "));(*x)--;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break; /* 玩家移动 */
}
else
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T("☆"));(*x)--;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break; /* 玩家移动 */
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T(" "));(*x)++;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break; /* 玩家移动 */
}
else
{
gotoxy(*(*x)+NTAB, *y);wprintf(_T("☆"));(*x)++;gotoxy(*(*x)+NTAB, *y);wprintf(_T("♀"));break; /* 玩家移动 */
}
}
default: break;
}
}
/* Function: 判断玩家移动后的位置是不是目标点 */
int JudgePlayerDes(int move, int *x, int *y, wchar_t(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == _T('☆')) /* 移动后的位置是目标点 */
{
return YES;
}
else
{
return NO;
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('☆'))
{
return YES;
}
else
{
return NO;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('☆'))
{
return YES;
}
else
{
return NO;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('☆'))
{
return YES;
}
else
{
return NO;
}
}
default: return NO;
}
} /* Function: 判断箱子原位置是不是目标点 */
int JudgeBoxOri(int move, int *x, int *y, wchar_t(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == _T('★')) /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('★')) /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('★')) /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('★')) /* 箱子原位置是目标点 */
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
}
/* Function: 判断箱子移动后的位置是不是目标点 */
int JudgeBoxDes(int move, int *x, int *y, wchar_t(*map)[N])
{
switch(move)
{
case UP:
{
if (map[(*y)-][*x] == _T('☆')) /* 箱子移动后是目标点 */
{
return NO;
}
else /* 箱子移动后不是目标点 */
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('☆'))
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('☆'))
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('☆'))
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
}
/* Function: 判断障碍物类别 */
int JudgeBarrType(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == _T('■')) /* 如果目标地点是墙壁 */
{
return NO; /* 无法移动 */
}
else
{
return YES;/* 不是墙,需要进一步判断 */
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('■'))
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('■'))
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('■'))
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function: 更新移动后的玩家位置 */
void RefreshPlayer(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T(' ');map[(*y)-][*x] = _T('☆');break;
}
else
{
map[*y][*x] = _T(' ');map[(*y)-][*x] = _T('♀');break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T('☆');map[(*y)-][*x] = _T('☆');break;
}
else
{
map[*y][*x] = _T('☆');map[(*y)-][*x] = _T('♀');break;
}
}
}
case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T(' ');map[(*y)+][*x] = _T('☆');break;
}
else
{
map[*y][*x] = _T(' ');map[(*y)+][*x] = _T('♀');break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T('☆');map[(*y)+][*x] = _T('☆');break;
}
else
{
map[*y][*x] = _T('☆');map[(*y)+][*x] = _T('♀');break;
}
}
}
case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T(' ');map[*y][(*x)-] = _T('☆');break;
}
else
{
map[*y][*x] = _T(' ');map[*y][(*x)-] = _T('♀');break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T('☆');map[*y][(*x)-] = _T('☆');break;
}
else
{
map[*y][*x] = _T('☆');map[*y][(*x)-] = _T('♀');break;
}
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 玩家原位置是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T(' ');map[*y][(*x)+] = _T('☆');break;
}
else
{
map[*y][*x] = _T(' ');map[*y][(*x)+] = _T('♀');break;
}
}
else /* 玩家原位置不是空地 */
{
if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点 */
{
map[*y][*x] = _T('☆');map[*y][(*x)+] = _T('☆');break;
}
else
{
map[*y][*x] = _T('☆');map[*y][(*x)+] = _T('♀');break;
}
}
}
}
} /* Function: 判断玩家原位置是不是空地*/
int JudgePlayerOri(int move, int *x, int *y, wchar_t(*map)[N])
{
if (map[*y][*x] == _T('☆'))
{
return NO;
}
else
{
return YES; /* 是空地 */
}
} /* FunctionL 更新移动后的箱子位置 */
void RefreshBox(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)-][*x] = _T(' ');map[(*y)-][*x] = _T('□');break;
}
else
{
map[(*y)-][*x] = _T(' ');map[(*y)-][*x] = _T('★');break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)-][*x] = _T('☆');map[(*y)-][*x] = _T('□');break;
}
else
{
map[(*y)-][*x] = _T('☆');map[(*y)-][*x] = _T('★');break;
}
}
}
case DOWN:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)+][*x] = _T(' ');map[(*y)+][*x] = _T('□');break;
}
else
{
map[(*y)+][*x] = _T(' ');map[(*y)+][*x] = _T('★');break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[(*y)+][*x] = _T('☆');map[(*y)+][*x] = _T('□');break;
}
else
{
map[(*y)+][*x] = _T('☆');map[(*y)+][*x] = _T('★');break;
}
}
}
case LEFT:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)-] = _T(' ');map[*y][(*x)-] = _T('□');break;
}
else
{
map[*y][(*x)-] = _T(' ');map[*y][(*x)-] = _T('★');break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)-] = _T('☆');map[*y][(*x)-] = _T('□');break;
}
else
{
map[*y][(*x)-] = _T('☆');map[*y][(*x)-] = _T('★');break;
}
}
} case RIGHT:
{
SucCount(move, x, y, map, &suc); /* 通关条件计数 */
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)+] = _T(' ');map[*y][(*x)+] = _T('□');break;
}
else
{
map[*y][(*x)+] = _T(' ');map[*y][(*x)+] = _T('★');break;
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
map[*y][(*x)+] = _T('☆');map[*y][(*x)+] = _T('□');break;
}
else
{
map[*y][(*x)+] = _T('☆');map[*y][(*x)+] = _T('★');break;
}
}
}
}
}
/* Functioni: 判断箱子能否被推动 */
int JudgeBoxBoun(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == _T('■') || map[(*y)-][*x] == _T('□') || map[(*y)-][*x] == _T('★')) /* 箱子被推动的方向 是墙壁,或者是另一个箱子*/
{
return NO;
}
else
{
return YES;
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('■') || map[(*y)+][*x] == _T('□') || map[(*y)+][*x] == _T('★'))
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('■') || map[*y][(*x)-] == _T('□') || map[*y][(*x)-] == _T('★'))
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('■') || map[*y][(*x)+] == _T('□') || map[*y][(*x)+] == _T('★'))
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function: 判断移动方向上是否有箱子 */
int IsBox(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] ==_T('□') || map[(*y)-][*x] == _T('★')) /* 如果是在空地上的箱子 或 在目标点上的箱子 */
{
return YES;
}
else
{
return NO;
}
}
case DOWN:
{
if (map[(*y)+][*x] == _T('□') || map[(*y)+][*x] == _T('★'))
{
return YES;
}
else
{
return NO;
}
}
case LEFT:
{
if (map[*y][(*x)-] == _T('□') || map[*y][(*x)-] == _T('★'))
{
return YES;
}
else
{
return NO;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == _T('□') || map[*y][(*x)+] == _T('★'))
{
return YES;
}
else
{
return NO;
}
}
default: return NO; }
} /* Function: 箱子移动 */
void BoxMove(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T(" "));gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("□"));break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T(" "));gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("★"));break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("☆"));gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("□"));break; /* 箱子移动 */
}
else
{
gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("☆"));gotoxy(*(*x)+NTAB, (*y)-);wprintf(_T("★"));break; /* 箱子移动 */
}
}
}
case DOWN:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T(" "));gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("□"));break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T(" "));gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("★"));break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("☆"));gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("□"));break; /* 箱子移动 */
}
else
{
gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("☆"));gotoxy(*(*x)+NTAB, (*y)+);wprintf(_T("★"));break; /* 箱子移动 */
}
}
}
case LEFT:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*(*x)+NTAB)-, *y);wprintf(_T(" "));gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("□"));break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy((*(*x)+NTAB)-, *y);wprintf(_T(" "));gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("★"));break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("☆"));gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("□"));break; /* 箱子移动 */
}
else
{
gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("☆"));gotoxy((*(*x)+NTAB)-, *y);wprintf(_T("★"));break; /* 箱子移动 */
}
}
}
case RIGHT:
{
if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*(*x)+NTAB)+, *y);wprintf(_T(" "));gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("□"));break; /* 箱子移动 */
}
else /* 箱子移动后的位置是目标点 */
{
gotoxy((*(*x)+NTAB)+, *y);wprintf(_T(" "));gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("★"));break; /* 箱子移动 */
}
}
else /* 箱子原位置是目标点 */
{
if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */
{
gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("☆"));gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("□"));break; /* 箱子移动 */
}
else
{
gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("☆"));gotoxy((*(*x)+NTAB)+, *y);wprintf(_T("★"));break; /* 箱子移动 */
}
}
}
default: break;
}
} /* Function:判断玩家移动方向上是否有障碍物 */
int JudgeBarr(int move, int *x, int *y, wchar_t(*map)[N])
{
switch (move)
{
case UP:
{
if (map[(*y)-][*x] == L'■' || map[(*y)-][*x] == L'□' || map[(*y)-][*x] == L'☆' || map[(*y)-][*x] == L'★') /* 如果是墙壁、箱子、目标点 */
{
return NO; /* 需要进一步判断 */
}
else
{
return YES; /* 没有障碍物 */
}
}
case DOWN:
{
if (map[(*y)+][*x] == L'■' || map[(*y)+][*x] == L'□' || map[(*y)+][*x] == L'☆' || map[(*y)+][*x] == L'★')
{
return NO;
}
else
{
return YES;
}
}
case LEFT:
{
if (map[*y][(*x)-] == L'■' || map[*y][(*x)-] == L'□' || map[*y][(*x)-] == L'☆' || map[*y][(*x)-] == L'★')
{
return NO;
}
else
{
return YES;
}
}
case RIGHT:
{
if (map[*y][(*x)+] == L'■' || map[*y][(*x)+] == L'□' || map[*y][(*x)+] == L'☆' || map[*y][(*x)+] == L'★')
{
return NO;
}
else
{
return YES;
}
}
default: return NO;
}
} /* Function:玩家移动 */
void JudgePlayerMove(int move, int *x, int *y, wchar_t (*map)[N])
{
switch (move)
{
case UP:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else /* 玩家原位置为目标点 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
} case DOWN:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
} case LEFT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
}
case RIGHT:
{
if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
else
{
if (JudgeBarr(move, x, y, map) == YES) /* 玩家移动方向上是空地 */
{ /* 如果移动方向上是空地,那么就可以直接移动 */
RefreshPlayer(move, x, y, map);/* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map); /* 玩家移动 */
break;
}
else if (JudgeBarrType(move, x, y, map) == NO) /* 如果是墙壁 */
{
break; /* 无法移动 */
}
else if (IsBox(move, x, y, map) == YES) /* 移动方向上是箱子 */
{
if (JudgeBoxBoun(move, x, y, map) == YES) /* 箱子能被推动 */
{
BoxMove(move, x, y, map);
RefreshBox(move, x, y, map);
RefreshPlayer(move, x, y, map);
PlayerMove(move, x, y, map);
break;
}
else /* 箱子不能被推动 */
{
break;
}
}
else if (JudgePlayerDes(move, x, y, map) == YES) /* 玩家移动后的位置是目标点*/
{
RefreshPlayer(move, x, y, map); /* 更新移动后的玩家位置 */
PlayerMove(move, x, y, map);/* 玩家移动 */
break;
}
}
}
default: break;
}
}
} /* Function: 打印地图 */
void DisplyMap(wchar_t (*map)[N])
{
int i, j; for (i = ; i < N ;i++)
{
printf("\t\t\t");
for (j = ; j < N; j++)
{
if (map[i][j] == EOF+)
{
break;
}
if (map[i][j] != _T('\n'))
{
wprintf(_T("%lc"), map[i][j]);
}
else if (map[i][j] == _T('\n'))
{
wprintf(_T("%lc"), map[i][j]);
break;
} }
if (map[i][j] == EOF+)
{
break;
}
}
} /* Function: 读取地图 */
void ReadMap(wchar_t (*map)[N], FILE *fp, int *x, int *y,int *suc)
{
int i, j;
int n; i = j = ;
while(!feof(fp)) /* 未读到文件末尾 */
{
fwscanf_s(fp, _T("%lc"), &map[i][j], sizeof(wchar_t));
if (map[i][j] == _T('☆'))
{
(*suc)++; /* suc的值为当前关卡目标点的个数 */
}
if (map[i][j] == _T('♀')) /* 读取到玩家图标 */
{
*x = j;
*y = i;
}
n = j; /* 存储j自增之前的值,方便判断是不是换行符*/
j++;
if (map[i][n] == '\n')
{
i++;
j = ;
} }
/*这里+1是因为wchar_t是无符号数,最小为0*/
map[i][j-] = EOF+;/* 作为文件结束标志的EOF不会被读取存储到二维数组中,需要手动添加 */
} /* Function: 初始化地图 */
void InitMap(wchar_t (*map)[N])
{
int i, j; for (i = ;i < N; i++)
{
for (j = ; j < N; j++)
{
map[i][j] = _T(' ');
}
}
} /* Function: 判断文件打开是否成功 */
void JudgeFopen_s(errno_t err)
{
if (err != )
{
printf("地图文件打开失败,请检查地图文件\n");
system("pause");
exit();
}
}

运行效果:

基本上就是对文件操作函数进行修改,使用fwscanf_s、wprintf、等宽字符对应的函数,并将半角空格全角空格代替,墙壁、箱子、目标点、玩家等用相应的宽字符符号代替

有一点需要特别注意的是,因为wchar_t是无符号数,所以无法使用EOF(-1)作为打印地图时的结束标志,我是使用EOF+1来解决的

推箱子文件链接: https://pan.baidu.com/s/1i_VvuOU2gGI4XVWzKnc0HA 提取码: pc7a

C语言小程序——推箱子(窄字符和宽字符)的更多相关文章

  1. C语言小游戏: 推箱子 支线(一)--1

    好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...

  2. c语言小程序以及java生成注释文档方法

    c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...

  3. 通过反汇编C语言小程序学习Liunx汇编语言

    大家好!    我是来自山东师范大学的吴乐.    今天在<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  4. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  5. Linux C语言小程序

    Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...

  6. 小程序推送消息(Template)

    最近搞小程序模拟推送消息,才发现小程序推送消息接口准备下线. 请注意,小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能 咱们现在有需求,所以不管下不下,完成再说. 一:”获取a ...

  7. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  8. 自动生成.py文件头部的C语言小程序

    每次都 vi xxx.py 然后再打 #!/usr/bin/env python 等等的程序头信息感觉有点麻烦,于是便想着写一个小程序自动生成这些头信息了,顺便在 ~/.bashrc 里写入 alia ...

  9. c语言小程序

    这是一个用c语言写的小程序,功能是随机输出30道100以内的四则运算,先生成两个随机数,再通过随机数确定四则运算符号,最后输出题目. #include<iostream> using na ...

随机推荐

  1. JAVA条件判断

    一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表达式为true,执行{ ...

  2. numpy.asmatrix的用法

    学习的过程中,遇到了asmatrix的用法,看了一下官方文档,明白了. numpy.asmatrix numpy.asmatrix(data, dtype=None)[source] Interpre ...

  3. hadoop的job执行在yarn中内存分配调节————Container [pid=108284,containerID=container_e19_1533108188813_12125_01_000002] is running beyond virtual memory limits. Current usage: 653.1 MB of 2 GB physical memory used

    实际遇到的真实问题,解决方法: 1.调整虚拟内存率yarn.nodemanager.vmem-pmem-ratio (这个hadoop默认是2.1) 2.调整map与reduce的在AM中的大小大于y ...

  4. css之标签选择器

    标签(空格分隔): 标签选择器 选择器定义: 在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式,某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素 ...

  5. windows、Linux同步外网NTP服务器时间

    配置 Windows 时间服务以使用外部时间源 要将内部时间服务器配置为与外部时间源同步,请使用以下方法之一: 软件自动配置  Windows 时间服务 若要自动修复此问题,请单击“下载”按钮. 在“ ...

  6. Polynomial regression

  7. Eclipse Java注释模板设置

    类型(Types)注释标签(类的注释): /** * @ClassName: ${type_name} * @Description: ${todo}(这里用一句话描述这个类的作用) * @autho ...

  8. Java Token的原理和生成使用机制

    在此之前我们先了解一下什么是Cookie.Session.Token 1.什么是Cookie? cookie指的就是浏览器里面能永久存储数据的一种数据存储功能.cookie由服务器生成,发送给浏览器, ...

  9. linux下部署monogoDB服务(以及安装php mogodb扩展)

    这两天网站转移到新的服务器后,登录时出现一个问题,会等待几分钟服务器才响应. 开始以为是nginx服务器的问题,后面经过排查发现是php一个登陆验证的函数的问题,每次跑到这个函数就会迟钝几分钟. 经过 ...

  10. Web 研发模式的演变

    前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...