- //走迷宮 普通走法
- #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,j,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,y=1; //玩家當前位置,剛開始在入口處
- int c; //用來接收按鍵
- while(1)
- {
- gotoxy(2*y-2,x-1);
- printf("●"); //畫出玩家當前位置 這里畫出光標的位置也就是個圈圈
- if(map[x][y]==End) //判斷是否到達出口
- {
- gotoxy(30,24);
- 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,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;
- }
復制代碼
|