/// <summary>
 /// ChessSquare Constructor
 /// </summary>
 public ChessSquare()
 {
     chessLocation = new Point(0,0);
     startLocation = new Point(0,0);
     chessPiece = null;
     isLastMove = false;
     squareID = EnumSquareID.A1;
 }
 //////////////////// MOVE ////////////////////////////
 /// <summary>
 /// RealMove method
 /// </summary>
 /// <param name="aMovingPiece"></param>
 /// <param name="aNewSquare"></param>
 /// <param name="aOriginalSquare"></param>
 private void RealMove(ChessPiece aMovingPiece, ChessSquare aNewSquare, ChessSquare aOriginalSquare)
 {
     aOriginalSquare.SetChessPiece(null);
     aMovingPiece.SetChessSquare(aNewSquare);
     aNewSquare.SetChessPiece(aMovingPiece);
 }
        /// <summary>
        /// CreateChessPiece by square piece type and piece color
        /// </summary>
        /// <param name="aChessSquare"></param>
        /// <param name="aChessPieceType"></param>
        /// <param name="aChessPieceColor"></param>
        /// <returns>ChessPiece</returns>
        private ChessPiece CreateChessPiece(ChessSquare aChessSquare, EnumPieceType aChessPieceType, EnumPieceColor aChessPieceColor)
        {
            ChessPiece chessPiece = new ChessPiece(aChessPieceColor, aChessPieceType, aChessSquare);
            EnumSquareID squareID = aChessSquare.GetSquareID();

            Point aLocation = new Point(aChessSquare.GetStartLocation().X + ChessImageConstants.ChessPieceLeft,
                aChessSquare.GetStartLocation().Y + ChessImageConstants.ChessPieceTop);

            chessPiece.SetStartLocation(aLocation);
            chessPiece.SetChessSquare(aChessSquare);

            aChessSquare.SetChessPiece(chessPiece);

            if (aChessPieceColor == EnumPieceColor.White)
            {
                whitePieceList.Add(chessPiece);
            }
            else
            {
                blackPieceList.Add(chessPiece);
            }
            return chessPiece;
        }
        /// <summary>
        /// CreateChessPiece by square and piece ID
        /// </summary>
        /// <param name="aChessSquare"></param>
        /// <param name="aChessPieceType"></param>
        /// <param name="aChessPieceColor"></param>
        /// <returns>ChessPiece</returns>
        private ChessPiece CreateChessPiece(ChessSquare aChessSquare, EnumPieceID aPieceID)
        {
            EnumPieceColor chessPieceColor = EnumPieceColor.White;
            EnumPieceType chessPieceType = EnumPieceType.None;

            int pieceNumber = (int)aPieceID;
            if( pieceNumber >= 11 && pieceNumber <= 16)
            {
                pieceNumber -= 10;
                chessPieceColor = EnumPieceColor.White;
            }
            else if (pieceNumber >= 21 && pieceNumber <= 26)
            {
                pieceNumber -= 20;
                chessPieceColor = EnumPieceColor.Black;
            }
            else
            {
                chessPieceColor = EnumPieceColor.None;
                chessPieceType = EnumPieceType.None;
            }

            // King, Queen, Rook, Bishop, Knight, Pawn
            switch (pieceNumber)
            {
                case 1: chessPieceType = EnumPieceType.King; break;
                case 2: chessPieceType = EnumPieceType.Queen; break;
                case 3: chessPieceType = EnumPieceType.Rook; break;
                case 4: chessPieceType = EnumPieceType.Bishop; break;
                case 5: chessPieceType = EnumPieceType.Knight; break;
                case 6: chessPieceType = EnumPieceType.Pawn; break;
                default: chessPieceType = EnumPieceType.None; break;
            }

            ChessPiece chessPiece = new ChessPiece(chessPieceColor, chessPieceType, aChessSquare);
            EnumSquareID squareID = aChessSquare.GetSquareID();

            Point aLocation = new Point(aChessSquare.GetStartLocation().X + ChessImageConstants.ChessPieceLeft,
                aChessSquare.GetStartLocation().Y + ChessImageConstants.ChessPieceTop);

            chessPiece.SetStartLocation(aLocation);
            chessPiece.SetChessSquare(aChessSquare);

            aChessSquare.SetChessPiece(chessPiece);

            if (chessPieceColor == EnumPieceColor.White)
            {
                whitePieceList.Add(chessPiece);
            }
            else if (chessPieceColor == EnumPieceColor.Black)
            {
                blackPieceList.Add(chessPiece);
            }
            return chessPiece;
        }
        /// <summary>
        /// MovePiece method
        /// </summary>
        /// <param name="aMovingPiece"></param>
        /// <param name="aSquare"></param>
        /// <param name="aoriginalSquare"></param>
        /// <returns>bool</returns>
        public bool MovePiece(ChessPiece aMovingPiece, ChessSquare aSquare, ChessSquare aoriginalSquare)
        {
            // if new square contains a piece, make that piece's square to null
            ChessPiece aCapturedPiece = aSquare.GetChessPiece();

            // Move the Piece
            RealMove(aMovingPiece, aSquare, aoriginalSquare);

            // Set Piece's Start Position
            aMovingPiece.SetStartLocation(new Point(aSquare.GetStartLocation().X + ChessImageConstants.ChessPieceLeft,
                aSquare.GetStartLocation().Y + ChessImageConstants.ChessPieceTop));

            return true;
        }
 /// <summary>
 /// DrawPiece method
 /// </summary>
 /// <param name="g"></param>
 /// <param name="aChessPiece"></param>
 public void DrawPiece(Graphics g, ChessPiece aChessPiece)
 {
     if (aChessPiece != null)
         aChessPiece.Draw(g, chessPieceFactory);
 }
 /// <summary>
 /// SetChessPiece Accessor
 /// </summary>
 /// <param name="aChessPiece"></param>
 public void SetChessPiece(ChessPiece aChessPiece)
 {
     chessPiece = aChessPiece;
 }