迷宫生成器2.0
2025-11-17 21:35:06
发布于:江苏
修改H, W的值来控制大小
WASD控制方向
R键重新生成
#include <time.h>
#include <string>
#include <stdlib.h>
#include <windows.h>
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
const int H = 25, W = 25;
int Map[H][W], vis[H][W];
int d[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
struct Node {
int x, y;
Node(int x = 0, int y = 0): x(x), y(y) {}
};
Node player;
void gotoxy(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void init() {
player = Node(1, 1);
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
vis[i][j] = 0;
Map[i][j] = 1;
}
}
}
void draw() {
gotoxy(0, 0);
std::string str = "";
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (player.x == i && player.y == j) {
str += "\033[48;2;255;0;0m \033[0m";
} else if (Map[i][j]) {
str += "\033[48;2;128;128;128m \033[0m";
} else {
str += "\033[48;2;255;255;255m \033[0m";
}
}
str += "\n";
}
puts(str.c_str());
}
void dfs(int x, int y) {
Map[x][y] = 0;
vis[x][y] = 1;
int order[4] = {0, 1, 2, 3};
for (int i = 3; i > 0; i--) {
std::swap(order[i], order[rand() % (i + 1)]);
}
for (int i = 0; i < 4; i++) {
int dx = x + d[order[i]][0] * 2, dy = y + d[order[i]][1] * 2;
if (0 <= dx && dx < H && 0 <= dy && dy < W && !vis[dx][dy]) {
Map[x + d[order[i]][0]][y + d[order[i]][1]] = 0;
dfs(dx, dy);
}
}
}
void move(int dir) {
player.x += d[dir][0], player.y += d[dir][1];
if (Map[player.x][player.y]) {
player.x -= d[dir][0], player.y -= d[dir][1];
}
}
int main() {
srand(time(0));
init();
dfs(H / 2 % 2 == 0 ? H / 2 - 1 : H / 2, W / 2 % 2 == 0 ? W / 2 - 1 : W / 2);
while (true) {
draw();
if (KEY_DOWN('W')) {
move(0);
}
if (KEY_DOWN('S')) {
move(1);
}
if (KEY_DOWN('A')) {
move(2);
}
if (KEY_DOWN('D')) {
move(3);
}
if (KEY_DOWN('R')) {
init();
dfs(H / 2 % 2 == 0 ? H / 2 - 1 : H / 2, W / 2 % 2 == 0 ? W / 2 - 1 : W / 2);
}
Sleep(50);
}
return 0;
}
这里空空如也







有帮助,赞一个