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. python-反射案例讲解

    login.py#!/usr/bin/dev python# coding:utf-8 def index(): print u'欢迎访问xx网站首页' def login(): print u'登录 ...

  2. BASIC GIT WORKFLOW

    BASIC GIT WORKFLOW Generalizations You have now been introduced to the fundamental Git workflow. You ...

  3. 总结http状态码和200,304状态码

    状态码  响应类别  中文意思 1XX  信息性状态码(Informational) 服务器正在处理请求 2XX 成功状态码(Success) 请求已正常处理完毕 3XX 重定向状态码(Redirec ...

  4. funny故事

    name1 = input('请输入一个名字:') name2 = input('请输入一个名字:') vehicle = input('请输入一种车子:') print('\n上近代史的{}刚下课, ...

  5. 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)

    2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ...

  6. 十七、 Observer 观察者设计模式

    设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...

  7. c#: WebBrowser控制台输出

    还是处理视频下载所相关的问题. 有些网站,它的页面代码是由页面加载后js动态生成,那么其原始的html便不能用.页面渲染后的代码,是我们需要的 c#中,我用WebBrowser这个控件处理.设置项目类 ...

  8. 249. Group Shifted Strings把迁移后相同的字符串集合起来

    [抄题]: Given a string, we can "shift" each of its letter to its successive letter, for exam ...

  9. Mobile Computing: the Next Decade论文 cloudlet薄云

    1 Introduction “Information at your fingertips anywhere, anytime” has been the driving vision of mob ...

  10. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)

    原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...