C++ 实现迷宫问题

通过C++设计了一个迷宫游戏,涉及到链表,C++基本操作,终端字符处理,深度优先遍历算法。下面开始吧!

  1. 在全局变量中定义地图,包括地图的长和高(30*20),同时还需定义一些标记。
  • flag 用于创建地图,true代表地图传创建成功。
  • slow用于更换游戏速度,true代表游戏慢速。
  • autogame用于更换游戏模式,true代表自动游戏。
#define MAX_X 20
#define MAX_Y 30
bool flag = false;
bool slow = false;
bool autogame = true;
int maze[MAX_X][MAX_Y];		//迷宫

2.路线栈

路线栈设计来记录移动路径。路径栈是一个类,它可以记录地图的坐标和移动轨迹。

class stack_of_maze{
private:
    //code
public:
    //code
};
  • 成员变量

       在成员变量中定义一个数据结构来包括地图坐标和移动信息。

//记录迷宫坐标
	struct node
	{
		int x;
		int y;
		char direction;  	//上一步路径(如何来的)
		node* next;
	};
	node* head;
  • 成员函数

       构造和析构

       

stack_of_maze(){
    //初始化
    head = NULL;
}

	~stack_of_maze(){
		node* p = head;
		//逐个删除
		while(head!=NULL){
			head = head->next;
			delete p;
			p = head;
		}
	}
	

       压栈

       设置一个新节点用于插入,首先将信息记录到新节点中,再把新节点插入到栈顶。这个函数的功能用于添加新的移动信息。

void push(int xx,int yy,char ddirection){
		//定义一个新节点
		node* new_node = new node;
		//赋值
		if(new_node!=NULL){
			new_node->x = xx;
			new_node->y = yy;
			new_node->direction = ddirection;
			new_node->next = NULL;
			//判断栈是否为空,如果为空则直接把新节点赋值给栈,否则添加到栈顶
			if(head==NULL)
				head = new_node;
			else{
				new_node->next = head;
				head = new_node;
			}
		}
		else
			cout<<"内存分配失败"<

       出栈

       推出栈顶元素,用于判断路径是否正确,如果下一个节点为空则说明路径错误,前方不能通行。

node* pop(int& xx,int& yy){
		if(head!=NULL){
			node* p = head;
			head = head->next;
			xx = p->x;
			yy = p->y;
			delete p;
		}
		return head;
	}

       打印

       打印路径信息。

void print(){
		if(head!=NULL){
			node* p = head;
			while(p!=NULL){
				cout<<" "<x<<" "<y<<" "<direction<next;
			}
		}
		else
			cout<<"栈为空,打印失败"<

3.创建地图

 首先把地图全设置为1,即死路,然后除了出入口和最外一层墙壁保持不变,其他位置采用随机函数来初始化通路为0。纵坐标为x,横坐标为y.

void createMaze(){
	int maxway = MAX_X * MAX_Y;		//最大通路
	int x,y;

    //先填充迷宫
	for(x=0;x

4. 打印地图

根据标记列表对应符号来打印地图。

void printMaze(){
    int x,y;
    //清屏,如果是windows环境使用system("cls")
    system("clear");    
    //打印地图
    for(x=0;x

4.1检查地图

因为地图的创建是随机的,所以为了能正确的进行游戏,检查创建的地图是否正确,这里传递定义一条备用路径来检验,如果通路则flag标记为true,游戏使用这个地图。

void check(stack_of_maze &s){
    //备份地图
	int temp[MAX_X][MAX_Y];
	for(int x=0;x

4.2移动

移动的规则是已知的,在这里主要进行命令识别,得到正确的命令后,首先判断下一个地址是否通路,如果是则要清除当前信息再移动到下一步。

void move(){
	int x=1,y=1;					//出发点	
    
    //一直游戏,直到走出
	while(1){
        //判断输入的命令
		switch(getch()){
			case 's':
				if(maze[x+1][y]==0){
                    //清空当前位置信息
					maze[x][y] = 0;
					x = x + 1;
                    //当前位置
					maze[x][y] = 7;			
					printMaze();
					if((x==MAX_X-1)&&(y==MAX_Y-2)){
						cout<<"\n\n              成功走出"<

4.3自动游戏

游戏会根据深度优先算法自动搜索路径,其中游戏会根据slow标志选择游戏速度。

void autoMove(stack_of_maze &s){
	int x=1,y=1;					//出发点	
	while(1){
		maze[x][y] = 2;

		//向下
		if(maze[x+1][y]==0){
			s.push(x,y,'D');
			maze[x][y] = 3;			//在当前位置做一个向下的标志
			x = x + 1;
			maze[x][y] = 7;			//当前位置
			if(slow)
				printMaze();
			if((x==MAX_X-1)&&(y==MAX_Y-2)){
				s.push(x,y,'*');
				cout<<"\n\n              成功走出"<

4.4 开始游戏

首先会调用函数创建地图,然后根据标志位来进行游戏。因为会回调menu()函数,所以前面需要先声明一下。

void menu();

void gamestart(){
    //初始化地图
	flag = false;
	while(!flag){
		stack_of_maze stack;
        //创建地图
		createMaze();
        //检查地图是否创建成功
		check(stack);
        //模仿进度条
		system("clear");
		cout<<"\t*                loading.              *"<

4.5 菜单

定义一个简单的菜单来选择游戏模式。

void menu(){
	system("clear");
	int num;
	cout<<"\t****************************************"<

4.6 主函数

int main(int argc,char** argv){
	menu();
	return 0;
}

5.界面截图

C++ 实现迷宫问题_第1张图片 maze 地图 C++ 实现迷宫问题_第2张图片 autogame model  C++ 实现迷宫问题_第3张图片 menu

 

你可能感兴趣的:(个人随笔)