📄 maze20080330_01.cpp
字号:
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR )
{//该点的左右没有被别人挖过,挖了该点
p->cMazeMap[pPos->iRow][pPos->iCol] = cOptimizeMazePathFlag;//插入被挖过的标记
return true;
}
else
{
pPos->iRow--;
return false;
}
}
return false;
}
bool Digging(SMazeMap *p,SPos *pPos,char cMazePathFlag, int iDir )
{
if( iDir == DIR_LEFT )
{//如果方向向左,检查上,下和左是否都没有被挖过
pPos->iCol--;
if( pPos->iCol < 1 )
{//遇到墙壁不能挖
pPos->iCol++;
return false;
}
else if( ( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR ) )
{//周围都没有被挖过,挖
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;//插入被挖过的标记
return true;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == cMazePathFlag )
{//该点前一点 已经被自己挖过,回去
pPos->iCol--;
return false;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == cMazePathFlag )
{//...右...
pPos->iRow--;
return false;
}
else if( p->cMazeMap[pPos->iRow+1][pPos->iCol] == cMazePathFlag )
{//...左...
pPos->iRow++;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != cMazePathFlag )
{//该点的右一点已经被别人挖过,挖了该点并跳到右一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow--;
return false;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != cMazePathFlag )
{//该点的前一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol--;
return false;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != cMazePathFlag )
{//该点的左(下)一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow++;
return false;
}
else
{
pPos->iCol++;
return false;
}
}
if( iDir == DIR_RIGHT )
{
pPos->iCol++;
if( pPos->iCol > MAZE_COL )
{//遇到墙壁不能挖
pPos->iCol--;
return false;
}
else if( ( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR ) )
{
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;//插入被挖过的标记
return true;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol+1] == cMazePathFlag )
{//该点前一点 已经被自己挖过,回去
pPos->iCol++;
return false;
}
else if( p->cMazeMap[pPos->iRow+1][pPos->iCol] == cMazePathFlag )
{//...右...
pPos->iRow++;
return false;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == cMazePathFlag )
{//...左...
pPos->iRow--;
return false;
} else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != cMazePathFlag )
{//该点的右(下)一点已经被别人挖过,挖了该点并跳到上一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow++;
return false;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != cMazePathFlag )
{//该点的前一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol++;
return false;
}
else if( p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != cMazePathFlag )
{//该点的左(上)一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow--;
return false;
}
else
{
pPos->iCol--;
return false;
}
}
if( iDir == DIR_UP )
{
pPos->iRow--;
if( pPos->iRow < 1 || pPos->iCol < 1 || pPos->iCol > MAZE_COL )
{//遇到墙壁不能挖
pPos->iRow++;
return false;
}
else if( ( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR ) )
{
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;//插入被挖过的标记
return true;
}
else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == cMazePathFlag )
{//该点前一点 已经被自己挖过,回去
pPos->iRow--;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol+1] == cMazePathFlag )
{//...右...
pPos->iCol++;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == cMazePathFlag )
{//...左...
pPos->iCol--;
return false;
} else if( p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != cMazePathFlag )
{//该点的右一点已经被别人挖过,挖了该点并跳到上一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol++;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] != cMazePathFlag )
{//该点的前一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow--;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow-1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != cMazePathFlag )
{//该点的左一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol--;
return false;
}
else
{
pPos->iRow++;
return false;
}
}
if( iDir == DIR_DOWN )
{
pPos->iRow++;
if( pPos->iRow > MAZE_ROW || pPos->iCol < 1 || pPos->iCol > MAZE_COL )
{//遇到墙壁不能挖
pPos->iRow--;
return false;
}
else if( ( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR )\
&&( p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR ) )
{
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;//插入被挖过的标记
return true;
}
else if( p->cMazeMap[pPos->iRow+1][pPos->iCol] == cMazePathFlag )
{//该点前一点 已经被自己挖过,回去
pPos->iRow++;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == cMazePathFlag )
{//...右...
pPos->iCol--;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol+1] == cMazePathFlag )
{//...左...
pPos->iCol++;
return false;
} else if( p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol-1] != cMazePathFlag )
{//该点的右一点已经被别人挖过,挖了该点并跳到上一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol--;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] != cMazePathFlag )
{//该点的前一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iRow++;
return false;
}
else if( p->cMazeMap[pPos->iRow][pPos->iCol-1] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow+1][pPos->iCol] == MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != MAZE_BAR \
&& p->cMazeMap[pPos->iRow][pPos->iCol+1] != cMazePathFlag )
{//该点的左一点已经被别人挖过,挖了该点并跳到前一点,此时会合
p->cMazeMap[pPos->iRow][pPos->iCol] = cMazePathFlag;
pPos->iCol++;
return false;
}
else
{
pPos->iRow--;
return false;
}
}
return false;
}
SPos *Dig(SMazeMap *p,SPos *pPos,char cMazePathFlag, int iDir , int iRandomLength )
{
if( iRandomLength <= 0 )
{
return pPos;
}
else if( Digging( p, pPos, cMazePathFlag, iDir ) )
{
return Dig( p, pPos, cMazePathFlag, iDir , --iRandomLength );
}
return pPos;
}
SPos *OptimizeDig(SMazeMap *p,SPos *pPos,char cMazePathFlag, int iDir , int iRandomLength )
{
if( iRandomLength <= 0 )
{
return pPos;
}
else if( OptimizeDigging( p, pPos, cMazePathFlag, iDir ) )
{
return OptimizeDig( p, pPos, cMazePathFlag, iDir , --iRandomLength );
}
return pPos;
}
SPos * DigPath(SMazeMap *p,SPos *pPos,char cMazePathFlag )
{
int iRandomLength; //随即长度
int iRandomDir; //随即方向
iRandomLength = rand()%2;
iRandomDir = rand()%4;
return Dig( p, pPos, cMazePathFlag, iRandomDir, iRandomLength );
}
SPos *OptimizeDigPath(SMazeMap *p,SPos *pPos,char cOptimizeMazePathFlag )
{
int iRandomLength; //随即长度
int iRandomDir; //随即方向
iRandomLength = rand()%2;
iRandomDir = rand()%4;
return OptimizeDig( p, pPos, cOptimizeMazePathFlag, iRandomDir, iRandomLength );
}
void MazeFullInit( SMazeMap *p )
{
for(int i=0; i<=MAZE_ROW+1; i++ )
{
for( int j=0; j<=MAZE_COL+1; j++ )
{
p->cMazeMap[i][j] = MAZE_BAR;
}
}
}
void MazeHelp(SMazeMap *p)
{
int iRow = MAZE_ROW+1;
int iCol = MAZE_COL+1;
int i;
int j;
char chKey;
for( i=0; i<= iRow; i++ )
{
for( j=0; j<= iCol; j++ )
{/**/
if( p->cMazeMap[i][j] == MAZE_BAR )
{
cout<<MAZE_BAR;
}
else if( p->cMazeMap[i][j] == MAZE_PER )
{
cout<<MAZE_PER;
}
else if( p->cMazeMap[i][j] == MAZE_EXIT )
{
cout<<MAZE_EXIT;
}
else
{
cout<<' ';
}
// cout<<p->cMazeMap[i][j];
}
cout<<endl;
}
do
{
while( !_kbhit() );
chKey = _getch();
}while( chKey == 'h' || chKey == 'H' );
ClearHelpMap();
}
void MazeShow(SMazeMap *p)
{
ClearShowMap();
for(int k=0; k< SHOW_COL+2; k++)
{
cout<<SHOW_BAR;
}
cout<<endl;
for(int i=0; i< SHOW_ROW; i++ )
{
cout<<SHOW_BAR;
for(int j=0; j< SHOW_COL; j++ )
{
if( p->cShowMazeMap[i][j] == MAZE_BAR )
{
cout<<MAZE_BAR;
}
else if( p->cShowMazeMap[i][j] == MAZE_PER )
{
cout<<MAZE_PER;
}
else if( p->cShowMazeMap[i][j] == MAZE_EXIT )
{
cout<<MAZE_EXIT;
}
else if( bMazePathHelp )
{
if( p->cShowMazeMap[i][j] == MAZE_PASS_PATH )
{
cout<<MAZE_HELP_PATH;
}
else if( p->cShowMazeMap[i][j] == MAZE_DEAD_PATH )
{
cout<<MAZE_DEAD_PATH;
}
else
{
cout<<MAZE_PATH;
}
}
else
{
cout<<MAZE_PATH;
}
}
cout<<SHOW_BAR;
cout<<endl;
}
for( k=0; k< SHOW_COL+2; k++)
{
cout<<SHOW_BAR;
}
cout<<"\n\t李元的迷宫设计"<<endl;
cout<<"\n\tQQ:56059943"<<endl;
/*
HANDLE hCursor;
COORD coord={100,200};
SetConsoleTitle("迷宫");
char cArray[100] = "李元的迷宫设计";
WriteConsoleOutputCharacter( hCursor,cArray,100,coord,0);
// COORD coord={p->spShowCurrent.iCol+1,p->spShowCurrent.iRow+1};
SetConsoleCursorPosition( hCursor, coord );
CloseHandle(hCursor); */
}
int ClearHelpMap()
{
//system("cls");
/**/
HANDLE hndl=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi ;
GetConsoleScreenBufferInfo(hndl,&csbi);
DWORD written ;
DWORD N=csbi.dwSize.X*csbi.dwCursorPosition.Y+
csbi.dwCursorPosition.X+1 ;
COORD curhome=
{
0,0
}
;
FillConsoleOutputCharacter(hndl,' ',N,curhome,&written);
csbi.srWindow.Bottom-=csbi.srWindow.Top ;
csbi.srWindow.Top=0 ;
SetConsoleWindowInfo(hndl,TRUE,&csbi.srWindow);
SetConsoleCursorPosition(hndl,curhome);
return 0 ;
}
int ClearShowMap()
{
//system("cls");
/**/
HANDLE hndl=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi ;
GetConsoleScreenBufferInfo(hndl,&csbi);
DWORD written ;
DWORD N=csbi.dwSize.X*csbi.dwCursorPosition.Y+
csbi.dwCursorPosition.X+1 ;
COORD curhome=
{
0,0
}
;
for( int i=0; i< SHOW_ROW +2; i++ )
{
for( int j=0; j< SHOW_COL+2; j ++ );
FillConsoleOutputCharacter(hndl,' ',1,curhome,&written);
}
csbi.srWindow.Bottom-=csbi.srWindow.Top ;
csbi.srWindow.Top=0 ;
SetConsoleWindowInfo(hndl,TRUE,&csbi.srWindow);
SetConsoleCursorPosition(hndl,curhome);
return 0 ;
}
/**/
int clrscr()
{
//system("cls");
HANDLE hndl=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi ;
GetConsoleScreenBufferInfo(hndl,&csbi);
DWORD written ;
DWORD N=csbi.dwSize.X*csbi.dwCursorPosition.Y+
csbi.dwCursorPosition.X+1 ;
COORD curhome=
{
0,0
}
;
FillConsoleOutputCharacter(hndl,' ',N,curhome,&written);
csbi.srWindow.Bottom-=csbi.srWindow.Top ;
csbi.srWindow.Top=0 ;
SetConsoleWindowInfo(hndl,TRUE,&csbi.srWindow);
SetConsoleCursorPosition(hndl,curhome);
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -