迷宫游戏控制台版C++代码
本文实例分享了C++设计的一个可以调整大小的迷宫游戏,给定迷宫的入口。如果存在出口,程序能够显示行走的路径,并最终到达出口,并输出“成功走出迷宫”;如果不存在出口,程序也能够显示行走的过程,并最终回退到入口,并输出“回退到入口”。
//这是一个迷宫游戏 #include<iostream> #include<ctime> #include<cstdlib>/*用于生成随机数,形成随机变化的迷宫*/ #include<iomanip>/*用于输出格式控制,使得生成的迷宫外观规则*/ using namespace std; /*生成迷宫的函数mazegenerator*/ char*mazegenerator(int m,int n) { int i,j,k;/*计数器*/ char *p=new char[m*n];/*用长度为m*n的数组存放mxn大小的迷宫*/ srand(int(time(0)));/*用于生成随机数*/ if(m<10||n<10)//阶数小的时候密一点,增加趣味 for(i=0;i<m*n;i++) { if(rand()%3==0)p[i]='.';//随机数为三的倍数时,把迷宫中该点定义为通路 else p[i]='#'; } else for(i=0;i<m*n;i++) { if(rand()%2==0)p[i]='.';/*随机数为偶数时,把迷宫中该点定义为通路*/ else p[i]='#'; } /*把左边界和上边界全部封住,只留一个入口,只能从右边界和下边界走出, 让走出迷宫更有挑战性*/ for(i=0;i<m;i++) p[i]='#'; for(i=0;i<m*n;i+=m) p[i]='#'; for(i=m-1;i<m*n;i+=m) p[i]='#'; for(i=m*(n-1);i<m*n;i++) p[i]='#'; /*接下来把前3阶构造为T字型*/ p[0]=p[1]=p[2]=p[2*m]=p[2*m+2]='#'; p[m+1]=p[m+2]=p[2*m+1]='.'; /*迷宫入口定义为'x'*/ p[m]='x'; /*迷宫是随机的,需要构造一条通路*/ /*这是一条每三格转一次的通路*/ for(j=3;j<m;j+=3) { for(k=0;k<3;k++) { i=(j-3)+k+1; if(i*m+j<m*n) p[i*m+j]='.'; } } for(i=4;i<m;i+=3) for(k=0;k<3;k++) { j=(i-3)+k+2; if(i*m+j<m*n) p[i*m+j]='.'; } return p; } /*生成或修改迷宫后都需要输出新的迷宫*/ void showmaze(char*p,int m,int n) { int i,j;/*i代表行,j代表列,i*n+j是那个点在数组中的序号*/ for(i=0;i<n;i++) { for(j=0;j<m;j++) cout<<setw(2)<<p[i*m+j];/*每个字符占两个使得迷宫方正*/ cout<<endl; } } /*走迷宫函数mazetraverse*/ void mazetraverse(char*p,int m,int n) { int x,y,z;/*y是当前位置,x是前一步,z是后一步,t用于输入继续走迷宫的指令*/ /*初始化x,y,即迷宫入口的位置*/ x=m; y=m+1; p[y]='x';/*这是迷宫的第一步*/ cout<<"请按回车键移动:";/*让用户控制走迷宫的进程*/ cin.get(); cout<<endl; showmaze(p,m,n);/*输出走后的迷宫*/ cout<<endl; cout<<"请按回车键移动: "; cin.get(); /*关键在于用x,y确定z的值*/ while(!((y>m*(n-1))||(((y+1)%m)==0)))/*到达边界之前执行循环走迷宫*/ { /*判断右的方向,如果右为'.',则向右走*/ if(y-x==1)z=y+m; if(y-x==m)z=y-1; if(y-x==-m)z=y+1; if(y-x==-1)z=y-m; /*右不为'.'时,向y的前方走*/ if(p[z]=='#') { /*判断y的前方,如果前为'.',则向前走*/ if(y-x==1)z=y+1; if(y-x==m)z=y+m; if(y-x==-m)z=y-m; if(y-x==-1)z=y-1; /*如果前方为'#',要向左走*/ if(p[z]=='#') { /*判断左的位置*/ if(y-x==1)z=y-m; if(y-x==m)z=y+1; if(y-x==-m)z=y-1; if(y-x==-1)z=y+m; /*如果左为'#',为死路,需要向后走*/ if(p[z]=='#')z=x; } } p[z]='x';/*最后都要让z的位置为'x',表示走过的痕迹*/ showmaze(p,m,n); cout<<endl; cout<<"请按回车键移动: "; cin.get(); cout<<endl; /*替换x,y实现当前位置的移动*/ x=y; y=z; } } int main() { int m,n;/*n是迷宫的阶数,由于输出窗口大小的限制, n不能大于每行所能显示的字符个数*/ cout<<" 陈伟航的迷宫游戏\n我的迷宫可是很整洁的哦!^_^\n"<<endl; cout<<"这是一个可任意选择大小的迷宫,"<<endl; cout<<"每次生成的迷宫都不同。\n"<<endl; cout<<"因为屏幕一次最多显示80个字符,\n这里每个字符又占两格,"<<endl <<"所以输入超过40阶就不好看啦,\n虽然它还是对的。哈哈\n"<<endl; cout<<"请依次输入迷宫的宽度m和高度n(m>2,n>2):"<<endl; /*可以进行多组数据的测试*/ while(cin>>m>>n) { char*a=mazegenerator(m,n); showmaze(a,m,n); cout<<endl; cout<<"万里长征第一步:\n"<<endl; mazetraverse(a,m,n); cout<<"恭喜你!你已成功走出迷宫!"<<endl<<endl; cout<<"如要尝试新的迷宫,请输入新迷宫的阶数n(n>2),\n否则,按ctrl+z,再按enter结束"<<endl; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
上一篇:c语言 sscanf,scanf,fscanf正则表达式用法
栏 目:C语言
本文标题:迷宫游戏控制台版C++代码
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/820.html
您可能感兴趣的文章
- 01-10C语言游戏必备:光标定位与颜色设置的实现方法
- 01-10c语言在控制台判定鼠标左键的小例子
- 01-10Eclipse对printf()不能输出到控制台的快速解决方法
- 01-10vc6.0中c语言控制台程序中的定时技术(定时器)
- 01-10C语言的数字游戏算法效率问题探讨实例
- 01-10linux下实现的2048游戏示例分享
- 01-10win32 api实现2048游戏示例
- 01-10C语言借助EasyX实现的生命游戏源码
- 01-10C++ 实现2048游戏示例
- 01-10C++实现迷宫算法实例解析
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文