#include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> #include <conio.h> #define UP 1 #define LEFT 2 #define DOWN 3 #define RIGHT 4 #define UpD 72 #define LeftD 75 #define DownD 80 #define RightD 77 #define ENTRY 10 #define OUTW 11 #define PLAYER 12 #define H 22 #define W 40 void MakeLine(char (*Map)[W]); void GetDir(char (*Map)[W],char x,char y,char Dir); bool JudB(char (*JudMap)[W],char x,char y,char Dir); void MakeB(char (*BrMap)[W],char x,char y); void Gleft(char (*LineMap)[W],char *x,char *y); void Gright(char (*LineMap)[W],char *x,char *y); void Grup(char (*LineMap)[W],char *x,char *y); void Gdown(char (*LineMap)[W],char *x,char *y); void GetOutW(char (*Map)[W]); void DraMap(char (*Map)[W]); int RondomN(int RandMax); void PrintMap(char x); void ControlMove(char (*Conmap)[W]); void PrintMap(char (*Map)[W],char i,char j); void Print33(char (*Map)[W],char x,char y); char PlayerNext(char (*Map)[W],char LastIs,char x,char y); char DownMove(char (*Map)[W],char *x,char *y,char Last); char RightMove(char (*Map)[W],char *x,char *y,char Last); char UpMove(char (*Map)[W],char *x,char *y,char Last); char LeftMove(char (*Map)[W],char *x,char *y,char Last); void gotoxy(int x, int y); void Welcome(); void Win(); int main(void) { srand(time(0)); char map[H][W]={0},x,y; for(x=0,y=0;y<W;y++) //intialize the map... map[x][y]=1; for(x=H,y=0;y<W;y++) map[x][y]=1; for(y=0,x=0;x<H;x++) map[x][y]=1; for(y=W,x=0;x<H;x++) map[x][y]=1; Welcome(); system("CLS"); MakeLine(map); //get the rondom maze... DraMap(map); //drawning ControlMove(map); //control to move... return 0; } void Welcome() { printf("/n/n/n/n/t/t welcome to xiao_D maze,/n/t/t press up down right left to move,/n/t/t you have 3 seconds to look the map./n/t/t /if you need help,press enter,/n/t/t when you found the out way ,/n/t/t you were win./n/t/t now press any key to /continue.../n"); getch(); } char UpMove(char (*Map)[W],char *x,char *y,char Last) //up { char j; Map[*x][*y]=Last; PrintMap(Map,*x,*y); *x=(*x)-1; Last=Map[*x][*y]; Map[*x][*y]=PLAYER; PrintMap(Map,*x,*y); for(j=(*y)-1;j<=(*y)+1;j++) { gotoxy(j*2,(*x)+3-1); if((*x)-1==0) printf(" "); else PrintMap(Map,(*x)-1,j); gotoxy(j*2,(*x)+3+1); if((*x)+1==W-1) printf(" "); else PrintMap(Map,(*x)+1,j); gotoxy(j*2,(*x)+3+2); printf(" "); } return Last; } char RightMove(char (*Map)[W],char *x,char *y,char Last)//right { char j; Map[*x][*y]=Last; PrintMap(Map,*x,*y); *y=(*y)+1; Last=Map[*x][*y]; Map[*x][*y]=PLAYER; PrintMap(Map,*x,*y); for(j=(*x)-1;j<=(*x)+1;j++) { gotoxy(((*y)-1)*2,j+3); if((*y)-1==0) printf(" "); else PrintMap(Map,j,(*y)-1); gotoxy(((*y)+1)*2,j+3); if((*y)+1==W-1) printf(" "); else PrintMap(Map,j,(*y)+1); gotoxy(((*y)-2)*2,j+3); printf(" "); } return Last; } char LeftMove(char (*Map)[W],char *x,char *y,char Last)//left { char j; Map[*x][*y]=Last; PrintMap(Map,*x,*y); *y=(*y)-1; Last=Map[*x][*y]; Map[*x][*y]=PLAYER; PrintMap(Map,*x,*y); for(j=(*x)-1;j<=(*x)+1;j++) { gotoxy(((*y)-1)*2,j+3); if((*y)-1==0) printf(" "); else PrintMap(Map,j,(*y)-1); gotoxy(((*y)+1)*2,j+3); if((*y)+1==W-1) printf(" "); else PrintMap(Map,j,(*y)+1); gotoxy(((*y)+2)*2,j+3); printf(" "); } return Last; } char DownMove(char (*Map)[W],char *x,char *y,char Last)//down { char j; Map[*x][*y]=Last; PrintMap(Map,*x,*y); *x=(*x)+1; Last=Map[*x][*y]; Map[*x][*y]=PLAYER; PrintMap(Map,*x,*y); for(j=(*y)-1;j<=(*y)+1;j++) { gotoxy(j*2,(*x)+3-1); if((*x)-1==0) printf(" "); else PrintMap(Map,(*x)-1,j); gotoxy(j*2,(*x)+3+1); if((*x)+1==H-1) printf(" "); else PrintMap(Map,(*x)+1,j); gotoxy(j*2,(*x)+3-2); printf(" "); } return Last; } void ControlMove(char (*Conmap)[W]) //control player to move... { int key=0; char i,j,x,y,a,b,Last; for(i=1;i<H-1;i++) //found the entry.. { for(j=1;j<W-1;j++) { if(Conmap[i][j]==ENTRY) { x=i; y=j; break; } } } // for(i=1;i<H-1;i++) //found the way out.. { for(j=1;j<W-1;j++) { if(Conmap[i][j]==OUTW) { a=i; b=j; break; } } } // gotoxy(17,2); printf("now you have 3 seconds...");//help... Sleep(3000); system("CLS"); Last=PlayerNext(Conmap,ENTRY,x,y); gotoxy(17,1); printf("/if you need help,press enter key,"); gotoxy(17,2); printf("/if you want to exit,press Esc..."); Print33(Conmap,x,y); while(1) { key=getch(); switch(key){ case UpD: if(Conmap[x-1][y]!=0&&x-1!=0) Last=UpMove(Conmap,&x,&y,Last); if(Conmap[a][b]!=OUTW) { DraMap(Conmap); Win(); exit(0); } break; case DownD: if(Conmap[x+1][y]!=0&&x+1!=H) Last=DownMove(Conmap,&x,&y,Last); if(Conmap[a][b]!=OUTW) { DraMap(Conmap); Win(); Sleep(2000); exit(0); } break; case RightD: if(Conmap[x][y+1]!=0&&y+1!=W) Last=RightMove(Conmap,&x,&y,Last); if(Conmap[a][b]!=OUTW) { DraMap(Conmap); Win(); Sleep(2000); exit(0); } break; case LeftD: if(Conmap[x][y-1]!=0&&y-1!=0) Last=LeftMove(Conmap,&x,&y,Last); if(Conmap[a][b]!=OUTW) { DraMap(Conmap); Win(); Sleep(2000); exit(0); } break; case '/r': DraMap(Conmap); Sleep(1000); system("CLS"); gotoxy(17,1); //help... printf("/if you need help,press enter key,"); gotoxy(17,2); printf("/if you want to exit,press Esc..."); Print33(Conmap,x,y); break; case 27: system("CLS"); gotoxy(12,8); printf("thank you for your playing..."); Sleep(2000); exit(0); } } } void Win() //win... { gotoxy(18,12); printf("you are winer! thank you for your playing..."); } void gotoxy(int x, int y)//move cursor... { COORD coord = {x, y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } char PlayerNext(char (*Map)[W],char LastIs,char x,char y) { LastIs=Map[x][y]; Map[x][y]=PLAYER; return LastIs; } void Print33(char (*Map)[W],char x,char y)//print a 3*3 palce.. { char i,j; for(i=x-1;i<=x+1;i++) { for(j=y-1;j<=y+1;j++) { if(i!=0&&j!=0&&i!=H-1&&j!=W-1) PrintMap(Map,i,j); } } } void DraMap(char (*Map)[W]) //drawn maze map... { char i,j; for(i=1;i<H-1;i++) { for(j=1;j<W-1;j++) { PrintMap(Map,i,j); } printf("/n"); } } void PrintMap(char (*Map)[W],char i,char j) //print the map...□ { gotoxy(j*2,i+3); if(Map[i][j]==1) printf(" "); else if(Map[i][j]==ENTRY) printf("进"); else if(Map[i][j]==OUTW) printf("出"); else if(Map[i][j]==0) printf("█"); else if(Map[i][j]==PLAYER) printf("人"); } int RondomN(int RandMax) //get random number. { return rand()%RandMax+1; } void Gup(char (*LineMap)[W],char *x,char *y)//left move. { if((*x)-2!=0 &&LineMap[(*x)-2][*y]==0 &&LineMap[(*x)-1][(*y)+1]==0 &&LineMap[(*x)-1][(*y)-1]==0 &&LineMap[(*x)-2][(*y)+1]==0 &&LineMap[(*x)-2][(*y)-1]==0 &&LineMap[(*x)-1][*y]==0) { LineMap[(*x)-1][*y]=1; *x=(*x)-1; MakeB(LineMap,*x,*y); } else return ; } void Gdown(char (*LineMap)[W],char *x,char *y) //right move. { if((*x)+2!=H-1 &&LineMap[(*x)+2][*y]==0 &&LineMap[(*x)+1][(*y)+1]==0 &&LineMap[(*x)+1][(*y)-1]==0 &&LineMap[(*x)+2][(*y)-1]==0 &&LineMap[(*x)+2][(*y)+1]==0 &&LineMap[(*x)+1][*y]==0) { LineMap[(*x)+1][*y]=1; *x=(*x)+1; MakeB(LineMap,*x,*y); } else return; } void Gleft(char (*LineMap)[W],char *x,char *y) //up move. { if((*y)-2!=0 &&LineMap[*x][(*y)-2]==0 //judge the element around the next element's number. &&LineMap[(*x)+1][(*y)-1]==0 &&LineMap[(*x)-1][(*y)-1]==0 &&LineMap[(*x)-1][(*y)-2]==0 &&LineMap[(*x)+1][(*y)-2]==0 &&LineMap[*x][(*y)-1]==0) { LineMap[*x][(*y)-1]=1; *y=(*y)-1; MakeB(LineMap,*x,*y); } else return; } void Gright(char (*LineMap)[W],char *x,char *y)//down move/ { if((*y)+2!=W-1 &&LineMap[*x][(*y)+2]==0 &&LineMap[(*x)+1][(*y)+1]==0 &&LineMap[(*x)-1][(*y)+1]==0 &&LineMap[(*x)-1][(*y)+2]==0 &&LineMap[(*x)+1][(*y)+2]==0 &&LineMap[*x][(*y)+1]==0) { LineMap[*x][(*y)+1]=1; *y=(*y)+1; MakeB(LineMap,*x,*y); } else return; } void GetDir(char (*Map)[W],char x,char y,char Dir) { char LastDir; char i=1; while(i++&&i<20)//get rondom direction. { if(i>3&&(x==1||x==H-2||y==1||y==W-2)) break; Dir=RondomN(4); if((Dir!=LastDir+2)&&(Dir!=LastDir-2)) { switch(Dir){ case UP: Gup(Map,&x,&y); LastDir=Dir; continue; case DOWN: Gdown(Map,&x,&y); LastDir=Dir; continue; case LEFT: Gleft(Map,&x,&y); LastDir=Dir; continue; case RIGHT: Gright(Map,&x,&y); LastDir=Dir; continue; } } } //end. } void MakeLine(char (*Map)[W]) //get a maze route. { char Dir,x,y,i,j; Dir=RondomN(4);//entrance . x=RondomN(H-4)+1; y=RondomN(W-4)+1; switch(Dir){ case LEFT: y=1; Map[x][y]=ENTRY; Gright(Map,&x,&y); break; case DOWN: x=H-2; Map[x][y]=ENTRY; Gup(Map,&x,&y); break; case UP: x=1; Map[x][y]=ENTRY; Gdown(Map,&x,&y); break; case RIGHT: y=W-2; Map[x][y]=ENTRY; Gleft(Map,&x,&y); break; } for(i=1;i<H-2;i++) //make more branches.. for(j=1;j<W-2;j++) MakeB(Map,i,j); GetOutW(Map); //get out way.... } void MakeB(char (*BrMap)[W],char x,char y) //make branches,... { char Dir=RondomN(4); if(x!=1&&x!=H-2&&y!=1&&y!=W-2&&JudB(BrMap,x,y,Dir)) GetDir(BrMap,x,y,Dir); } bool JudB(char (*JudMap)[W],char x,char y,char Dir)//judge make or not、 { switch(Dir){ case UP: if(JudMap[x][y-1]==0&&(JudMap[x][y]==1||JudMap[x][y]==ENTRY)) return true; case DOWN: if(JudMap[x][y+1]==0&&(JudMap[x][y]==1||JudMap[x][y]==ENTRY)) return true; case LEFT: if(JudMap[x-1][y]==0&&(JudMap[x][y]==1||JudMap[x][y]==ENTRY)) return true; case RIGHT: if(JudMap[x+1][y]==0&&(JudMap[x][y]==1||JudMap[x][y]==ENTRY)) return true; } return false; } void GetOutW(char (*Map)[W])//get a way out... { char i=RondomN(H-4)+1,j=RondomN(W-4)+1; if(Map[2][j]==1&&Map[1][j]!=ENTRY) { Map[1][j]=OUTW; return; } if(Map[H-3][j]==1&&Map[H-2][j]!=ENTRY) { Map[H-2][j]=OUTW; return; } if(Map[i][2]==1&&Map[i][1]!=ENTRY) { Map[i][1]=OUTW; return; } if(Map[i][W-3]==1&&Map[i][W-2]!=ENTRY) { Map[i][W-2]=OUTW; return; } GetOutW(Map); } 这个完全属于菜鸟无聊,貌似没什么技术含量额,,,求建议。