C++自动生成迷宫游戏
2020-03-22 12:08
791 查看
本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下
运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来
#include<stdlib.h> #include<iostream> #include<time.h> #include<queue> #include<stack> using namespace std; using std::queue; using std::stack; typedef struct Point { int x; int y; int d;//方向 若方向为-1,则表示起点 }Point; queue<Point> mqueue; stack<Point> mstack; Point pos, pos1; int m, n;//迷宫行(tm-1)/2和列(tn-1)/2 int tm, tn;//实际作图 int x, y, tx1, tx2, ty1, ty2;//点坐标 int d; int s[10000000]; int maze[1000][1000], mark[1000][1000];//最大迷宫 int sign[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };//上下左右四个方向 0上 1下 2上 3下 Point start; int Find_x(int x); void unionSets(int node1, int node2); void Init(); int getAdd(int x, int y); void foundpath(); void fixmaze(); int connected(int node1, int node2); void Findpath(); void changemaze(); int main() { Init(); cout << "请输入迷宫规模2x-1,2y-1:(x y)" << endl; cin >> m >> n; tm = m * 2 + 1; tn = n * 2 + 1; start.x = 1; start.y = 1; start.d = -1; mqueue.push(start); for (int i = 0; i < tm; i++) { for (int j = 0; j < tn; j++) { maze[i][j] = 1; mark[i][j] = 0; } } for (int i = 1; i < tm - 1; i += 2) { for (int j = 1; j < tn - 1; j += 2) maze[i][j] = 0; } srand(time(NULL)); foundpath(); fixmaze(); cout << "迷宫全图:" << endl; for (int i = 0; i < tm; i++) { for (int j = 0; j < tn; j++) { if (maze[i][j] == 1) cout << "▇"; else if (maze[i][j] == 0) cout << "□"; } cout << endl; } Findpath(); changemaze(); cout << "找到的通路:“..”表示:" << endl; for (int i = 0; i < tm; i++) { for (int j = 0; j < tn; j++) { if (maze[i][j] == 1) cout << "▇"; else if (maze[i][j] == 0) cout << "□"; else if (maze[i][j] == -1) cout << ".."; } cout << endl; } system("pause"); return 0; } int connected(int node1, int node2) { return Find_x(node1) == Find_x(node2); } int Find_x(int x) { if (s[x] < 0) return x; else return Find_x(s[x]); }; void unionSets(int node1, int node2) { int root1 = Find_x(node1); int root2 = Find_x(node2); if (root1 == root2) return; if (s[root2] < s[root1]) s[root1] = root2; else { if (s[root1] == s[root2]) s[root1]--; s[root2] = root1; } }; int getAdd(int x, int y) { return (x*tn + y); }; void Init() { for (int i = 0; i < 10000000; ++i) s[i] = -1; }; void foundpath() { while (connected(getAdd(1, 1), getAdd(tm - 2, tn - 2)) != 1) { do { x = rand() % (tm - 2) + 1; y = rand() % (tn - 2) + 1; } while (maze[x][y] == 0); d = x % 2; if (d == 0) { tx1 = x + 1; ty1 = y; tx2 = x - 1; ty2 = y; if (connected(getAdd(tx1, ty1), getAdd(tx2, ty2)) != 1) { maze[x][y] = 0; unionSets(Find_x(getAdd(tx1, ty1)), Find_x(getAdd(tx2, ty2))); } } else if (d == 1) { tx1 = x; ty1 = y + 1; tx2 = x; ty2 = y - 1; if (connected(getAdd(tx1, ty1), getAdd(tx2, ty2)) != 1) { maze[x][y] = 0; unionSets(Find_x(getAdd(tx1, ty1)), Find_x(getAdd(tx2, ty2))); } } } } void fixmaze() { for (int i = 1; i < tm - 1; i++) { for (int j = 1; j < tn - 1; j++) { if (maze[i - 1][j] == 1 && maze[i + 1][j] == 1 && maze[i][j + 1] == 1 && maze[i][j - 1] == 1) { maze[i][j] = 1; } } } for (int i = 1; i < tm - 1; i++) { for (int j = 1; j < tn - 1; j++) { if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 1 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 1 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 1 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 1 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 1 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 1 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 1 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 1 && maze[i + 1][j + 1] == 0) { maze[i][j] = 1; } if (maze[i - 1][j - 1] == 0 && maze[i - 1][j] == 0 && maze[i - 1][j + 1] == 0 && maze[i][j - 1] == 0 && maze[i][j] == 0 && maze[i][j + 1] == 0 && maze[i + 1][j - 1] == 0 && maze[i + 1][j] == 0 && maze[i + 1][j + 1] == 1) { maze[i][j] = 1; } } }//局部优化,防止出现大面积通路 } void Findpath() { int flag = 0; int i, j; while (!mqueue.empty()) { i = mqueue.front().x; j = mqueue.front().y; mark[i][j] = 1; for (int k = 0; k < 4; k++) { if (mark[i + sign[k][0]][j + sign[k][1]] == 0 && maze[i + sign[k][0]][j + sign[k][1]] == 0) { pos.x = i + sign[k][0]; pos.y = j + sign[k][1]; pos.d = k; mark[pos.x][pos.y] = 1; mqueue.push(pos); if (mqueue.back().x == tm - 2 && mqueue.back().y == tn - 2) { mstack.push(mqueue.front()); mstack.push(mqueue.back()); flag = 1; break; } } } if (flag) break; mstack.push(mqueue.front()); if (!mqueue.empty()) mqueue.pop(); } } void changemaze() { int i, j, k; i = mstack.top().x; j = mstack.top().y; k = mstack.top().d; maze[i][j] = -1; while (mstack.size()>0) { if (mstack.top().x == i - sign[k][0] && mstack.top().y == j - sign[k][1]) { i = i - sign[k][0]; j = j - sign[k][1]; k = mstack.top().d; maze[i][j] = -1; if (!mstack.empty()) mstack.pop(); } else if (!mstack.empty()) mstack.pop(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- C++控制台实现随机生成路径迷宫游戏
- Swift数独游戏优化——C++与OC混编、plist自动生成
- 迷宫游戏_自动生成地图
- 迷宫自动生成游戏。
- 迷宫(自动生成)游戏【超简版】——C语言小游戏一
- C++如何拒绝编译器自动生成的函数
- C++基于prim实现迷宫生成
- UML建模详解(9)—Rose将C++代码自动生成UML类图详解
- 不要被C++“自动生成”所蒙骗
- PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
- C/C++实现的游戏角色名称名字随机生成代码
- C++ 迷宫游戏实现代码
- 如何自动生成Jni的Java层调C++层的头文件
- 编译器为C++ 空类自动生成的成员函数
- C#自动生成迷宫
- c++程序编译后自动生成的文件有什么用
- 不要被C++“自动生成”所蒙骗
- ndk 自动生成c++代码
- 2048 游戏中自动生成卡片实现
- 迷宫游戏控制台版C++代码