private void SearchPathToProccessedElement(LabyrinthElement currentElement, Point pointToGetTo, LabyrinthElementChain parentChain, List <LabyrinthElementChain> foundChains) { if (parentChain == null) { parentChain = new LabyrinthElementChain(currentElement); } else { parentChain = new LabyrinthElementChain(currentElement, parentChain); } foreach (var elementToCheck in currentElement.CloseElements.Where(e => e.Type != ElementType.Wall)) { if (GetChainElements(parentChain).Any(e => e.Point.X == elementToCheck.Point.X && e.Point.Y == elementToCheck.Point.Y)) { continue; } if (elementToCheck.Point.X == pointToGetTo.X && elementToCheck.Point.Y == pointToGetTo.Y) { foundChains.Add(new LabyrinthElementChain(elementToCheck, parentChain)); } else { SearchPathToProccessedElement(elementToCheck, pointToGetTo, parentChain, foundChains); } } }
private List <LabyrinthElement> GetChainElements(LabyrinthElementChain chain) { var result = new List <LabyrinthElement>(); var chainToCheck = chain; while (chainToCheck != null) { result.Add(chainToCheck.LabyrinthElement); chainToCheck = chainToCheck.Parent; } return(result); }
public LabyrinthElementChain(LabyrinthElement element, LabyrinthElementChain parent) { LabyrinthElement = element; Parent = parent; }