迷宫生成+play
2024-08-16 11:41:59
发布于:江苏
复制到Dev里
输入一个数
注意要是大于1的奇数!!!!!!!!!
不要太大!!!!!!!!!
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int n, play_x = 0, play_y = 1, mp[500][500], a[500][500], play_d[4][2] = {0, -1, 0, 1, -1, 0, 1, 0}, d[4][2] = {0, -2, 2, 0, 0, 2, -2, 0};
void init(int n){
for (int i = 0; i <= n; i++){
if (i % 2 == 1){
for (int j = 0; j < n; j++){
if (j % 2 == 0 && (i != 1 || j != 0) && (i != n - 2 || j != n - 1)){
mp[i][j] = 1;
}else{
mp[i][j] = 0;
}
}
}else{
for (int j = 0; j < n; j++){
mp[i][j] = 1;
}
}
}
}
void draw(){
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == play_y && j == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[i][j]){
cout << "▇ ";
}else{
cout << " ";
}
}
cout << endl;
}
}
void draw_line(int l){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
if (l == play_y && i == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[l][i]){
cout << "▇ ";
}else{
cout << " ";
}
}
}
bool full(){
for (int i = 1; i < n; i += 2){
for (int j = 1; j < n; j += 2){
if (!a[i][j]){
return false;
}
}
}
return true;
}
bool f(int x, int y){
if (a[y][x] || x < 1 || x > n - 2 || y < 1 || y > n - 2){
return false;
}
return true;
}
void detection(int x, int y){
int optional_x[5], optional_y[5], p = 0;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (f(dx, dy)){
optional_x[p] = d[i][0];
optional_y[p] = d[i][1];
p = p + 1;
}
}
if (p != 0){
int Rand = rand() % p;
mp[y + optional_y[Rand] / 2][x + optional_x[Rand] / 2] = 0;
a[y + optional_y[Rand]][x + optional_x[Rand]] = 1;
}
}
void move(int i){
if (mp[play_y + play_d[i][1]][play_x + play_d[i][0]] == 0 && play_x + play_d[i][0] >= 0){
play_x = play_x + play_d[i][0];
play_y = play_y + play_d[i][1];
}
}
int around(int x, int y){
int s = 0;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (a[dy][dx] == 0){
s = s + 1;
}
}
return s;
}
void gotoxy(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hidden(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
srand(time(0));
cin >> n;
while (n % 2 == 0 || n <= 1){
cout << "请输入大于1的奇数!!!" << endl;
cin >> n;
}
init(n);
a[1][1] = 1;
while (!full()){
int rand_x = rand() % (n / 2) * 2 + 1, rand_y = rand() % (n / 2) * 2 + 1;
while (!a[rand_y][rand_x] && around(rand_x, rand_y) != 0){
rand_x = rand() % (n / 2) * 2 + 1;
rand_y = rand() % (n / 2) * 2 + 1;
}
detection(rand_x, rand_y);
}
draw();
char c;
while (true){
hidden();
c = _getch();
if (c == 'w'){
move(0);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y + 1);
draw_line(play_y + 1);
}
if (c == 's'){
move(1);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y - 1);
draw_line(play_y - 1);
}
if (c == 'a'){
move(2);
gotoxy(0, play_y);
draw_line(play_y);
}
if (c == 'd'){
move(3);
gotoxy(0, play_y);
draw_line(play_y);
}
if (play_x == n - 1 && play_y == n - 2){
gotoxy(0, n);
cout << "You win!";
break;
}
}
return 0;
}
二代↓
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
struct node{
int x, y;
};
int n, node_n = 0, play_x = 0, play_y = 1, mp[500][500], play_d[4][2] = {0, -1, 0, 1, -1, 0, 1, 0}, d[4][2] = {0, -2, 2, 0, 0, 2, -2, 0};
node a[250000];
void init(int n){
for (int i = 0; i <= n; i++){
if (i % 2 == 1){
for (int j = 0; j < n; j++){
if (j % 2 == 0){
mp[i][j] = 1;
}else{
mp[i][j] = 0;
}
}
}else{
for (int j = 0; j < n; j++){
mp[i][j] = 1;
}
}
}
}
void draw(){
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == play_y && j == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[i][j]){
cout << "▇ ";
}else{
cout << " ";
}
}
cout << endl;
}
}
void draw_line(int l){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
if (l == play_y && i == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[l][i]){
cout << "▇ ";
}else{
cout << " ";
}
}
}
void add(int x, int y){
a[node_n].x = x;
a[node_n].y = y;
node_n = node_n + 1;
}
bool in(int x, int y){
for (int i = 0; i < node_n; i++){
if (a[i].x == x && a[i].y == y){
return true;
}
}
return false;
}
bool full(){
if (node_n == (n / 2) * (n / 2)){
return true;
}
return false;
}
bool f(int x, int y){
if (x < 1 || x > n - 2 || y < 1 || y > n - 2){
return false;
}
return true;
}
void detection(int x, int y){
int optional_x[5], optional_y[5], p = 0;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (f(dx, dy) && !in(dx, dy)){
optional_x[p] = d[i][0];
optional_y[p] = d[i][1];
p = p + 1;
}
}
if (p != 0){
int Rand = rand() % p;
mp[y + optional_y[Rand] / 2][x + optional_x[Rand] / 2] = 0;
add(x + optional_x[Rand], y + optional_y[Rand]);
}
}
int around(int x, int y){
int s = 4;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (in(dx, dy)){
s = s - 1;
}
}
return s;
}
void move(int i){
if (mp[play_y + play_d[i][1]][play_x + play_d[i][0]] == 0 && play_x + play_d[i][0] >= 0){
play_x = play_x + play_d[i][0];
play_y = play_y + play_d[i][1];
}
}
void gotoxy(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hidden(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
srand(time(0));
cin >> n;
while (n % 2 == 0 || n <= 1){
cout << "请输入大于1的奇数!!!" << endl;
cin >> n;
}
init(n);
add(1, 1);
while (!full()){
int Rand = rand() % node_n;
while (around(a[Rand].x, a[Rand].y) == 0){
Rand = rand() % node_n;
}
detection(a[Rand].x, a[Rand].y);
}
mp[1][0] = 0;
mp[n - 2][n - 1] = 0;
draw();
char c;
while (true){
hidden();
c = _getch();
if (c == 'w'){
move(0);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y + 1);
draw_line(play_y + 1);
}
if (c == 's'){
move(1);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y - 1);
draw_line(play_y - 1);
}
if (c == 'a'){
move(2);
gotoxy(0, play_y);
draw_line(play_y);
}
if (c == 'd'){
move(3);
gotoxy(0, play_y);
draw_line(play_y);
}
if (play_x == n - 1 && play_y == n - 2){
gotoxy(0, n);
cout << "You win!";
break;
}
}
return 0;
}
增加了不知道什么寻路↓
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
struct node{
int x, y;
};
struct path{
node d1;
node d2;
};
int n, node_n = 0, play_x = 0, play_y = 1, mp[500][500], play_d[4][2] = {0, -1, 0, 1, -1, 0, 1, 0}, d[4][2] = {0, -2, 2, 0, 0, 2, -2, 0}, bfs_d[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};
queue <node> q;
path p[250000];
node a[250000];
void init(int n){
for (int i = 0; i <= n; i++){
if (i % 2 == 1){
for (int j = 0; j < n; j++){
if (j % 2 == 0){
mp[i][j] = 1;
}else{
mp[i][j] = 0;
}
}
}else{
for (int j = 0; j < n; j++){
mp[i][j] = 1;
}
}
}
}
void draw(){
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == play_y && j == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[i][j] == 1){
cout << "▇ ";
}else if (mp[i][j] == 2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else{
cout << " ";
}
}
cout << endl;
}
}
void draw_line(int l){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
for (int i = 0; i < n; i++){
if (l == play_y && i == play_x){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else if (mp[l][i] == 1){
cout << "▇ ";
}else if (mp[l][i] == 2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
cout << "▇ ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
}else{
cout << " ";
}
}
}
void add(int x, int y){
a[node_n].x = x;
a[node_n].y = y;
node_n = node_n + 1;
}
bool in(int x, int y){
for (int i = 0; i < node_n; i++){
if (a[i].x == x && a[i].y == y){
return true;
}
}
return false;
}
bool full(){
if (node_n == (n / 2) * (n / 2)){
return true;
}
return false;
}
bool f(int x, int y){
if (x < 1 || x > n - 2 || y < 1 || y > n - 2){
return false;
}
return true;
}
void detection(int x, int y){
int optional_x[5], optional_y[5], p = 0;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (f(dx, dy) && !in(dx, dy)){
optional_x[p] = d[i][0];
optional_y[p] = d[i][1];
p = p + 1;
}
}
if (p != 0){
int Rand = rand() % p;
mp[y + optional_y[Rand] / 2][x + optional_x[Rand] / 2] = 0;
add(x + optional_x[Rand], y + optional_y[Rand]);
}
}
int around(int x, int y){
int s = 4;
for (int i = 0; i < 4; i++){
int dx = x + d[i][0], dy = y + d[i][1];
if (in(dx, dy)){
s = s - 1;
}
}
return s;
}
void move(int i){
if (mp[play_y + play_d[i][1]][play_x + play_d[i][0]] != 1 && play_x + play_d[i][0] >= 0){
play_x = play_x + play_d[i][0];
play_y = play_y + play_d[i][1];
}
}
int find(int x, int y){
for (int i = 0; i < 25000; i++){
if (p[i].d1.x == x && p[i].d1.y == y){
return i;
}
}
return -1;
}
bool in_p(int x, int y, int index){
for (int i = 0; i < index; i++){
if (p[i].d1.x == x && p[i].d1.y == y){
return true;
}
}
return false;
}
void bfs(int x, int y, int x2, int y2){
int index = 0;
while (!q.empty()){
int xx = q.front().x, yy = q.front().y;
q.pop();
for (int i = 0; i < 4; i++){
int dx = xx + bfs_d[i][0], dy = yy + bfs_d[i][1];
if (dx >= 0 && dy >= 0 && dx < n && dy < n && mp[dy][dx] == 0 && !in_p(dx, dy, index)){
p[index] = {{dx, dy}, {xx, yy}};
q.push({dx, dy});
index = index + 1;
}
}
for (int i = 0; i < index; i++){
if (p[i].d1.x == x2 && p[i].d1.y == y2){
return ;
}
}
}
}
void search(){
mp[1][1] = 2;
q.push({1, 1});
bfs(1, 1, n - 2, n - 2);
int x = n - 2, y = n - 2;
while (true){
if (x == 1 && y == 1){
break;
}
mp[y][x] = 2;
node t = p[find(x, y)].d2;
x = t.x, y = t.y;
}
}
void gotoxy(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hidden(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
srand(time(0));
cin >> n;
while (n % 2 == 0 || n <= 1){
cout << "请输入大于1的奇数!!!" << endl;
cin >> n;
}
init(n);
add(1, 1);
while (!full()){
int Rand = rand() % node_n;
while (around(a[Rand].x, a[Rand].y) == 0){
Rand = rand() % node_n;
}
detection(a[Rand].x, a[Rand].y);
}
search();
mp[1][0] = 0;
mp[n - 2][n - 1] = 0;
draw();
char c;
while (true){
hidden();
c = _getch();
if (c == 'w'){
move(0);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y + 1);
draw_line(play_y + 1);
}
if (c == 's'){
move(1);
gotoxy(0, play_y);
draw_line(play_y);
gotoxy(0, play_y - 1);
draw_line(play_y - 1);
}
if (c == 'a'){
move(2);
gotoxy(0, play_y);
draw_line(play_y);
}
if (c == 'd'){
move(3);
gotoxy(0, play_y);
draw_line(play_y);
}
if (play_x == n - 1 && play_y == n - 2){
gotoxy(0, n);
cout << "You win!";
break;
}
}
return 0;
}
全部评论 3
牛逼
2024-08-20 来自 浙江
0不懂就问 为什么作者代码内输出这么流畅
2024-08-16 来自 浙江
0太有实力了
2024-08-08 来自 浙江
0
有帮助,赞一个