#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define Height 25 //迷宮的高度,必須為奇數
#define Width 25 //迷宮的寬度,必須為奇數
#define Wall 1
#define Road 0
#define Start 2
#define End 3
#define Esc 5
#define Up 1
#define Down 2
#define Left 3
#define Right 4
int map[Height + 2][Width + 2];
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;//賦1為顯示,賦0為隱藏
SetConsoleCursorInfo(hOut, &cci);
}
void create(int x, int y) //隨機生成迷宮
{
int c[4][2] = {
0, 1, 1,0,
0,-1,-1,0
}; //四個方向
int i;
int j;
int t; //將方向打亂
for (i = 0; i < 4; i++)
{
j = rand() % 4;
t = c[i][0];
c[i][0] = c[j][0];
c[j][0] = t;
t = c[i][1];
c[i][1] = c[j][1];
c[j][1] = t;
}
map[x][y] = Road;
for (i = 0; i < 4; i++)
if (map[x + 2 * c[i][0]][y + 2 * c[i][1]] == Wall)
{
map[x + c[i][0]][y + c[i][1]] = Road;
create(x + 2 * c[i][0], y + 2 * c[i][1]);
}
}
int get_key() //接收按鍵
{
char c;
while (c = getch())
{
if (c == 27)
return Esc; //Esc
if (c != -32)
continue;
c = getch();
if (c == 72)
return Up; //上
if (c == 80)
return Down; //下
if (c == 75)
return Left; //左
if (c == 77)
return Right; //右
}
return 0;
}
void paint(int x, int y) //畫迷宮
{
gotoxy(2 * y - 2, x - 1);
switch (map[x][y])
{
case Start:
printf("入");
break; //畫入口
case End:
printf("出");
break; //畫出口
case Wall:
printf("墻");
break; //畫墻
case Road:
printf(" ");
break; //畫路
}
}
void game()
{
int x = 2;
int y = 1; //玩家當前位置,剛開始在入口處
int c; //用來接收按鍵
while (1)
{
gotoxy(2 * y - 2, x - 1);
printf("O"); //畫出玩家當前位置
if (map[x][y] == End) //判斷是否到達出口
{
gotoxy(30, 24);
printf("恭喜您以到達終點\n");
printf("按任意鍵結束…");
getch();
break;
}
c = get_key();
if (c == Esc)
{
gotoxy(0, 24);
break;
}
switch (c)
{
case
Up: //向上走
if (map[x - 1][y] != Wall)
{
paint(x, y);
x--;
}
break;
case
Down: //向下走
if (map[x + 1][y] != Wall)
{
paint(x, y);
x++;
}
break;
case
Left: //向左走
if (map[x][y - 1] != Wall)
{
paint(x, y);
y--;
}
break;
case
Right: //向右走
if (map[x][y + 1] != Wall)
{
paint(x, y);
y++;
}
break;
}
}
}
int main()
{
system("title yourname");
int i;
int j;
srand((unsigned)time(NULL)); //初始化隨即種子
hidden(); //隱藏游標
for (i = 0; i <= Height + 1; i++)
{
for (j = 0; j <= Width + 1; j++)
{
if (i == 0 || i == Height + 1 || j == 0 || j == Width + 1) //初始化迷宮
map[i][j] = Road;
else
map[i][j] = Wall;
}
}
create(2 * (rand() % (Height / 2) + 1), 2 * (rand() % (Width / 2) + 1)); //從隨機一個點開始生成迷宮,該點行列都為偶數
for (i = 0; i <= Height + 1; i++) //邊界處理
{
map[i][0] = Wall;
map[i][Width + 1] = Wall;
}
for (j = 0; j <= Width + 1; j++) //邊界處理
{
map[0][j] = Wall;
map[Height + 1][j] = Wall;
}
map[2][1] = Start; //給定入口
map[Height - 1][Width] = End; //給定出口
for (i = 1; i <= Height; i++)
{
for (j = 1; j <= Width; j++) //畫出迷宮
{
paint(i, j);
}
}
game(); //開始游戲
getch();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242108.html
標籤:C++ 語言
上一篇:列舉型別前向宣告不標準是什么鬼
下一篇:請問如何讓正則完整匹配a
