/// <summary> /// Determine next direction /// </summary> /// <param name="currentDirection"></param> /// <param name="mapBoard"></param> /// <param name="characterPath"></param> /// <returns></returns> private static MapMove FindNextMove(MapMove currentDirection, MapDirections mapBoard, StringBuilder characterPath) { var direction = currentDirection; if (currentDirection == MapMove.None) { direction = GetDirection(MapMove.Up, MapMove.Right, mapBoard, characterPath); direction = GetDirection(direction, MapMove.Down, mapBoard, characterPath); direction = GetDirection(direction, MapMove.Left, mapBoard, characterPath); } else if (!mapBoard.IsValidMove(currentDirection)) { // if current position is up or down go left or right and vice versa if (currentDirection == MapMove.Up || currentDirection == MapMove.Down) { direction = GetDirection(MapMove.Left, MapMove.Right, mapBoard, characterPath); } else if (currentDirection == MapMove.Left || currentDirection == MapMove.Right) { direction = GetDirection(MapMove.Up, MapMove.Down, mapBoard, characterPath); } } return(direction); }
/// <summary> /// Based on two input directions determine next move /// </summary> /// <param name="first"></param> /// <param name="second"></param> /// <param name="mapBoard"></param> /// <param name="characterPath"></param> /// <returns></returns> private static MapMove GetDirection(MapMove first, MapMove second, MapDirections mapBoard, StringBuilder characterPath) { var takeFirst = first != MapMove.None && mapBoard.IsValidMove(first); var takeSecond = second != MapMove.None && mapBoard.IsValidMove(second); var firstDirectionMark = GetDirectionMove(first, mapBoard.SearchNextChar(first)); var secondDirectionMark = GetDirectionMove(second, mapBoard.SearchNextChar(second)); // first check for possible invalid moves // only one direction is valid if (takeFirst && firstDirectionMark && takeSecond && secondDirectionMark) { string exceptionMessage = "Path is invalid at character: " + characterPath.ToString(); throw new MapException(exceptionMessage); } // only one direction is valid else if (takeFirst && takeSecond) { string exceptionMessage = "Path is invalid at character: " + characterPath.ToString(); throw new MapException(exceptionMessage); } // take valid move else if (takeFirst && firstDirectionMark) { return(first); } else if (takeSecond && secondDirectionMark) { return(second); } else if (takeFirst) { return(first); } else if (takeSecond) { return(second); } else { return(MapMove.None); } }