c++设计一个简单的迷宫游戏
时间: 2023-07-31 22:11:05 浏览: 50
好的,下面是一个简单的迷宫游戏的实现,主要用到了C++的基础语法和一些STL容器。
首先,我们需要定义一个迷宫类Maze,包含迷宫的大小、起点、终点和障碍物等信息。在迷宫类中,我们需要定义一个二维数组来表示迷宫地图,其中0表示空地,1表示墙壁。
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <ctime>
#include <cstdlib>
using namespace std;
class Maze {
public:
Maze(int m, int n) : m(m), n(n), start_x(0), start_y(0), end_x(m - 1), end_y(n - 1) {
// 初始化迷宫地图
for (int i = 0; i < m; i++) {
vector<int> row(n, 0);
map.push_back(row);
}
}
// 创建迷宫
void create() {
srand((unsigned)time(nullptr)); // 设置随机数种子
// 设置起点和终点
map[start_x][start_y] = 0;
map[end_x][end_y] = 0;
// 设置障碍物
int wall_num = m * n / 4;
for (int i = 0; i < wall_num; i++) {
int x = rand() % m;
int y = rand() % n;
if (x == start_x && y == start_y || x == end_x && y == end_y || map[x][y] == 1) { // 排除起点、终点和已经设置的障碍物
i--;
continue;
}
map[x][y] = 1;
}
}
// 显示迷宫
void show() {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 0) {
if (i == start_x && j == start_y) cout << "S "; // 起点
else if (i == end_x && j == end_y) cout << "E "; // 终点
else cout << " ";
}
else cout << "# ";
}
cout << endl;
}
}
// 广度优先搜索
bool bfs() {
vector<vector<bool>> visited(m, vector<bool>(n, false)); // 记录是否访问过
queue<pair<int, int>> q;
q.push(make_pair(start_x, start_y));
visited[start_x][start_y] = true;
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if (x == end_x && y == end_y) return true; // 找到终点
// 向四个方向扩展
if (x > 0 && !visited[x - 1][y] && map[x - 1][y] == 0) {
q.push(make_pair(x - 1, y));
visited[x - 1][y] = true;
}
if (x < m - 1 && !visited[x + 1][y] && map[x + 1][y] == 0) {
q.push(make_pair(x + 1, y));
visited[x + 1][y] = true;
}
if (y > 0 && !visited[x][y - 1] && map[x][y - 1] == 0) {
q.push(make_pair(x, y - 1));
visited[x][y - 1] = true;
}
if (y < n - 1 && !visited[x][y + 1] && map[x][y + 1] == 0) {
q.push(make_pair(x, y + 1));
visited[x][y + 1] = true;
}
}
return false; // 没有找到终点
}
// 深度优先搜索
bool dfs() {
vector<vector<bool>> visited(m, vector<bool>(n, false)); // 记录是否访问过
stack<pair<int, int>> s;
s.push(make_pair(start_x, start_y));
while (!s.empty()) {
int x = s.top().first;
int y = s.top().second;
s.pop();
if (x == end_x && y == end_y) return true; // 找到终点
if (visited[x][y]) continue;
visited[x][y] = true;
// 向四个方向扩展
if (y < n - 1 && !visited[x][y + 1] && map[x][y + 1] == 0) s.push(make_pair(x, y + 1));
if (x < m - 1 && !visited[x + 1][y] && map[x + 1][y] == 0) s.push(make_pair(x + 1, y));
if (y > 0 && !visited[x][y - 1] && map[x][y - 1] == 0) s.push(make_pair(x, y - 1));
if (x > 0 && !visited[x - 1][y] && map[x - 1][y] == 0) s.push(make_pair(x - 1, y));
}
return false; // 没有找到终点
}
private:
int m, n; // 迷宫大小
vector<vector<int>> map; // 迷宫地图
int start_x, start_y; // 起点坐标
int end_x, end_y; // 终点坐标
};
```
接下来,我们编写一个简单的主函数,使用上面定义的迷宫类来创建迷宫和进行搜索。
```cpp
int main() {
Maze maze(10, 20); // 创建一个10*20的迷宫
maze.create(); // 创建迷宫
maze.show(); // 显示迷宫
cout << "使用广度优先搜索:" << endl;
if (maze.bfs()) cout << "找到了一条路径" << endl;
else cout << "没有找到路径" << endl;
cout << "使用深度优先搜索:" << endl;
if (maze.dfs()) cout << "找到了一条路径" << endl;
else cout << "没有找到路径" << endl;
return 0;
}
```
编译运行后,可以看到生成的迷宫地图、搜索结果和路径。