• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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         }
 
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap