⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze.cpp

📁 数据结构的课程设计
💻 CPP
字号:
#include "Maze.h"
#include <windows.h>//gotoxy函数需要包含的头文件
#include <iostream>     
using namespace std;
void Maze::m_MakeGraph(){//绘制地图函数
	cout<<"绘制地图:"<<endl
		<<"请输入迷宫大小:"<<endl
		<<"X:";
	cin>>Graph_y;
	cout<<"Y:";
	cin>>Graph_x;
	cout<<"请输入大小为"<<Graph_x<<"*"<<Graph_y<<"的迷宫,1代表能通过,0代表不能通过"<<endl
		<<"B代表起点,E代表终点(注意周围一圈一定要0):"<<endl;
	for(int j=0;j<Graph_x;j++){//循环读取输入的字符并存进地图数组
		for(int k=0;k<Graph_y;k++){
			cin>>m_Graph[j][k];
			m_Graph_[j][k] = m_Graph[j][k];
			if(m_Graph[j][k] == 'B'){//如果输入的字符是B,则设定初始位置为这个位置
				Cur.x = k;
				Cur.y = j;
			}
			if(m_Graph[j][k] == 'E'){//如果输入的字符是E,则设定终点位置为这个位置
				End.x = k;
				End.y = j;
			}
		}
	}
	m_Go(Cur.x,Cur.y);//开始移动
}
void Maze::gotoxy(int x,int y)//光标定位函数,将光标定位到坐标(x,y)
{   
      COORD c;   
      c.X = x - 1;   
      c.Y = y - 1;   
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);   
}
bool Maze::m_Pass(int x, int y){//判断坐标(x,y)是否可走
	if(m_Graph[y][x] != '0') return true;
	else return false;
}

void Maze::m_Go(int x,int y){//在坐标(x,y)除探测移动位置
	if(m_Pass(x,y)){//如果该位置可走
		m_Graph[y][x] = '0';//将位置标记不可走
		if(m_Pass(x+1,y)){//如果该位置的右边可走
			m_Position.push(Cur);//将该位置压入堆栈
			Cur.x++;//将当前位置向右移
			if(x != End.x || y != End.y) m_Go(Cur.x,Cur.y);//如果移动后的位置不是终点,则递归向下探测位置
		} 
		else if(m_Pass(x,y+1)){//如果该位置的下边可走
			m_Position.push(Cur);//将该位置压入堆栈
			Cur.y++;//将该位置向下移
			if(x != End.x || y != End.y) m_Go(Cur.x,Cur.y);//如果移动后的位置不是终点,则递归向下探测位置
		}
		else if(m_Pass(x-1,y)){//如果该位置的左边可走
			m_Position.push(Cur);//将该位置压入堆栈
			Cur.x--;//将该位置向左移
			if(x != End.x || y != End.y) m_Go(Cur.x,Cur.y);//如果移动后的位置不是终点,则递归向下探测位置
		}
		else if(m_Pass(x,y-1)){//如果该位置的上边可走
			m_Position.push(Cur);//将该位置压入堆栈
			Cur.y--;//将该位置向上移
			if(x != End.x || y != End.y) m_Go(Cur.x,Cur.y);//如果移动后的位置不是终点,则递归向下探测位置
		}
		else if(!m_Position.empty()){//如果该位置的四个方向都不可走
			Cur.x = m_Position.top().x;//取栈顶元素,将当前位置设置为栈顶元素的位置
			Cur.y = m_Position.top().y;//取栈顶元素,将当前位置设置为栈顶元素的位置
			m_Position.pop();//弹出栈顶元素
			m_Graph[Cur.y][Cur.x] = '1';//将当前位置标记可走
			m_Go(Cur.x,Cur.y);//继续递归当前位置
		}
	}
}
void Maze::m_PrintGraph(){//输出地图函数
	for(int i=0;i<10;i++){
		for(int m=0;m<10;m++){
			cout<<m_Graph_[i][m];
		}
		cout<<endl;
	}
}
void Maze::m_Start(){//开始执行程序函数
	system("cls");
	system("color 5E");
	cout<<"┏━━━━━━━━━━━━━━━━━━━━┓"<<endl
		<<"┃              欢迎来到迷宫游戏          ┃"<<endl
		<<"┣━━━━━━━━━━━━━━━━━━━━┫"<<endl
		<<"┃                                        ┃"<<endl
		<<"┃           姓名:陈岚                   ┃"<<endl
		<<"┃           学号:                       ┃"<<endl
		<<"┃           班级:07软件+电商            ┃"<<endl
		<<"┃                                        ┃"<<endl
		<<"┃             1.开始游戏                 ┃"<<endl
		<<"┃             2.游戏说明                 ┃"<<endl
		<<"┃             3.退出游戏                 ┃"<<endl
		<<"┃           请选择:                     ┃"<<endl
		<<"┃                                        ┃"<<endl
		<<"┗━━━━━━━━━━━━━━━━━━━━┛"<<endl;
	gotoxy(22,12);
	int choose;
	cin>>choose;
	switch(choose){
	case 1:system("cls");m_MakeGraph();m_PrintPath();break;
	case 2:system("cls");m_Info();break;
	case 3:system("exit");
	}
	
}
void Maze::m_Info(){//程序信息函数
	cout<<"┏━━━━━━━━━━━━━━━━━━━━┓"<<endl
		<<"┃              迷宫游戏说明              ┃"<<endl
		<<"┣━━━━━━━━━━━━━━━━━━━━┫"<<endl
		<<"┃     本程序为陈岚的2008-2009学年度第一  ┃"<<endl
		<<"┃ 学期期末数据结构课程设计。             ┃"<<endl
		<<"┃     程序设计中使用到了堆栈的“后进先   ┃"<<endl
		<<"┃  出(LIFO)”的思想。                    ┃"<<endl
		<<"┃  游戏方法:                            ┃"<<endl
		<<"┃     首先输入迷宫的长,宽,然后使用0,   ┃"<<endl
		<<"┃  1,E,B构造一个迷宫,程序就会输出走出迷  ┃"<<endl
		<<"┃  宫的路线。                            ┃"<<endl
		<<"┗━━━━━━━━━━━━━━━━━━━━┛"<<endl;
	system("pause>nul");
	m_Start();
}
void Maze::m_PrintPath(){//输出迷宫探测的路径
	system("cls");
	if(m_Position.empty()){//如果位置堆栈为空,则没走出迷宫
		cout<<"┏━━━━━━━━━━━━━━━━━━━━┓"<<endl
			<<"┃            迷宫游戏输出路径            ┃"<<endl
			<<"┣━━━━━━━━━━━━━━━━━━━━┫"<<endl
			<<"┃                                        ┃"<<endl
			<<"┃   Sorry!没能走出迷宫,再来一次吧!     ┃"<<endl
			<<"┃                                        ┃"<<endl
			<<"┗━━━━━━━━━━━━━━━━━━━━┛"<<endl;
		system("pause>nul");
		m_Start();
	}
	else{//走出迷宫的情况
		stack<Pos> temp;//定义位置堆栈,用于
		stack<Pos> path;
		while(!m_Position.empty()){//循环将位置堆栈的栈顶元素压入两个位置堆栈
			temp.push(m_Position.top());
			path.push(m_Position.top());
			m_Position.pop();
		}
		cout<<"走过的路径在地图上为(*表示):"<<endl;
		m_PrintGraph();//输出原始地图
		while(!path.empty()){//输出走出迷宫的路径
			gotoxy(path.top().x+1,path.top().y+2);//通过控制光标的位置显示出走出迷宫的路径
			cout<<"*";
			path.pop();
		}
		gotoxy(1,End.y+4);
		cout<<"路径的文字描述为:"<<endl
			<<"("<<temp.top().x<<","<<temp.top().y<<")";
		temp.pop();
		while(!temp.empty()){//输出走出迷宫路径的坐标
			cout<<"→("<<temp.top().x<<","<<temp.top().y<<")";
			temp.pop();
		}
		cout<<endl;
	}
	system("pause>nul");
	m_Start();

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -