数据结构-迷宫

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "function.h"

void main()
{

	int maze[10][10] = {0};

	InitMaze(maze);
	DrawMaze(maze);
	//AImaze(maze,0,0);//递归方式走迷宫
	//if (maze[9][9] != 1)
	//	printf("此路不通\n");
	//else
	//	printf("走出来了\n");

	AImazeA(maze);//栈的方式走迷宫


	//ControlMaze(maze);
	system("pause");
}

function.h

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 1000


struct stackdata
{
	int i,j;
};
struct stack//定义栈结构
{
	stackdata data;//数组下标
	stack * next;
};


void push(stack *sk, int datai, int dataj);//入栈
stackdata pop(stack * sk);//出栈

//初始化
void InitMaze(int  maze[10][10]);

//绘制迷宫
void DrawMaze(int maze[10][10]);

//控制迷宫
void ControlMaze(int maze[10][10]);

void AImaze(int maze[10][10],int pi,int py);//迷宫AI递归

void AImazeA(int maze[10][10]);//非递归采用栈记录线路


function.cpp

#include <stdio.h>
#include <stdlib.h>
#include "function.h"
#include <Windows.h>
#include<conio.h>
#include <time.h>



void push(stack *sk,int datai,int dataj)//入栈
{
	stack *temp;
	temp = sk;
	while (temp->next)
		temp = temp->next;//找到最后一行

	temp->data.i = datai;
	temp->data.j= dataj;
	temp->next= (stack*)calloc(1,sizeof(stack));
}

stackdata pop(stack * sk)//出栈
{
	if (sk->next == NULL)//栈为空返回
		return (sk)->data;
	
	stack * temp;
	temp = sk;

	while (temp->next->next)
		temp = temp->next;

	stackdata sr;
	sr.i = temp->data.i;
	sr.j = temp->data.j;
	
	free(temp->next);
	temp->data = {0,0};
	temp->next = NULL;

	return sr;
}




//初始化
void InitMaze(int  maze[10][10])
{
	time_t ts;
	unsigned int num = time(&ts);
	srand(num);
	//maze[0][0] =1;
	for(int i=0;i<10;i++)
		for (int j = 0; j < 10; j++)
		{
			int sr = rand() % 10;
			if (sr > 7)//控制迷宫的阻挡数量1-10 值越小,主档数量越多
				maze[i][j] = 2;
		}
}


//绘制迷宫
void DrawMaze(int maze[10][10])
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			printf("%4d", maze[i][j]);
		}
		printf("\n");
	}
}

//控制迷宫
void ControlMaze(int maze[10][10])//
{
	int playi =0, playj = 0;//玩家坐标

		while (true)
		{
			if (maze[9][9] == 1)
			{
				printf("congratulations on coming out\n");
				break;

			}
			int key = 0;
			key = _getch();
			switch (key)
			{
			case 75://{
				//printf("左");
				if (maze[playi][playj - 1] == 0 && playj>-1)
				{
					maze[playi][playj] = 0;
					maze[playi][playj - 1] = 1;
					playj--;
				}
				printf("\n");
				DrawMaze(maze);

				break;
			}
			case 77://{
				//printf("右");
				if (maze[playi][playj + 1] == 0 && playj<9)
				{
					maze[playi][playj] = 0;
					maze[playi][playj + 1] = 1;
					playj++;

				}
				printf("\n");
				DrawMaze(maze);
				break;
			}

			case 72://{
				if (maze[playi - 1][playj] == 0 && playi>0)
				{
					maze[playi][playj] = 0;
					maze[playi - 1][playj] = 1;
					playi--;

				}
				printf("\n");
				DrawMaze(maze);
				break;
			}
			case 80://{
				if (maze[playi + 1][playj] == 0 && playi<9)
				{
					maze[playi][playj] = 0;
					maze[playi + 1][playj] = 1;
					playi++;

				}
				printf("\n");
				DrawMaze(maze);
				break;
				break;
			}
			case 27://退出
			{
				return;
			}
			default:
				break;
			}
			}
}
	



int mazea[10][10];//迷宫AI递归
void AImaze(int maze[10][10], int pi, int py)
{
	printf("\n");
	DrawMaze(maze);
	maze[pi][py] = 0;
	if (maze[pi][py + 1] == 0&&(py+1)<10&& mazea[pi][py + 1]==0)
	{

		mazea[pi][py + 1] = 1;
		maze[pi][py + 1] = 1;

		if (maze[9][9] == 1)//走出去了
			return;

		py++;
		Sleep(500);
		AImaze(maze, pi, py);
	} 

	if (maze[pi+1][py] == 0 && (pi + 1)<10&& mazea[pi + 1][py] ==0)
	{

		mazea[pi+1][py] = 1;
		maze[pi + 1][py] = 1;

		if (maze[9][9] == 1)//走出去了
			return;

		pi++;
		Sleep(1000);
		AImaze(maze, pi, py);
	}

	 if (maze[pi - 1][py] == 0 && (pi - 1)>0&& mazea[pi - 1][py]==0)
	{

		mazea[pi - 1][py] = 1;
		maze[pi - 1][py] = 1;

		if (maze[9][9] == 1)//走出去了
			return;
		pi--;
		Sleep(1000);
		AImaze(maze, pi, py);
	}

		if (maze[pi][py-1] == 0 && (py - 1)>0&& maze[pi][py - 1]==0)
	{


		mazea[pi][py-1] = 1;
		maze[pi][py - 1] = 1;

		if (maze[9][9] == 1)//走出去了
			return;
		py--;
		Sleep(1000);
		AImaze(maze, pi, py);
	}

}


void AImazeA(int maze[10][10])//采用栈记录线路
{
	stack * sk;//定义栈,用于存储前一个线路
	sk = (stack *)calloc(1,sizeof(stack));
	//InitStack(sk);//初始化栈
	int i = 0, j = 0;//定义坐标
	//sk = NULL;
	while (1)
	{
		printf("\n");
		DrawMaze(maze);

		if (maze[i][j + 1] == 0&&mazea[i][j+1]==0&&j<9)//右边可以走
		{
			mazea[i][j] = 1;
			maze[i][j] = 0;
			maze[i][j + 1] = 1;
			push(sk, i, j);
			j++;
		}
		else if (maze[i + 1][j] == 0 && mazea[i+1][j] == 0&&i<9)//下边可以走
		{
			mazea[i][j] = 1;
			maze[i][j] = 0;
			maze[i+1][j] = 1;
			push(sk, i, j);
			i++;
		}
		else if (maze[i][j - 1] == 0 && mazea[i][j-1] == 0&&j>0)//左边可以走
		{
			mazea[i][j] = 1;
			maze[i][j] = 0;
			maze[i][j-1] = 1;
			push(sk, i, j);
			j--;

		}
		else if (maze[i - 1][j] == 0 && mazea[i-1][j] == 0&&i>0)//上面可以走
		{
			mazea[i][j] = 1;
			maze[i][j] = 0;
			maze[i-1][j] = 1;
			push(sk, i, j);
			i--;
		}
		else//全都走不通,返回上一层
		{
			maze[i][j] = 0;
			mazea[i][j] = 1;
			stackdata ij;
			ij=pop(sk);
			i = ij.i;
			j = ij.j;
			mazea[i][j] = 0;
			maze[i][j] = 1;
			
		}

		if (sk->next == NULL&&maze[9][9] != 1)
		{
			printf("无路可走\n");
			break;
		}

		if(maze[9][9] == 1)
		{
			printf("\n");
			DrawMaze(maze);
			printf("走出来了\n");
			break;
		}

		Sleep(1000);

	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值