public IAsciiField GetFieldInDirection(PathDirection pathDirection, IAsciiField lastValidField) { IAsciiField field = null; switch (pathDirection) { case PathDirection.East: field = GetField(lastValidField.Row, lastValidField.Column + 1); break; case PathDirection.North: field = GetField(lastValidField.Row - 1, lastValidField.Column); break; case PathDirection.South: field = GetField(lastValidField.Row + 1, lastValidField.Column); break; case PathDirection.West: field = GetField(lastValidField.Row, lastValidField.Column - 1); break; default: break; } return(field); }
private static bool IsDirectionPreserved(IAsciiMap map, IAsciiField field, PathDirection direction) { var nextField = map.GetFieldInDirection(direction, field); return(nextField != null && IsPassableCharacter(nextField.Character)); }
private static bool IsDirectionValid(IAsciiMap map, IAsciiField field, PathDirection direction) { var nextField = map.GetFieldInDirection(direction, field); return(nextField != null && !nextField.AlreadyVisited && IsPassableCharacter(nextField.Character)); }
public void AddPathCharacter(IAsciiField field) { PathCharacters.Add(field.Character); if (!field.AlreadyVisited && field.Character >= (int)MapCharacter.FirstTextCharacter && field.Character <= (int)MapCharacter.LastTextCharacter) { PathLetters.Add(field.Character); } field.AlreadyVisited = true; }
public static void FindPath(IAsciiMap map, IAsciiField currentField, PathDirection currentDirection) { map.AddPathCharacter(currentField); var directionToMoveNext = ScanArea(map, currentField, currentDirection); IAsciiField nextField = map.GetFieldInDirection(directionToMoveNext, currentField); if (IsAsciiEndCharacter(nextField.Character)) { map.AddPathCharacter(nextField); } else { FindPath(map, nextField, directionToMoveNext); } }
public static PathDirection ScanArea(IAsciiMap map, IAsciiField currentField, PathDirection currentPathDirection) { if (currentPathDirection != PathDirection.Unknown && IsDirectionPreserved(map, currentField, currentPathDirection)) { return(currentPathDirection); } foreach (PathDirection direction in Enum.GetValues(typeof(PathDirection))) { if (IsDirectionValid(map, currentField, direction)) { return(direction); } } return(PathDirection.Unknown); }