zoukankan      html  css  js  c++  java
  • C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下:

    代码如下:

      1 //头文件
      2 #include<stdio.h>
      3 #include<windows.h>//Sleep(500)函数调用此头文件
      4 #include<conio.h>//getch()函数调用此头文件
      5 #include<stdlib.h>//system("cls")函数调用此头文件
      6 
      7 //函数状态码定义
      8 /******************************/
      9 #define TRUE 1
     10 #define FALSE 0
     11 #define OK 1
     12 #define ERROR 0
     13 #define INFEASIBLE -1
     14 #define OVERFLOW -2
     15 typedef int Status;
     16 #define STACK_INIT_SIZE 100
     17 #define STACKINCREMENT 10
     18 #define Pass 0 //可通过
     19 #define Wall 1 //
     20 #define Start 6 //起点
     21 #define End 7   //终点
     22 #define Back 8 //返回
     23 #define Exit 9 //出口:找到终点后标志出来
     24 /******************************/
     25 
     26 //自定义数据类型
     27 /***************************************************/
     28 
     29 //自定义枚举类型
     30 enum direction{East=2,South,West,North};//2,3,4,5分别代表东、南、西、北
     31 /*+------------------------
     32 使用枚举类型来表示方向
     33 该枚举类型定义的变量只能取值 East,West,South,North
     34 且East=2,South=3,West=4,North=5
     35 本源码上面使用枚举类型,基本等效于下面
     36 #define East 2
     37 #define South 3
     38 #define West 4
     39 #define North 5
     40 +------------------------*/
     41 
     42 //自定义坐标结构体
     43 typedef struct //迷宫x行,y列
     44 {
     45     int x;
     46     int y;
     47 }Position;//坐标结构体
     48 
     49 //二维数组构造迷宫,1代表墙,0代表可通过。
     50 int Map[10][10]={
     51     {1,6,1,1,1,1,1,1,1,1},
     52     {1,0,0,1,0,0,0,1,0,1},
     53     {1,0,0,1,0,0,0,1,0,1},
     54     {1,0,0,0,0,1,1,0,0,1},
     55     {1,0,1,1,1,0,0,0,0,1},
     56     {1,0,0,0,1,0,0,0,0,1},
     57     {1,0,1,0,0,0,1,0,0,1},
     58     {1,0,1,1,1,0,1,1,0,1},
     59     {1,1,0,0,0,0,0,0,0,7},
     60     {1,1,1,1,1,1,1,1,1,1}
     61 };
     62 
     63 //自定义结构体作为中间变量保存当前临时坐标信息
     64 typedef struct
     65 {
     66     int number;//记录是第几步
     67     Position seat;//通道块在迷宫中的"位置坐标"
     68     enum direction direc;
     69     //direction为枚举类型,用来表示从此通道走向下一通道的方向
     70     //direc只能取值 East,West,South,North
     71     //且East=2,South=3,West=4,North=5
     72 }SElemType;
     73 
     74 //自定义栈结构便于将上面结构体的临时坐标信息放到栈内存储
     75 typedef struct {
     76     SElemType *base;
     77     SElemType *top;
     78     int stacksize;
     79 }SqStack;//
     80 /*********************************************/
     81 
     82 //函数声明
     83 /******************************************/
     84 
     85 void Welcome();//欢迎界面函数
     86 void printfMap();//打印迷宫函数
     87 Status findPath(SqStack &S,Position start,Position end);//迷宫寻路径函数
     88 Status InitStack(SqStack &S);//初始化栈
     89 Status StackEmpty(SqStack S);//判断栈是否为空
     90 Status Push(SqStack &S,SElemType e);//入栈
     91 Status Pop(SqStack &S,SElemType &e);//出栈
     92 enum direction Judge_direc(Position pos);//根据一个坐标探索周围坐标返回可通行的坐标
     93 Position change_seat(Position &pos,enum direction direc);//根据方向移动到下一个可通行的坐标处
     94 Status change_Map(int mapid);
     95 
     96 /****************主函数开始***********************/
     97 
     98 //主函数
     99 int main()
    100 {
    101     Position start,end;
    102     int n;
    103     SqStack S;
    104     InitStack(S);//初始化栈
    105     Welcome();//调用欢迎界面函数
    106     start.x=0;//0
    107     start.y=1;//1
    108     printf("请选择地图:
    
    ");
    109     change_Map(0);
    110     printf("		默认地图0
    
    ");
    111     printfMap();
    112     change_Map(1);
    113     printf("		备选地图1
    
    ");
    114     printfMap();
    115     printf("选择默认地图请输入0,备选地图请输入1:
    ");
    116     printf("您的选择:");
    117     scanf("%d",&n);
    118     system("cls");
    119     switch(n)
    120     {
    121         case 0:
    122         {
    123             change_Map(0);printf("初始迷宫如下所示:
    
    ");
    124             end.x=8;end.y=9;
    125             printfMap();
    126             printf("按任意键继续!");
    127             getch();
    128             system("cls");
    129             break;
    130         }
    131          case 1:
    132         {
    133                 change_Map(1);printf("初始迷宫如下所示:
    
    "); 
    134                 end.x=0;
    135                 end.y=8;
    136                 printfMap();
    137                 printf("按任意键继续!");
    138                 getch();
    139                 system("cls");
    140                 break;
    141         }
    142     }
    143     findPath(S,start,end);
    144     printf("
    
    按下任意键退出系统!
    ");
    145     getch();
    146     
    147     return 0;
    148 }
    149 /***************主函数结束***********************/
    150 //打印迷宫
    151 void printfMap()
    152 {
    153     int i,j;
    154     for(i=0;i<10;i++)
    155     {
    156         printf("	");
    157         for(j=0;j<10;j++)
    158             switch(Map[i][j]){
    159             case Pass:printf("");break;//可通过0
    160             case Wall:printf("");break;//墙1
    161             case East:printf("");break;//东2
    162             case South:printf(""); break;//南3
    163             case West:printf("");break;//西4
    164             case North:printf("");break;//北5
    165             case Start:printf("");break;//起点6
    166             case End:printf("");break;//终点7
    167             case Back:printf("Θ");break;//返回8
    168             case Exit:printf("To");break;//出口9
    169         }
    170         printf("
    ");
    171     }
    172     printf("
    ");
    173 }
    174 
    175 //走迷宫
    176 Status findPath(SqStack &S,Position start,Position end){
    177     Position curpos;//当前坐标
    178     SElemType elem;//路径相关信息结构体
    179     int step=1;//记录步骤数
    180     curpos=start;//开始坐标    
    181     while(1){
    182         if(curpos.x==start.x&&curpos.y==start.y)//此段代码只执行一次
    183         {
    184             elem.number=1;
    185             elem.direc=Judge_direc(curpos);//判断下一个位置是什么方向
    186             elem.seat=curpos;
    187             step++;
    188             Push(S,elem);//第一个起点无条件入栈 
    189         }    
    190         
    191         Map[curpos.x][curpos.y]=(int)elem.direc;//锁定当前位置
    192         curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
    193         if(Map[curpos.x][curpos.y]==End)//找到终点,退出循环
    194         {
    195             elem.seat=curpos;
    196             elem.number=step;
    197             Push(S,elem);
    198             Map[curpos.x][curpos.y]=Exit;
    199             system("cls");
    200             printf("
    ");
    201             printfMap();
    202             printf("
    	恭喜您,迷宫路径已经找到!
    
    ");
    203             printf("路径坐标为:
    
    ");
    204             while(!StackEmpty(S))
    205             {
    206                 Pop(S,elem);//出栈
    207                 curpos=elem.seat;
    208                 printf("(%d,%d)	",curpos.x,curpos.y);
    209             }
    210             break;
    211         }
    212         if(Map[curpos.x][curpos.y]==Pass)//如果当前路可通
    213         {
    214             elem.number=step;
    215             elem.seat=curpos;
    216             elem.direc=Judge_direc(curpos);
    217             Push(S,elem);//将当前坐标入栈
    218             step++;
    219         }
    220         else//如果当前位置不通
    221         {
    222             Pop(S,elem);
    223             curpos=elem.seat;
    224             step=elem.number-1;
    225             Map[curpos.x][curpos.y]=Back;//表示四个都不通,标记走过了
    226             do
    227             {
    228                 Pop(S,elem);//出栈
    229                 curpos=elem.seat;                
    230                 /************while循环开始*****************/
    231                 while(elem.direc<=4)
    232                 {
    233                     elem.direc=(enum direction)(elem.direc+1);
    234                     curpos=change_seat(curpos,elem.direc);//移动到下一个位置,根据方向改变坐标位置
    235                     if(Map[curpos.x][curpos.y]==Pass)
    236                     {
    237                         break;
    238                     }
    239                 };
    240                 /************while循环结束*****************/
    241                 if(Map[curpos.x][curpos.y]==Pass)
    242                 {
    243                     curpos=elem.seat;
    244                     elem.number=step;
    245                     elem.seat=curpos;
    246                     Push(S,elem);
    247                     step++;
    248                     break;
    249                 }
    250                 else
    251                 {
    252                     curpos=elem.seat;
    253                     Map[curpos.x][curpos.y]=Back;    
    254                 }
    255                 printf("正在遍历查找...
    
    ");
    256                 printfMap();
    257                 Sleep(1000);
    258                 system("cls");
    259             }while(!StackEmpty(S));//直到栈为空跳出循环        
    260         }
    261         printf("正在遍历查找...
    
    ");
    262         printfMap();
    263         Sleep(1000);
    264         system("cls");
    265     }
    266     return OK;    
    267 }
    268 
    269 //改变坐标
    270 Position change_seat(Position &pos,enum direction direc){
    271     switch(direc)
    272     {
    273     case East:  pos.y=pos.y+1;break;//2
    274     case South: pos.x=pos.x+1;break;//3
    275     case West:  pos.y=pos.y-1;break;//4
    276     case North: pos.x=pos.x-1;break;//5
    277     }
    278     return pos;
    279 }
    280 //判断下一个位置方向
    281 enum direction Judge_direc(Position pos)
    282 {
    283     enum direction judge;
    284     if(Map[pos.x][pos.y+1]==Pass||Map[pos.x][pos.y+1]==End)
    285         judge=East;
    286     else
    287     {
    288         if(Map[pos.x+1][pos.y]==Pass||Map[pos.x+1][pos.y]==End)
    289             judge=South;
    290         else
    291         {
    292             if(Map[pos.x][pos.y-1]==Pass||Map[pos.x][pos.y-1]==End)
    293                 judge=West;
    294             else
    295             {
    296                 if(Map[pos.x-1][pos.y]==Pass||Map[pos.x-1][pos.y]==End)
    297                     judge=North;
    298             }
    299         }
    300     }
    301     return judge;            
    302 }
    303 
    304 Status change_Map(int mapid)
    305 {
    306         if(mapid==0)//默认地图
    307         {
    308             Map[0][8]=Wall;
    309             Map[8][9]=End;
    310         }
    311         if(mapid==1)//其他地图
    312         {
    313             Map[8][9]=Wall;
    314             Map[0][8]=End;
    315         }
    316         return OK;
    317 }
    318 
    319 //初始化栈
    320 Status InitStack(SqStack &S){
    321     S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    322     if(!S.base)exit(OVERFLOW);
    323     S.top=S.base;
    324     S.stacksize=STACK_INIT_SIZE;
    325     return OK;
    326 }
    327 
    328 //判断栈是否为空
    329 Status StackEmpty(SqStack S){
    330     if(S.top==S.base)
    331         return TRUE;
    332     else
    333         return FALSE;
    334 }
    335 //入栈
    336 Status Push(SqStack &S,SElemType e){
    337     if(S.top-S.base>=S.stacksize){
    338         S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
    339         if(!S.base)exit(OVERFLOW);
    340         S.top=S.base+S.stacksize;
    341         S.base+=STACKINCREMENT;
    342     }
    343     *S.top++=e;
    344     return OK;
    345 }
    346 
    347 //出栈
    348 Status Pop(SqStack &S,SElemType &e){
    349     if(S.top==S.base)return ERROR;
    350     e=*--S.top;
    351     return OK;
    352 }
    353 //去栈顶元素
    354 Status GetTop(SqStack S,SElemType &e){
    355     
    356     if(S.top==S.base)return ERROR;
    357     
    358     e=*(S.top-1);  //注意top指向待插入位置
    359     
    360     return OK;
    361     
    362 }
    363 
    364 //欢迎界面函数
    365 void Welcome(){
    366     system("title 迷宫求解程序");//设置窗口标题
    367     system("mode con cols=80 lines=40");  //窗口宽度高度
    368     system("color a");//设置文本颜色,所在头文件
    369     printf("★**************************************************************★
    ");
    370     printf("★                                                              ★
    ");
    371     printf("★                     欢迎使用迷宫求解程序                     ★
    ");
    372     printf("★                                                              ★
    ");
    373     printf("★    文件名称:数据结构期末实验                                ★
    ");
    374     printf("★                                                              ★
    ");
    375     printf("★    项目名称:迷宫求解程序                                    ★
    ");
    376     printf("★                                                              ★
    ");
    377     printf("★    创建时间:2014-11-28                                      ★
    ");
    378     printf("★                                                              ★
    ");
    379     printf("★    最后修改时间:2014-12-2                                   ★
    ");
    380     printf("★                                                              ★
    ");
    381     printf("★**************************************************************★
    ");
    382     printf("按任意键继续!
    ");
    383     getch();//暂停函数,所在头文件<conio.h>
    384     system("cls");//清屏函数
    385 }
  • 相关阅读:
    ibatis学习笔记
    记ibatis使用动态列查询问题(remapresults)
    jQuery(九)、ajax对象操作
    jQuery(八)、ajax
    jQuery(七)、效果和动画
    jQuery(六)、事件
    jQuery(五)、筛选
    jQuery(四)、文档处理
    jQuery(三)、属性、CSS
    jQuery(二)、选择器
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/4746182.html
Copyright © 2011-2022 走看看