迷宫生成算法 prime,实现自动走迷宫

本贴最后更新于 1866 天前,其中的信息可能已经时过境迁

从学习迷宫生成算法开始的。程序运行起来的样子:

GitHub 地址 :GitHub

show.gif

#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退出\n"); printf("当前迷宫大小:%d\n",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("\n"); } } 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("你赢了!\n"); 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\n","走到了" ); 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("--------------------------\n"); printf("1:生成迷宫\n"); printf("2:自己走\n"); printf("3:电脑走\n"); printf("4:设置大小\n"); printf("5:退出\n"); printf("--------------------------\n"); } 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("\n请输入迷大小 : "); 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; }

  

  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • 迷宫
    1 引用
  • 算法
    437 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 411 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 621 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 31 关注
  • Word
    13 引用 • 41 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 489 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 690 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 648 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 636 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖 • 1 关注
  • Follow
    4 引用 • 12 回帖 • 12 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 250 关注
  • 印象笔记
    3 引用 • 16 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 336 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖 • 1 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 81 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 74 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 10 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 175 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 8 关注