利用深度优先及广度优先随机生成迷宫并实现玩家和电脑两种模式
头文件及宏定义
#include <iostream>
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#define _CRT_SECURE_NO_WARNINGS
#define N 2 //关卡数目
#define M N*50 //地图大小 M*M
#define MAX 300//栈和队列的大小
#define UPDATETIME 30//刷新的时间间隔
变量及函数声明
int level = 0;//游戏等级
int Map[M + 1][M + 1] = {
0 };
int count;//地图大小
int isHaveFind = 0;
int my_x, my_y; //我的位置
void Initialize(int count); //初始化地图
void Create1Power(int x, int y); //递归深度优先
void Create2Power(int x,int y); //广度优先
int InArea(int x, int y); //判断是否在合法位置
void print(int x, int y); //打印函数
int Run(); //运行游戏
int Update(int id);
void menu(); //菜单,选择难度和大小
void Pos(int x, int y); //设置光标位置,决定要在什么位置输出
int Resort(int x, int y); //电脑生成路线
int IsHaveNeighbor(int x, int y);//判断是否有邻居
设置方向数组,便于后面加减
int dir[4][2] = {
{
-1,0},
{
1,0},
{
0,-1},
{
0,1}
};
定义枚举类型
enum state
{
wall,
empty,
self,
end,
testFlag
};
定义info与枚举一一对应
char info[][3] = {
"■",//墙壁
" ",//空地
"⊙",//玩家
"☆",//终点
"◇",//测试图案
"○",//我也不知道会不会有用,先放着
};
深度优先:
void Create1Power(int x, int y)
{
//这里我们不再依次选取四个方向探索,而是从剩余的方向里选出一个方向探索
int i;
while (IsHaveNeighbor(x, y))
{
i = rand() % 4;
if (InArea(x + 2 * dir[i][0], y + 2 * dir[i][1]) &&
Map[x + 2 * dir[i][0]][y + 2 * dir[i][1]] == empty)
{
Map[x + dir[i][0]][y + dir[i][1]] = testFlag;
Map[x + 2 * dir[i][0]][y + 2 * dir[i][1]] = testFlag;
//可视化
print(x + dir[i][0], y + dir[i][1]);
Sleep(UPDATETIME);
Create1Power(x + 2 * dir[i][0], y + 2 * dir[i][1]);
}
}
}
广度优先:
typedef struct que
{
int xList[MAX];
int yList[MAX];
int front, rear;
}Que;
void