📄 maze.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
<<"┃ 学号:20072110010112 ┃"<<endl
<<"┃ 班级:07软件工程(1)班 ┃"<<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 + -