//*********************************************************     
 //
 /// <summary>
 /// Find the best move for a player using alpha-beta for a given depth
 /// </summary>
 /// <param name="chessBoard">       Chess board</param>
 /// <param name="searchMode">       Search mode</param>
 /// <param name="ePlayerColor">     Color doing the move</param>
 /// <param name="moveList">         List of move to try</param>
 /// <param name="iTotalMoveCount">  Total list of moves</param>
 /// <param name="iDepth">           Maximum depth</param>
 /// <param name="iAlpha">           Alpha bound</param>
 /// <param name="iBeta">            Beta bound</param>
 /// <param name="transTable">       Transposition table or null if not using one</param>
 /// <param name="dtTimeOut">        Time limit (DateTime.MaxValue for no time limit)</param>
 /// <param name="iPermCount">       Total permutation evaluated</param>
 /// <param name="iBestMoveIndex">   Index of the best move</param>
 /// <param name="bTimeOut">         Return true if time out</param>
 /// <param name="arrPoints">        Returns point of each move in move list</param>
 /// <returns>
 /// Points
 /// </returns>
 //  
 //*********************************************************     
 private int FindBestMoveUsingAlphaBetaAtDepth(ChessBoard chessBoard, SearchMode searchMode, ChessBoard.PlayerColorE ePlayerColor, List<ChessBoard.MovePosS> moveList, int iTotalMoveCount, int iDepth, int iAlpha, int iBeta, TransTable transTable, DateTime dtTimeOut, out int iPermCount, out int iBestMoveIndex, out bool bTimeOut, out int[] arrPoints) {
     int                         iRetVal = -10000000;
     int                         iWhiteMoveCount;
     int                         iBlackMoveCount;
     int                         iMoveCount;
     int                         iIndex;
     int                         iPts;
     ChessBoard.MovePosS         move;
     AlphaBetaInfo               abInfo;
     ChessBoard.RepeatResultE    eResult;
                 
     bTimeOut                    = false;
     abInfo                      = new AlphaBetaInfo();
     abInfo.m_arrMovePos         = new ChessBoard.MovePosS[iDepth];
     abInfo.m_iPermCount         = 0;
     abInfo.m_dtTimeOut          = dtTimeOut;
     abInfo.m_transTable         = transTable;
     abInfo.m_iMaxDepth          = iDepth;
     abInfo.m_searchMode         = searchMode;
     abInfo.m_iAttackedPos       = 0;
     abInfo.m_iAttackedPieces    = 0;
     iBestMoveIndex              = -1;
     arrPoints                   = new int[moveList.Count];
     if (ePlayerColor == ChessBoard.PlayerColorE.White) {
         iWhiteMoveCount = iTotalMoveCount;
         iBlackMoveCount = 0;
     } else {
         iWhiteMoveCount = 0;
         iBlackMoveCount = iTotalMoveCount;
     }
     iMoveCount = moveList.Count;
     iIndex     = 0;
     iRetVal    = iAlpha;
     while (iIndex < iMoveCount && !bTimeOut) {
         move                            = moveList[iIndex];
         eResult                         = chessBoard.DoMoveNoLog(move);
         abInfo.m_arrMovePos[iDepth - 1] = move;
         if (eResult == ChessBoard.RepeatResultE.NoRepeat) {
             iPts = -AlphaBeta(chessBoard,
                               (ePlayerColor == ChessBoard.PlayerColorE.Black) ? ChessBoard.PlayerColorE.White : ChessBoard.PlayerColorE.Black,
                               iDepth - 1,
                               -iBeta,
                               -iRetVal,
                               iWhiteMoveCount,
                               iBlackMoveCount,
                               abInfo);
         } else {
             iPts = 0;
         }                                         
         arrPoints[iIndex] = iPts;
         chessBoard.UndoMoveNoLog(move);
         if (iPts == Int32.MinValue) {
             iRetVal  = iPts;
             bTimeOut = true;
         } else {
             if (iPts > iRetVal) {
                 TraceSearch(iDepth, ePlayerColor, move, iPts);
                 iRetVal         = iPts;
                 iBestMoveIndex  = iIndex;
             }
         }
         iIndex++;
     }
     iPermCount = abInfo.m_iPermCount;
     return(iRetVal);
 }
Exemple #2
0
 //*********************************************************     
 //
 /// <summary>
 /// Gets one of the static translation table
 /// </summary>
 /// <param name="iIndex">           Index of the table (0..ProcessorCount-1)</param>
 /// <returns>
 /// Translation table
 /// </returns>
 //  
 //*********************************************************     
 static public TransTable GetTransTable(int iIndex) {
     if (m_arrTransTable[iIndex] == null) {
         m_arrTransTable[iIndex] = new TransTable(TranslationTableSize);
     }
     return(m_arrTransTable[iIndex]);
 }