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

2023-02-21,,

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语言小程序——推箱子(窄字符和宽字符)的相关教程结束。

《C语言小程序——推箱子(窄字符和宽字符).doc》

下载本文的Word格式文档,以方便收藏与打印。