C语言小程序——推箱子(窄字符Version)
推箱子.c
1 #include <stdio.h> 2 #include <conio.h> 3 #include <stdlib.h> 4 #include <Windows.h> 5 #include "Game.h" 6 7 #define N 100 /* 二维数组最大100*100 */ 8 #define NTAB 24 /* 调整界面位置 */ 9 #define YES 1 /* 可以移动 */ 10 #define NO 0 /* 不能移动 */ 11 #define MAP_MAX 6 /* 最大关卡数 */ 12 13 int suc = 0;/* 通关判定 */ 14 15 void OpenMap(FILE **fp, int map); /* 打开地图文件 */ 16 void InitMap(char (*map)[N]); /* 地图初始化 */ 17 void JudgeFopen_s(errno_t err); /* 判断文件打开是否成功 */ 18 void ReadMap(char (*map)[N], FILE *fp, int *x, int *y, int *suc); /* 读取地图 */ 19 void DisplyMap(char (*map)[N]); /* 打印地图 */ 20 21 void PlayerMove(int move, int *x, int *y, char (*map)[N]); /* 玩家移动*/ 22 void JudgePlayerMove(int move, int *x, int *y, char (*map)[N]); /* 判断玩家移动方向 */ 23 int JudgeBarr(int move, int *x, int *y, char(*map)[N]); /* 判断玩家移动方向上是否有障碍物 */ 24 int JudgeBarrType(int move, int *x, int *y, char(*map)[N]); /* 判断障碍物类别 */ 25 void BoxMove(int move, int *x, int *y, char(*map)[N]); /* 箱子移动 */ 26 int IsBox(int move, int *x, int *y, char(*map)[N]); /* 判断是否推动的是箱子*/ 27 int JudgeBoxBoun(int move, int *x, int *y, char(*map)[N]); /* 判断箱子能否被推动 */ 28 void RefreshBox(int move, int *x, int *y, char(*map)[N]); /* 更新移动后的箱子的位置 */ 29 void RefreshPlayer(int move, int *x, int *y, char(*map)[N]);/* 更新移动后的玩家位置 */ 30 int JudgePlayerOri(int move, int *x, int *y, char(*map)[N]);/* 判断玩家原位置是不是空地 */ 31 int JudgeBoxDes(int move, int *x, int *y, char(*map)[N]); /* 判断箱子移动后的位置是不是目标点 */ 32 int JudgeBoxOri(int move, int *x, int *y, char(*map)[N]); /* 判断箱子原位置是不是目标点 */ 33 int JudgePlayerDes(int move, int *x, int *y, char(*map)[N]);/* 判断玩家移动后的位置是不是目标点 */ 34 int JudgeSuc(FILE **fp, int *suc, int *num, char (*map)[N], int *x, int *y); /* 判断是否通关 */ 35 void SucCount(int move, int *x, int *y, char(*map)[N], int *suc); /* 通关条件计数 */ 36 37 38 /* Game: 推箱子 */ 39 /* WASD移动 */ 40 int main() 41 { 42 FILE *fp; 43 int order; /* 指令 */ 44 int move; /* 移动方向 */ 45 char ss[N][N]; /* 地图 */ 46 int x, y; /* 玩家坐标 */ 47 int level = 1; /* 当前关卡数 */ 48 49 OpenMap(&fp, level); /* 打开存储地图的文件 */ 50 51 HideCursor(); /* 隐藏光标 */ 52 InitMap(ss); /* 初始化地图 */ 53 ReadMap(ss, fp, &x, &y, &suc);/* 读取地图 */ 54 DisplyMap(ss); /* 打印地图 */ 55 while (1) 56 { 57 order = _getch(); /* 接收指令 */ 58 move = MoveByWasd(order); /* 判断移动方向 */ 59 JudgePlayerMove(move, &x, &y, ss); /* 玩家移动 */ 60 JudgeSuc(&fp, &suc, &level, ss, &x, &y); /* 判断是否通关 */ 61 } 62 63 return 0; 64 } 65 66 /* Function: 打开地图文件*/ 67 void OpenMap(FILE **fp, int map) 68 { 69 errno_t err; 70 71 switch(map) 72 { 73 case 1: 74 { 75 err = fopen_s(fp, "m1.txt", "r"); /* 文件打开成功返回0值,否则返回非0值*/ 76 JudgeFopen_s(err); /* 判断文件打开是否成功 */ 77 break; 78 } 79 case 2: 80 { 81 err = fopen_s(fp, "m2.txt", "r"); 82 JudgeFopen_s(err); 83 break; 84 } 85 case 3: 86 { 87 err = fopen_s(fp, "m3.txt", "r"); 88 JudgeFopen_s(err); 89 break; 90 } 91 case 4: 92 { 93 err = fopen_s(fp, "m4.txt", "r"); 94 JudgeFopen_s(err); 95 break; 96 } 97 case 5: 98 { 99 err = fopen_s(fp, "m5.txt", "r"); 100 JudgeFopen_s(err); 101 break; 102 } 103 case 6: 104 { 105 err = fopen_s(fp, "m6.txt", "r"); 106 JudgeFopen_s(err); 107 break; 108 } 109 default: 110 { 111 system("cls"); 112 printf("\t\t\t没有更多了关卡了,即将退出游戏"); 113 Sleep(3000); 114 exit(0); 115 } 116 } 117 } 118 /* Function: 通关条件计数 */ 119 void SucCount(int move, int *x, int *y, char(*map)[N],int *suc) 120 { 121 if (JudgeBoxOri(move, x, y, map) == YES) /* 箱子原位置不是目标点 */ 122 { 123 if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */ 124 { 125 return; 126 } 127 else /* 箱子移动后的位置是目标点*/ 128 { 129 (*suc)--; 130 return; 131 } 132 } 133 else /* 箱子原位置是目标点 */ 134 { 135 if (JudgeBoxDes(move, x, y, map) == YES) /* 箱子移动后的位置不是目标点 */ 136 { 137 (*suc)++; 138 return; 139 } 140 else /* 箱子移动后的位置是目标点*/ 141 { 142 return; 143 } 144 } 145 } 146 147 /* Function: 判断是否通关 */ 148 int JudgeSuc(FILE **fp, int *suc, int *num, char (*map)[N], int *x, int *y) 149 { 150 if ((*suc) == 0) 151 { 152 (*suc) = 0; /* 关卡通关计数重置 */ 153 (*num)++; /* 关卡数+1 */ 154 155 system("cls"); 156 if ((*num) <= MAP_MAX) 157 { 158 printf("\t\t\t通关!即将进入第下一关"); 159 } 160 else 161 { 162 system("cls"); 163 printf("\t\t\t没有更多了关卡了,即将退出游戏"); 164 Sleep(3000); 165 exit(0); 166 } 167 168 Sleep(1000); 169 system("cls"); 170 171 OpenMap(fp,*num); /* 打开地图文件 */ 172 InitMap(map); /* 初始化地图 */ 173 ReadMap(map, *fp, x, y, suc);/* 读取地图 */ 174 DisplyMap(map); /* 打印地图 */ 175 176 return YES; /* 通关 */ 177 } 178 else 179 { 180 return NO; 181 } 182 } 183 /* Function: 玩家移动*/ 184 void PlayerMove(int move, int *x, int *y, char (*map)[N]) 185 { 186 switch(move) 187 { 188 case UP: 189 { 190 if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */ 191 { 192 gotoxy(*x+NTAB, *y);printf(" ");(*y)--;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */ 193 } 194 else /* 玩家原位置是目标点 */ 195 { 196 gotoxy(*x+NTAB, *y);printf("*");(*y)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */ 197 } 198 } 199 case DOWN: 200 { 201 if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */ 202 { 203 gotoxy(*x+NTAB, *y);printf(" ");(*y)++;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */ 204 } 205 else 206 { 207 gotoxy(*x+NTAB, *y);printf("*");(*y)++;gotoxy(*x+NTAB, *y);printf("I");break;/* 玩家移动 */ 208 } 209 } 210 case LEFT: 211 { 212 if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */ 213 { 214 gotoxy(*x+NTAB, *y);printf(" ");(*x)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */ 215 } 216 else 217 { 218 gotoxy(*x+NTAB, *y);printf("*");(*x)--;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */ 219 } 220 } 221 case RIGHT: 222 { 223 if (JudgePlayerOri(move, x, y, map) == YES) /* 如果玩家原位置是空地 */ 224 { 225 gotoxy(*x+NTAB, *y);printf(" ");(*x)++;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */ 226 } 227 else 228 { 229 gotoxy(*x+NTAB, *y);printf("*");(*x)++;gotoxy(*x+NTAB, *y);printf("I");break; /* 玩家移动 */ 230 } 231 } 232 default: break; 233 } 234 } 235 /* Function: 判断玩家移动后的位置是不是目标点 */ 236 int JudgePlayerDes(int move, int *x, int *y, char(*map)[N]) 237 { 238 switch(move) 239 { 240 case UP: 241 { 242 if (map[(*y)-1][*x] == \'*\') /* 移动后的位置是目标点 */ 243 { 244 return YES; 245 } 246 else 247 { 248 return NO; 249 } 250 } 251 case DOWN: 252 { 253 if (map[(*y)+1][*x] == \'*\') 254 { 255 return YES; 256 } 257 else 258 { 259 return NO; 260 } 261 } 262 case LEFT: 263 { 264 if (map[*y][(*x)-1] == \'*\') 265 { 266 return YES; 267 } 268 else 269 { 270 return NO; 271 } 272 } 273 case RIGHT: 274 { 275 if (map[*y][(*x)+1] == \'*\') 276 { 277 return YES; 278 } 279 else 280 { 281 return NO; 282 } 283 } 284 default: return NO; 285 } 286 } 287 288 /* Function: 判断箱子原位置是不是目标点 */ 289 int JudgeBoxOri(int move, int *x, int *y, char(*map)[N]) 290 { 291 switch(move) 292 { 293 case UP: 294 { 295 if (map[(*y)-1][*x] == \'$\') /* 箱子原位置是目标点 */ 296 { 297 return NO; 298 } 299 else 300 { 301 return YES; 302 } 303 } 304 case DOWN: 305 { 306 if (map[(*y)+1][*x] == \'$\') /* 箱子原位置是目标点 */ 307 { 308 return NO; 309 } 310 else 311 { 312 return YES; 313 } 314 } 315 case LEFT: 316 { 317 if (map[*y][(*x)-1] == \'$\') /* 箱子原位置是目标点 */ 318 { 319 return NO; 320 } 321 else 322 { 323 return YES; 324 } 325 }
全部评论
请发表评论