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

📄 cchessmove.h

📁 中国象棋人机对弈
💻 H
📖 第 1 页 / 共 2 页
字号:
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//向后
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.y = ptFrom.y - 1; ptTo.y >= 0; ptTo.y -- )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//横向
					ptTo.y = ptFrom.y ;

					//向左
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.x = ptFrom.x - 1; ptTo.x >= 0; ptTo.x -- )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//向右
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.x = ptFrom.x + 1; ptTo.x <= 8; ptTo.x ++ )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					break;


//==========生成黑炮的着法
				case BLACK_P:

					//ptHalf用来存储炮是否有隔子打子的中间子

					//纵向
					ptTo.x = ptFrom.x ;

					//向后
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.y = ptFrom.y + 1; ptTo.y <= 9; ptTo.y ++ )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//向前
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.y = ptFrom.y - 1; ptTo.y >= 0; ptTo.y -- )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//横向
					ptTo.y = ptFrom.y ;

					//向右
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.x = ptFrom.x - 1; ptTo.x >= 0; ptTo.x -- )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					//向左
					ptHalf.x = -1;	//标志尚未发现中间子
					for( ptTo.x = ptFrom.x + 1; ptTo.x <= 8; ptTo.x ++ )
					{
						if( ptHalf.x == -1 ) // 无中间子
						{
							if( ! HaveMan( ptTo ) )
							{
								AddMoveToQueue( ptFrom, ptTo, nDepth );
							}
							else // if( HaveMan( ptTo ) )
							{
								ptHalf.x = ptTo.x ;
								ptHalf.y = ptTo.y ;
							}
						}
						else // 已有中间子
						{
							if( HaveMan( ptTo ) )
							{
								if( ! HaveFriend( ptTo, fSide ) )
									AddMoveToQueue( ptFrom, ptTo, nDepth );

								break;
							}
						}

					}

					break;


//==========生成红相的着法
				case RED_X:
				
					if( ptFrom.x == 0 )
					{
						if( ! HaveFriend(2, 4, fSide) && ! HaveMan(1, 3) )
							AddMoveToQueue( ptFrom, 2, 4, nDepth );

						if( ! HaveFriend(2, 0, fSide) && ! HaveMan(1, 1) )
							AddMoveToQueue( ptFrom, 2, 0, nDepth );
					}
					else if( ptFrom.x == 2 )
					{
						if( ptFrom.y == 4 )
						{
							if( ! HaveFriend(0, 2, fSide) && ! HaveMan(1, 3) )
								AddMoveToQueue( ptFrom, 0, 2, nDepth );

							if( ! HaveFriend(4, 2, fSide) && ! HaveMan(3, 3) )
								AddMoveToQueue( ptFrom, 4, 2, nDepth );
						}
						else // ptFrom.y == 0 
						{
							if( ! HaveFriend(0, 2, fSide) && ! HaveMan(1, 1) )
								AddMoveToQueue( ptFrom, 0, 2, nDepth );

							if( ! HaveFriend(4, 2, fSide) && ! HaveMan(3, 1) )
								AddMoveToQueue( ptFrom, 4, 2, nDepth );
						}	
					}
					else if( ptFrom.x == 4 )
					{
						if( ! HaveFriend(2, 4, fSide) && ! HaveMan(3, 3) )
							AddMoveToQueue( ptFrom, 2, 4, nDepth );

						if( ! HaveFriend(2, 0, fSide) && ! HaveMan(3, 1) )
							AddMoveToQueue( ptFrom, 2, 0, nDepth );

						if( ! HaveFriend(6, 4, fSide) && ! HaveMan(5, 3) )
							AddMoveToQueue( ptFrom, 6, 4, nDepth );

						if( ! HaveFriend(6, 0, fSide) && ! HaveMan(5, 1) )
							AddMoveToQueue( ptFrom, 6, 0, nDepth );
					}
					else if( ptFrom.x == 6 )
					{
						if( ptFrom.y == 4 )
						{
							if( ! HaveFriend(4, 2, fSide) && ! HaveMan(5, 3) )
								AddMoveToQueue( ptFrom, 4, 2, nDepth );

							if( ! HaveFriend(8, 2, fSide) && ! HaveMan(7, 3) )
								AddMoveToQueue( ptFrom, 8, 2, nDepth );
						}
						else // ptFrom.y == 0 
						{
							if( ! HaveFriend(4, 2, fSide) && ! HaveMan(5, 1) )
								AddMoveToQueue( ptFrom, 4, 2, nDepth );

							if( ! HaveFriend(8, 2, fSide) && ! HaveMan(7, 1) )
								AddMoveToQueue( ptFrom, 8, 2, nDepth );
						}	
					}
					else // x == 8
					{
						if( ! HaveFriend(6, 4, fSide) && ! HaveMan(7, 3) )
							AddMoveToQueue( ptFrom, 6, 4, nDepth );

						if( ! HaveFriend(6, 0, fSide) && ! HaveMan(7, 1) )
							AddMoveToQueue( ptFrom, 6, 0, nDepth );
					}

					break;


//==========生成黑象的着法
				case BLACK_X:
					
					if( ptFrom.x == 0 )
					{
						if( ! HaveFriend(2, 5, fSide) && ! HaveMan(1, 6) )
							AddMoveToQueue( ptFrom, 2, 5, nDepth );

						if( ! HaveFriend(2, 9, fSide) && ! HaveMan(1, 8) )
							AddMoveToQueue( ptFrom, 2, 9, nDepth );
					}
					else if( ptFrom.x == 2 )
					{
						if( ptFrom.y == 5 )
						{
							if( ! HaveFriend(0, 7, fSide) && ! HaveMan(1, 6) )
								AddMoveToQueue( ptFrom, 0, 7, nDepth );

							if( ! HaveFriend(4, 7, fSide) && ! HaveMan(3, 6) )
								AddMoveToQueue( ptFrom, 4, 7, nDepth );
						}
						else // ptFrom.y == 9 
						{
							if( ! HaveFriend(0, 7, fSide) && ! HaveMan(1, 8) )
								AddMoveToQueue( ptFrom, 0, 7, nDepth );

							if( ! HaveFriend(4, 7, fSide) && ! HaveMan(3, 8) )
								AddMoveToQueue( ptFrom, 4, 7, nDepth );
						}	
					}
					else if( ptFrom.x == 4 )
					{
						if( ! HaveFriend(2, 5, fSide) && ! HaveMan(3, 6) )
							AddMoveToQueue( ptFrom, 2, 5, nDepth );

						if( ! HaveFriend(2, 9, fSide) && ! HaveMan(3, 8) )
							AddMoveToQueue( ptFrom, 2, 9, nDepth );

						if( ! HaveFriend(6, 5, fSide) && ! HaveMan(5, 6) )
							AddMoveToQueue( ptFrom, 6, 5, nDepth );

						if( ! HaveFriend(6, 9, fSide) && ! HaveMan(5, 8) )
							AddMoveToQueue( ptFrom, 6, 9, nDepth );
					}
					else if( ptFrom.x == 6 )
					{
						if( ptFrom.y == 5 )
						{
							if( ! HaveFriend(4, 7, fSide) && ! HaveMan(5, 6) )
								AddMoveToQueue( ptFrom, 4, 7, nDepth );

							if( ! HaveFriend(8, 7, fSide) && ! HaveMan(7, 6) )
								AddMoveToQueue( ptFrom, 8, 7, nDepth );
						}
						else // ptFrom.y == 9 
						{
							if( ! HaveFriend(4, 7, fSide) && ! HaveMan(5, 8) )
								AddMoveToQueue( ptFrom, 4, 7, nDepth );

							if( ! HaveFriend(8, 7, fSide) && ! HaveMan(7, 8) )
								AddMoveToQueue( ptFrom, 8, 7, nDepth );
						}	
					}
					else // x == 8
					{
						if( ! HaveFriend(6, 5, fSide) && ! HaveMan(7, 6) )
							AddMoveToQueue( ptFrom, 6, 5, nDepth );

						if( ! HaveFriend(6, 9, fSide) && ! HaveMan(7, 8) )
							AddMoveToQueue( ptFrom, 6, 9, nDepth );
					}

					break;


//==========生成红仕的着法
				case RED_S:
					
					if( ptFrom.x == 3 )
					{
						if( ! HaveFriend( 4, 1, fSide ) )
							AddMoveToQueue( ptFrom,  4, 1, nDepth );
					}
					else if( ptFrom.x == 4 )
					{
						if( ! HaveFriend( 3, 2, fSide ) )
							AddMoveToQueue( ptFrom,  3, 2, nDepth );

						if( ! HaveFriend( 3, 0, fSide ) )
							AddMoveToQueue( ptFrom,  3, 0, nDepth );

						if( ! HaveFriend( 5, 2, fSide ) )
							AddMoveToQueue( ptFrom,  5, 2, nDepth );

						if( ! HaveFriend( 5, 0, fSide ) )
							AddMoveToQueue( ptFrom,  5, 0, nDepth );
					}
					else //  ptFrom.x == 5
					{
						if( ! HaveFriend( 4, 1, fSide ) )
							AddMoveToQueue( ptFrom,  4, 1, nDepth );
					}

					break;


//==========生成黑士的着法
				case BLACK_S:
					
					if( ptFrom.x == 3 )
					{
						if( ! HaveFriend( 4, 8, fSide ) )
							AddMoveToQueue( ptFrom,  4, 8, nDepth );
					}
					else if( ptFrom.x == 4 )
					{
						if( ! HaveFriend( 3, 7, fSide ) )
							AddMoveToQueue( ptFrom,  3, 7, nDepth );

						if( ! HaveFriend( 3, 9, fSide ) )
							AddMoveToQueue( ptFrom,  3, 9, nDepth );

						if( ! HaveFriend( 5, 7, fSide ) )
							AddMoveToQueue( ptFrom,  5, 7, nDepth );

						if( ! HaveFriend( 5, 9, fSide ) )
							AddMoveToQueue( ptFrom,  5, 9, nDepth );
					}
					else //  ptFrom.x == 5
					{
						if( ! HaveFriend( 4, 8, fSide ) )
							AddMoveToQueue( ptFrom,  4, 8, nDepth );
					}

					break;


//==========生成红兵的着法
				case RED_B:

					//向前
					ptTo.x = ptFrom.x ;
					ptTo.y = ptFrom.y + 1 ;
					if( ptTo.y <=9 && ! HaveFriend( ptTo, fSide ) )
						AddMoveToQueue( ptFrom, ptTo, nDepth );

					if( ptFrom.y >= 5 ) //兵已过河
					{
						ptTo.y = ptFrom.y ;

						//向左
						ptTo.x = ptFrom.x - 1 ;
						if( ptTo.x >=0 && ! HaveFriend( ptTo, fSide ) )
							AddMoveToQueue( ptFrom, ptTo, nDepth );

						//向右
						ptTo.x = ptFrom.x + 1 ;
						if( ptTo.x <=8 && ! HaveFriend( ptTo, fSide ) )
							AddMoveToQueue( ptFrom, ptTo, nDepth );
					}

					break;


//==========生成黑卒的着法
				case BLACK_B:
					
					//向前
					ptTo.x = ptFrom.x ;
					ptTo.y = ptFrom.y - 1 ;
					if( ptTo.y >=0 && ! HaveFriend( ptTo, fSide ) )
						AddMoveToQueue( ptFrom, ptTo, nDepth );

					if( ptFrom.y <= 4 ) //兵已过河
					{
						ptTo.y = ptFrom.y ;

						//向右
						ptTo.x = ptFrom.x - 1 ;
						if( ptTo.x >=0 && ! HaveFriend( ptTo, fSide ) )
							AddMoveToQueue( ptFrom, ptTo, nDepth );

						//向左
						ptTo.x = ptFrom.x + 1 ;
						if( ptTo.x <=8 && ! HaveFriend( ptTo, fSide ) )
							AddMoveToQueue( ptFrom, ptTo, nDepth );
					}

					break;

				}	// end switch
			
			}	// end if( CChessBoard[x][y] != 0 )

		}	// end for x 0 to 8, y 0 to 9

	return nMoveCount;	// 返回当前深度的走法总数
}

inline void AddMoveToQueue( POINT ptFrom, POINT ptTo, int nDepth )
{
	MoveList[nDepth][nMoveCount].ptFrom.x = ptFrom.x ;
	MoveList[nDepth][nMoveCount].ptFrom.y = ptFrom.y ;
	MoveList[nDepth][nMoveCount].ptTo.x = ptTo.x ;
	MoveList[nDepth][nMoveCount].ptTo.y = ptTo.y ;
	
	nMoveCount ++;
}

inline void AddMoveToQueue( POINT ptFrom, BYTE x, BYTE y, int nDepth )
{
	MoveList[nDepth][nMoveCount].ptFrom.x = ptFrom.x ;
	MoveList[nDepth][nMoveCount].ptFrom.y = ptFrom.y ;
	MoveList[nDepth][nMoveCount].ptTo.x = x ;
	MoveList[nDepth][nMoveCount].ptTo.y = y ;

	nMoveCount ++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -