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);
}
}