/// <summary>
 /// Play the computer move found by the search.
 /// </summary>
 /// <param name="bFlash">       true to flash moving position</param>
 /// <param name="eMessageMode"> Which message to show</param>
 /// <param name="move">         Best move</param>
 /// <param name="iPermCount">   Permutation count</param>
 /// <param name="iDepth">       Depth of the search</param>
 /// <param name="iCacheHit">    Number of moves found in the translation table cache</param>
 /// <param name="stat">         Playing stat. Can be null</param>
 /// <returns>
 /// true if end of game, false if not
 /// </returns>
 private bool PlayComputerMove(bool bFlash, MessageModeE eMessageMode, ChessBoard.MovePosS move, int iPermCount, int iDepth, int iCacheHit, ComputerPlayingStat stat) {
     bool                        bRetVal;
     ChessBoard.MoveResultE      eResult;
     ChessBoard.PlayerColorE     eColorToPlay;
                                 
     eColorToPlay    = m_chessCtl.NextMoveColor;
     eResult         = m_chessCtl.DoMove(move,
                                         bFlash,
                                         iPermCount,
                                         iDepth,
                                         iCacheHit);
     if (stat != null) {
         stat.m_eResult = eResult;
     }
     bRetVal = DisplayMessage(eResult, eMessageMode);
     return(bRetVal);
 }
 /// <summary>
 /// Display a message related to the MoveStateE
 /// </summary>
 /// <param name="eMoveResult">  Move result</param>
 /// <param name="eMessageMode"> Message mode</param>
 /// <returns>
 /// true if it's the end of the game. false if not
 /// </returns>
 private bool DisplayMessage(ChessBoard.MoveResultE eMoveResult, MessageModeE eMessageMode) {
     bool    bRetVal;
     string  strOpponent;
     
     if (m_ePlayingMode == PlayingModeE.PlayerAgainstComputer) {
         if (m_chessCtl.ChessBoard.NextMoveColor == m_eComputerPlayingColor) {
             strOpponent = "Computer is ";
         } else {
             strOpponent = "You are ";
         }
     } else {
         strOpponent = (m_chessCtl.ChessBoard.NextMoveColor == ChessBoard.PlayerColorE.White) ? "White player is " : "Black player is ";
     }
     switch(eMoveResult) {
     case ChessBoard.MoveResultE.NoRepeat:
         bRetVal = false;
         break;
     case ChessBoard.MoveResultE.TieNoMove:
         if (eMessageMode != MessageModeE.Silent) {
             MessageBox.Show("Draw. " + strOpponent + "unable to move.");
         }
         bRetVal = true;
         break;
     case ChessBoard.MoveResultE.TieNoMatePossible:
         if (eMessageMode != MessageModeE.Silent) {
             MessageBox.Show("Draw. Not enough pieces to make a checkmate.");
         }
         bRetVal = true;
         break;
     case ChessBoard.MoveResultE.ThreeFoldRepeat:
         if (eMessageMode != MessageModeE.Silent) {
             MessageBox.Show("Draw. 3 times the same board.");
         }
         bRetVal = true;
         break;
     case ChessBoard.MoveResultE.FiftyRuleRepeat:
         if (eMessageMode != MessageModeE.Silent) {
             MessageBox.Show("Draw. 50 moves without moving a pawn or eating a piece.");
         }
         bRetVal = true;
         break;
     case ChessBoard.MoveResultE.Check:
         if (eMessageMode == MessageModeE.Verbose) {
             MessageBox.Show(strOpponent + "in check.");
         }
         bRetVal = false;
         break;
     case ChessBoard.MoveResultE.Mate:
         if (eMessageMode != MessageModeE.Silent) {
             MessageBox.Show(strOpponent + "checkmate.");
         }
         bRetVal = true;
         break;
     default:
         bRetVal = false;
         break;
     }
     return(bRetVal);
 }