C++迷宫的实现代码

本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下

//文件的输入,有墙
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<fstream>
using namespace std;
const int max1=100*100;   //加入墙
const int max2=102;
bool value[max2][max2];   //记录是否被访问过
int maze[max2][max2];    //迷宫的大小
int n,m;   //输入迷宫的长和宽
ofstream outfile("path.txt");   //文件保存迷宫及输出的路径
struct Point   //栈中的数据
{
 int x;
 int y;
};
struct Stack
{
 int top;
 Point path[max1];  //存坐标点的数组栈
 stack()
 {
 top=-1;    //栈中从0开始存数据
 }
 bool Empty()  //检验是否为空
 {
 if(top==-1)return true;
 else
  return false;
 }
 void Clear()   //清空栈
 {
 top=-1;
 }
 void Push(Point p)   //进栈
 {
 top++;
 path[top]=p;
 }
 Point Pop()    //返回栈顶元素
 {
 return path[top];
 }
 void Delete_Pop()   //删除顶栈元素
 {
 top--;
 }
 int Y_N_Push()
 {
 int x=path[top].x;
 int y=path[top].y;
 if(x<1||y<1||x>n||y>m||!value[x][y]||maze[x][y])    //不符合要求
 {
  value[x][y]=false;   //标记这个点被访问过(不能任意做标记)
  return 1;
 }
 else
  if((x==n)&&(y==m))   //已经找到出口,不要标记,后面直接跳出
  return 2;
  else
  {
  value[x][y]=false;   //标记这个点被访问过
  return 3;    //可以进栈
  }
 }
 void Output()   //输出栈中的路径
 {
 int i;
 for(i=0;i<top;i++)
 {
  cout<<"("<<path[i].x<<","<<path[i].y<<")"<<"--->";
 }
 cout<<"("<<path[i].x<<","<<path[i].y<<")"<<endl;
 outfile<<"该迷宫的路径为:"<<endl;   //文件的输出
 for(i=0;i<top;i++)
 {
  outfile<<"("<<path[i].x<<","<<path[i].y<<")"<<"--->";
 }
 outfile<<"("<<path[i].x<<","<<path[i].y<<")"<<endl;
 }
};
Stack stack;     //不可以放在栈的定义前面
bool Test_value()     //检验每个节点是否是否被访问过,全访问过了则为true,false为没有全部访问过
{
 int i,j;
 bool t=true;
 for(i=1;i<=n;i++)
 for(j=1;j<=m;j++)
  if(value[i][j]!=false)
  {
  t=false;
  break;
  }
 return t;
}
int Judge()
{
 Point t;
 int frage=0;    //先规定先向右
 while(frage==0)
 {
 t=stack.Pop();   //返回栈顶元素
 t.y=t.y+1;   //向右
 stack.Push(t);
 if(stack.Y_N_Push()==1)   //不符合要求的节点
 {
  stack.Delete_Pop();
  t=stack.Pop();
  t.x=t.x+1;      //向下
  stack.Push(t);
  if(stack.Y_N_Push()==1)
  {
  stack.Delete_Pop();
  t=stack.Pop();
  t.y=t.y-1;     //向左
  stack.Push(t);
  if(stack.Y_N_Push()==1)
  {
   stack.Delete_Pop();
   t=stack.Pop();
   t.x=t.x-1;    //向上
   stack.Push(t);
   if(stack.Y_N_Push()==1)
   {
   frage=4;    //这个点4个方向都不成立
   stack.Delete_Pop();
   }
  }
  }
 }
 if(stack.Y_N_Push()==2)
 {
  frage=5;    //找到了出口并跳出
  break;
 }
 }
return frage;
}
void Search()
{
 stack.Clear();
 Point u;
 u.x=1;
 u.y=1;
 stack.Push(u);
 value[1][1]=false;
 while(true)
 {
 int t=Judge();
 if(t==5)   //找到了路
 {
  cout<<"找到了能通的路,路径为(用那个点的坐标表示):"<<endl;
  stack.Output();
  break;
 }
 if(t==4)stack.Delete_Pop();   //退回一个点继续找
 if((Test_value()==true)||(stack.top==-1))   //很重要的条件,stack.top==-1,否则的话当有个点四周都不能通过的话,而且前面的点也不能通的话,就没有通路
 {
  cout<<"没有通路!"<<endl;
  outfile<<"没有通路!"<<endl;
  break;
 }
 }
}
int main()
{
 int i,j;
 cout<<"请输入迷宫的长和宽:";   //二维数组从maze[0][0]开始
 cin>>n>>m;
 for(i=0;i<=(m+1);i++)
 maze[0][i]=maze[n+1][i]=1;
 for(i=1;i<=(n+1);i++)
 maze[i][0]=maze[i][m+1]=1;
 cout<<"输入迷宫,1为墙,0为可通路(规定左上角为入口,右下角为出口):"<<endl;
 srand(unsigned(time(NULL)));
 for(i=1;i<=n;i++)
 for(j=1;j<=m;j++)
  maze[i][j]=(rand()%2);
 maze[1][1]=maze[n][m]=0;
 cout<<"输入的迷宫(带有墙)是:"<<endl;
 for(i=0;i<=(n+1);i++)
 {
 for(j=0;j<=(m+1);j++)
  cout<<maze[i][j]<<" ";
 cout<<endl;
 }
 if(!outfile)
 {
  cerr<<"open error!"<<endl;
  exit(1);
 }
 outfile<<"生成"<<n<<"行"<<m<<"列"<<"的迷宫为:"<<endl;
 for(i=0;i<=(n+1);i++)
 {
 for(j=0;j<=(m+1);j++)
  outfile<<maze[i][j]<<" ";
 outfile<<endl;
 }
 for(i=1;i<=n;i++)   //记录从value[0][0]开始
 for(j=1;j<=m;j++)
  value[i][j]=true;
 Search();
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 迷宫游戏控制台版C++代码

    本文实例分享了C++设计的一个可以调整大小的迷宫游戏,给定迷宫的入口.如果存在出口,程序能够显示行走的路径,并最终到达出口,并输出"成功走出迷宫":如果不存在出口,程序也能够显示行走的过程,并最终回退到入口,并输出"回退到入口". //这是一个迷宫游戏 #include<iostream> #include<ctime> #include<cstdlib>/*用于生成随机数,形成随机变化的迷宫*/ #include<ioma

  • C++基于prim实现迷宫生成

    本文实例为大家分享了C++实现迷宫生成的具体代码,供大家参考,具体内容如下 只用到了c++中的vector,其余的和纯C差别不大,纯C可能需要手动弄一个vector太繁琐了不太想弄. 看了迷宫的一些算法,prim还是比较好看的,网上的代码python c#居多,而且不太容易搞懂,那我在这里用C++(大部分C)实现了这个目的 prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科). 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),

  • C++实现迷宫小游戏

    介绍 本程序是根据广度优先遍历算法的思想设计的一款迷宫游戏,游戏设计了两种模式一种自动游戏模式,一种手动模式.因为项目在 Linux 开发,需要在 Windows 开发的,请查看源代码中需要修改地方的备注. 截图 代码 #include <iostream> #include <cstdlib> //标准库 #include <unistd.h> //延时函数 #include <stdio.h> //getchar #include <ctime&g

  • C++随机生成迷宫算法

    本文实例为大家分享了C++随机生成迷宫的具体代码,供大家参考,具体内容如下 我们今天来做一个迷宫游戏.在其中有几个要领: 1.方向的控制 我们建立的迷宫是以坐标的形式出现的,越往上x坐标越小,越往左y坐标越小,这雨平面直角坐标系不同,要注意! 2.随机生成算法: void init_maze(void); //初始化迷宫 void gotoxy(int x, int y); //移动光标 void path_up(int *x, int *y); //上构路径 void path_down(in

  • C++控制台实现随机生成路径迷宫游戏

    本程序是在控制台下随机生成迷宫路径的一个C++程序,可以通过修改宏定义 M 和 N 的值来修改迷宫的长度和宽度,运行程序后 按1开始游戏 按2退出游戏,游戏入口在左上角,出口在右下角,人物(星星)到达右下角出口提示成功闯关. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<iostream.h> #include<ctime

  • C++实现迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 #include<iostream> using namespace std; //点为2表示迷宫图为"█",点为0表示迷宫图为" " int migo[9][9]= { {2, 2, 2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 2, 0, 2, 2, 0, 2}, {2, 0, 2, 0, 0, 2,

  • C++迷宫问题的求解算法

    本文实例为大家分享了C++实现迷宫的具体代码,供大家参考,具体内容如下 一. 实验目的: (1) 熟练掌握链栈的基本操作及应用. (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序. 二.实验内容: [问题描述] 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. [基本要求] 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序.求得的通路以三元组(i,j,d)的形

  • C++利用循环和栈实现走迷宫

    本文实例为大家分享了C++利用循环和栈实现走迷宫的具体代码,供大家参考,具体内容如下 要求: 1.将地图的数组保存在文件中,从文件中读取行列数 2..动态开辟空间保存地图 3..运行结束后再地图上标出具体的走法 说明: 1.文件中第一行分别放置的是地图的行数和列数 2.其中1表示墙,即路不通,0表示路,即通路 3.程序运行结束后用2标记走过的路径 4.当走到"死胡同"时用3标记此路为死路 5.每到一个点,按照 左 上 右 下 的顺序去试探 6.没有处理入口就是"死胡同&quo

  • C++实现简单走迷宫的代码

    本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能从一个格子向它的上.下.左.右四个方向走,且不能重复.迷宫的入口和出口分别位于左上角和右下角,存在唯一的一条路径能够从入口到达出口,试着找出这条路径. 例如,下图是一个迷宫,红色表示走出迷宫的一条路径 输入:入口坐标(startX,startY),出口坐标(endX,endY) 输出:如果存在这样一

  • C++自动生成迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来 #include<stdlib.h> #include<iostream> #include<time.h> #include<queue> #include<stack> using namespace std; using std::queue; using std::stack; typedef st

  • C++利用递归实现走迷宫

    本文实例为大家分享了C++利用递归实现走迷宫的具体代码,供大家参考,具体内容如下 要求: 1.将地图的数组保存在文件中,从文件中读取行列数 2..动态开辟空间保存地图 3..运行结束后再地图上标出具体的走法 说明: 1.文件中第一行分别放置的是地图的行数和列数 2.其中1表示墙,即路不通,0表示路,即通路 3.程序运行结束后用2标记走过的路径 4.当走到"死胡同"时用3标记此路为死路 5.每到一个点,按照 左 上 右 下 的顺序去试探 6.没有处理入口就是"死胡同"

随机推荐