可视化随机地图走迷宫
2024-11-02 19:56:54
发布于:广东
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
const int M = 45;
const int N = M*M;
int n;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
bool vis[M][M];
char input;
int road[M][M][2];
stack<pair<int,int>>zd;
char mp[M][M];
void SCAB(int ForgC, int BackC) {
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}
void gotoxy(short x,short y){
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}struct node{
int x,y;
};
void hidden(){ //隐藏光标
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,&cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut,&cci);
}
void init(){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
if(j==0 or i == 0 or i==n+1 or j==n+1)mp[i][j] = '#';
else mp[i][j] = ' ';
}
}memset(vis,0,sizeof vis);
memset(road,0,sizeof road);
}void rm(){
bool vis_[M][M];
memset(vis_,0,sizeof vis_);
queue<pair<int,int>>q;
q.push({1,1});
vis_[1][1] = 1;
while(q.size()){
auto f= q.front();
int fi = f.first,se = f.second;
q.pop();
int _ = rand()%7;
if(_<=1){
if(fi < n and !vis_[fi+1][se]){
mp[fi+1][se] = ' ';
q.push({fi+1,se});
vis_[fi+1][se] = 1;
}
if(se < n and !vis_[fi][se+1]){
if(fi+se+1 == n*2){
mp[n][n] = ' ';
break;
}
mp[fi][se] = '#';
q.push({fi,se+1});
vis_[fi][se+1] = 1;
}
}else if(_<=3){
if(fi < n and !vis_[fi+1][se]){
if(fi+1+se == n*2){
mp[n][n] = ' ';
break;
}
mp[fi+1][se] = '#';
q.push({fi+1,se});
vis_[fi+1][se] = 1;
}
if(se < n and !vis_[fi][se+1]){
mp[fi][se] = ' ';
q.push({fi,se+1});
vis_[fi][se+1] = 1;
}
}else if(_<=4){
if(fi < n and !vis_[fi+1][se]){
mp[fi+1][se] = ' ';
q.push({fi+1,se});
vis_[fi+1][se] = 1;
}
if(se < n and !vis_[fi][se+1]){
mp[fi][se] = ' ';
q.push({fi,se+1});
vis_[fi][se+1] = 1;
}
}else{
mp[fi][se+1] = (fi!=n or se+1 != n)?'#':' ';
mp[fi+1][se] = (fi+1!=n or se != n)?'#':' ';
if(fi<n)q.push({fi+1,se});
if(se<n)q.push({fi,se+1});
}
}return;
}void draw(){
gotoxy(0,0);
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++)cout << mp[i][j];
cout << endl;
}
}void kd(){
queue<node>q;
q.push({1,1});
vis[1][1] = 1;
while(q.size()){
auto f = q.front();
q.pop();
if(f.x==n and f.y==n)break;
for(int i=0;i<4;i++){
int nx = f.x + dx[i],ny = f.y + dy[i];
if(mp[nx][ny]==' ' and !vis[nx][ny]){
road[nx][ny][0] = f.x;
road[nx][ny][1] = f.y;
q.push({nx,ny});
vis[nx][ny] = 1;
}
}
}int i=n,j = n;
while(i!=0 or j!=0){
zd.push({i,j});
int ji = i,jj = j;
i = road[ji][jj][0];
j = road[ji][jj][1];
}
}
int main(){
// https://blog.csdn.net/a540885408854088/article/details/142405181?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-142405181-blog-52792472.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-142405181-blog-52792472.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=6
// 可以看上面调颜色
SCAB(10,0);
hidden();
srand(time(0));
cout <<"地图边长(最多27不然地图装不下):";
cin >> n;
while(true){
int _ = 0;
do{
init();
rm();
kd();
cout << "已刷新"<<++_<<"次地图"<<endl;
}while(road[n][n][0] == 0);
system("cls");
cout << "已刷新"<<_<<"次地图"<<endl;
cout << "正在加载地图中";
Sleep(1500);
system("cls");
mp[1][1] = '@';
mp[n][n] = '$';
draw();
cout << "按除e以外的键开始";
input = getch();
if(input=='e')return 0;
while(true){
auto f = zd.top();
zd.pop();
mp[f.first][f.second] = '@';
mp[n][n] = '$';
draw();
Sleep(100);
mp[f.first][f.second] = ' ';
if(f.first==n and f.second == n)break;
}
}
return 0;
}
全部评论 2
很有精神!
2024-11-02 来自 广东
0做的好!
2024-11-02 来自 广东
0
有帮助,赞一个