zoukankan      html  css  js  c++  java
  • 迷宫生成算法prime,实现自动走迷宫

    写了一下午,从学习迷宫生成算法开始的。

    程序的大概样式:

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <cstdio>
    #include<bits/stdc++.h>
    #include <windows.h>
    #include <tchar.h>
    #include <SDKDDKVer.h>
    #include<conio.h>
    using namespace std;
    #define MAZE_MAX 1000
    int mz[MAZE_MAX+2][MAZE_MAX+2];
    int hs[MAZE_MAX+2][MAZE_MAX+2];
    int Move[MAZE_MAX+2][MAZE_MAX+2];
    int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
    int vis[MAZE_MAX];
    int fa[MAZE_MAX];
    int X = 12, Y = X;
    void make_path();
    struct node{
        int x,y;
    };
    struct node f[MAZE_MAX+2],ppk,endd;
    int cnt=0;
    void gotoxy(int x, int y){
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD pos;
        pos.X = x;
        pos.Y = y;
        SetConsoleCursorPosition(handle, pos);
    }
    void hideCursor(){
        CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }
    void Print_Maze()
    {
        printf("使用w,s,a,d移动,Esc退出
    ");
        printf("当前迷宫大小:%d
    ",X );
        for(int i=0; i<=X; i++){
            for(int j=0;j<=X;j++){
                if(mz[i][j]){
                    printf("%s","");
                  }
                  else  if(Move[i][j]==1){
                      printf("%s","");
                    }
                  else  if(i==1&&j==1){
                      printf("%s","");
                    }
                 else if(i==X-1&&j==Y-1){
                      printf("%s","");
                  }
                  else if(i==ppk.x&&j==ppk.y){
                     printf("");
                 }
                  else{
                      printf("%s","  ");
                  }
            }
            printf("
    ");
        }
    }
    void updata_Maze(){
        hideCursor();
        gotoxy(0, 7);
        Print_Maze();
    }
    void Init_Maze(){
        cnt=0;
        for(int i=0;i<=X;i++){
            for(int j=0;j<=Y;j++){
                Move[i][j]=0;
                if(i==0||j==0||j==Y||i==X)
                    hs[i][j]=-2;//墙壁为1
                else
                    hs[i][j]=-1;//能打通的路为-1
                if(i==0||i==X||j==0||j==Y||(i%2==0)||(j%2==0)){
                      mz[i][j]=1;//
                }
                else{
                    node tp;
                    tp.x=i,tp.y=j;
                    hs[i][j]=cnt;
                    fa[cnt]=cnt;
                    f[cnt++]=tp;
                }
            }
        }
        endd=f[cnt-1];
    }
    int find(int x){
        while(fa[x]!=x) x=fa[x];
        return x;
    }
    int merge(int x,int y){
        int f1=find(x);
        int f2=find(y);
        if(f1<f2) fa[f2]=f1;
        else if(f1>f2) fa[f1]=f2;
        else return 0;
        return 1;
    }
    int check_wall(int x,int y){
        if(x<=0||x>=X||y>=Y||y<=0){
            return 1;
        }
        return 0;
    }
    int check_choke(int x,int y){//检查是否全是阻塞的
        if(mz[x+1][y]==1 && mz[x-1][y]==1 &&mz[x][y+1]==1 &&mz[x][y-1]==1){
            return 1;
        }
        return 0;
    }
    void make_path(){
        srand(time(NULL));
        for(int p=0;p<cnt*8;p++){
            if(find(0)==find(cnt-1)){
                return ;
            }
            int road=vis[p%cnt];
            int next=rand()%4;
            int x=f[road].x,y=f[road].y;
            if(check_choke(x,y)){
                for(int i=0;i<4;i++){
                    int cx=x+dir[next][0]*2,cy=y+dir[next][1]*2;
                    int next_road=hs[cx][cy];
                    if(!check_wall(cx,cy)){
                    merge(road,next_road);
                    mz[x+dir[next][0]][y+dir[next][1]]=0;
                    }
                }
            }
            else{
                int cx=x+dir[next][0]*2,cy=y+dir[next][1]*2;
                int next_road=hs[cx][cy];
                if(!check_wall(cx,cy)){
                    merge(road,next_road);
                    mz[x+dir[next][0]][y+dir[next][1]]=0;
                }
            }
        }
        ppk=f[0];
    }
    void Init_list(){
        srand(time(NULL));
        for(int i=0;i<cnt;i++){
            vis[i]=i;
        }
        for(int i=0;i<cnt;i++){
            int a=rand()%cnt,b=rand()%cnt;
            swap(vis[a],vis[b]);
        }
    }
    int check_rode(int x,int y){
        return mz[x][y]==0 ? 1 : 0;
    }    
    void p_Move(){
        int ch;ppk=f[0];
        while (1){
            if(ppk.x==f[cnt-1].x&&ppk.y==f[cnt-1].y){
                printf("你赢了!
    ");
                break;
            }
            updata_Maze();
            if(_kbhit()){//如果有按键按下,则_kbhit()函数返回真
                ch = _getch();//使用_getch()函数获取按下的键值
                if (ch == 27){
                    break;
                }//当按下ESC时循环,ESC键的键值时27.
                else if(ch==119){// w
                    if(check_rode(ppk.x-1,ppk.y))
                    ppk.x--;
                }
                else if(ch==115){//s
                    if(check_rode(ppk.x+1,ppk.y))
                    ppk.x++;
                }
                else if(ch==97){//a
                    if(check_rode(ppk.x,ppk.y-1))
                    ppk.y--;
                }
                else if(ch==100){//d
                    if(check_rode(ppk.x,ppk.y+1))
                    ppk.y++;
                }
            }
        }
    }
    node step[MAZE_MAX];
    int flag=0,walked[MAZE_MAX][MAZE_MAX];
    void dfs_find_path(int stp,node now){
        if(flag) return ;
        if(now.x==endd.x&&now.y==endd.y){
            flag=1;
            printf("%s
    ","走到了" );
            for(int i=0;i<stp;i++){
                Move[step[i].x][step[i].y]=1;
                updata_Maze();
            }
            return ;
        }
        node next_road;
        for(int i=0;i<4;i++){
            int cx=now.x+dir[i][0],cy=now.y+dir[i][1];
            if(check_rode(cx,cy)&&!walked[cx][cy]){
                walked[cx][cy]=1;
                next_road.x=step[stp].x=cx;
                next_road.y=step[stp].y=cy;
                dfs_find_path(stp+1,next_road);
                walked[cx][cy]=0;
            }
        }
    }
    void Print_hello(){
        hideCursor();
        gotoxy(0, 0);
        printf("--------------------------
    ");
        printf("1:生成迷宫
    ");
        printf("2:自己走
    ");
        printf("3:电脑走
    ");
        printf("4:设置大小
    ");
        printf("5:退出
    ");
        printf("--------------------------
    ");
    }
    int begintime,endtime;
    void menu1(){
        system("cls");
        begintime=clock();  //计时开始
        Init_Maze();//初始化迷宫
        Init_list();//生成一个个随机数列
        make_path();//生成迷宫
        updata_Maze();
        endtime = clock();  //计时结束
        printf(" 所用时间 :%8d ms", endtime-begintime);
    }
    void menu2(){
        begintime=clock();  //计时开始
        p_Move();//
        endtime = clock();  //计时结束
        printf(" 所用时间 :%8d ms", endtime-begintime);
    }
    
    void menu3(){
        begintime=clock();  //计时开始
        ppk=f[0];
        flag=0;
        walked[ppk.x][ppk.y]=1;
        dfs_find_path(1,ppk);
        endtime = clock();  //计时结束
        memset(Move,0,sizeof(Move));
        memset(walked,0,sizeof(walked));
        printf(" 所用时间 :%8d ms", endtime-begintime);
    }
    void menu4(){
        printf("
    请输入迷大小 :    ");
        scanf("%d",&X);X%2==1 ? X++ : 1;
        Y=X;
        menu1();
    }
    void MENU(){
        int ch;
        while (1){
            Print_hello();
            if(_kbhit()){//如果有按键按下,则_kbhit()函数返回真
                ch = _getch();//使用_getch()函数获取按下的键值
                if(ch==49){// w
                    menu1();
                }
                else if(ch==50){
                    menu2();
                }
                else if(ch==51){
                    menu3();
                }
                else if(ch==52){//d
                    menu4();
                }
                else if(ch==53){
                    break;
                }
            }
        }
    }
    int main(){
        system("chcp 65001");
        system("mode con cols=220 lines=100");
        system("color 9");
        MENU();
        return 0;
    }

      

  • 相关阅读:
    模型验证_python机器学习-sklearn挖掘乳腺癌细胞(五)
    模型调参_python机器学习-sklearn挖掘乳腺癌细胞(四)
    catboost模型_python机器学习-sklearn挖掘乳腺癌细胞(三)
    sklearn编程环境搭建_python机器学习-sklearn挖掘乳腺癌细胞(二)
    做风控吗?有前途!
    信用评分卡 (part 7 of 7)_预测分析的业务知识
    信用评分卡 (part 6 of 7)_模型验证
    信用评分卡 (part 5 of 7)_逻辑回归
    (算法)变成1需要的最小步数
    (算法)二分查找的搜索区间
  • 原文地址:https://www.cnblogs.com/37kiazz73/p/11588502.html
Copyright © 2011-2022 走看看