⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze20080330_01.cpp

📁 迷宫.控制台应用程序.适合出学c语言又想提高c语言的朋友
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    	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 + -