/// <summary>
        /// Returns all of the squares immediately surrounding the root square
        /// </summary>
        /// <param name="rootPosition"></param>
        /// <param name="boardData"></param>
        /// <returns></returns>
        internal static List <Square> SurroundingSquares(DataBoardPosition rootPosition, BoardData boardData)
        {
            // List of squares we will be returning; clockwise starting from upper-left
            List <Square> squares = new List <Square>
            {
                GetSquareForCoordinates(rootPosition.File - 1, rootPosition.Rank + 1, boardData),
                GetSquareForCoordinates(rootPosition.File, rootPosition.Rank + 1, boardData),
                GetSquareForCoordinates(rootPosition.File + 1, rootPosition.Rank + 1, boardData),
                GetSquareForCoordinates(rootPosition.File + 1, rootPosition.Rank, boardData),
                GetSquareForCoordinates(rootPosition.File + 1, rootPosition.Rank - 1, boardData),
                GetSquareForCoordinates(rootPosition.File, rootPosition.Rank - 1, boardData),
                GetSquareForCoordinates(rootPosition.File - 1, rootPosition.Rank - 1, boardData),
                GetSquareForCoordinates(rootPosition.File - 1, rootPosition.Rank, boardData)
            };

            return(squares);
        }
        /// <summary>
        /// Returns all squares in the same diagonals as the rootPosition
        /// </summary>
        /// <param name="rootPosition"></param>
        /// <param name="boardData"></param>
        /// <returns></returns>
        internal static List <Square> DiagonalSquares(DataBoardPosition rootPosition, BoardData boardData)
        {
            // List of squares we will be returning;
            List <Square> squares = new List <Square>();

            // Lower-left diagonal
            DataBoardPosition runningPosition = rootPosition;
            bool hasReachedEdge = runningPosition.File <= 0 || runningPosition.Rank <= 0;

            while (!hasReachedEdge)
            {
                runningPosition.File--;
                runningPosition.Rank--;
                if (runningPosition.File <= 0 || runningPosition.Rank <= 0)
                {
                    hasReachedEdge = true;
                }

                squares.Add(GetSquareForCoordinates(runningPosition.File, runningPosition.Rank, boardData));
            }

            // Upper-right diagonal
            runningPosition = rootPosition;
            hasReachedEdge  = runningPosition.File >= boardData.Dimensions.Item1 ||
                              runningPosition.Rank >= boardData.Dimensions.Item2;
            while (!hasReachedEdge)
            {
                runningPosition.File++;
                runningPosition.Rank++;
                if (runningPosition.File >= boardData.Dimensions.Item1 || runningPosition.Rank >= boardData.Dimensions.Item2)
                {
                    hasReachedEdge = true;
                }

                squares.Add(GetSquareForCoordinates(runningPosition.File, runningPosition.Rank, boardData));
            }

            // Lower-right diagonal
            runningPosition = rootPosition;
            hasReachedEdge  = runningPosition.File >= boardData.Dimensions.Item1 || runningPosition.Rank <= 0;
            while (!hasReachedEdge)
            {
                runningPosition.File++;
                runningPosition.Rank--;
                if (runningPosition.File >= boardData.Dimensions.Item1 || runningPosition.Rank <= 0)
                {
                    hasReachedEdge = true;
                }

                squares.Add(GetSquareForCoordinates(runningPosition.File, runningPosition.Rank, boardData));
            }

            // Upper-left diagonal
            runningPosition = rootPosition;
            hasReachedEdge  = runningPosition.File <= 0 || runningPosition.Rank >= boardData.Dimensions.Item2;
            while (!hasReachedEdge)
            {
                runningPosition.File--;
                runningPosition.Rank++;
                if (runningPosition.File <= 0 || runningPosition.Rank >= boardData.Dimensions.Item2)
                {
                    hasReachedEdge = true;
                }

                squares.Add(GetSquareForCoordinates(runningPosition.File, runningPosition.Rank, boardData));
            }

            return(squares);
        }