public bool GetPath(GridSpot destination, ref List <GridSpot> path) { path.Clear(); MoveSetElement destinationElement = GetElement(destination); if (destinationElement != null) { path.Add(destination); while (destinationElement.previousElement.previousElement != null) { destinationElement = destinationElement.previousElement; path.Insert(0, destinationElement.spot); } return(true); } return(false); }
MoveSetElement TryAndAddOrUpdate(GridSpot spot, MoveSetElement previousElement, int distance) { for (int s = 0; s < elements.Count; s++) { if (elements[s].spot == spot) { if (elements[s].distance > distance || (elements[s].distance == distance && (previousElement.spot.CoordX == spot.CoordX || previousElement.spot.CoordY == spot.CoordY))) { elements[s].Update(previousElement, distance); return(elements[s]); } return(null); } } MoveSetElement result = new MoveSetElement(spot, previousElement, distance); elements.Add(result); return(result); }
void Explore(MoveSetElement startElement, int currentDistance, int maxDistance, PlayGrid grid) { currentDistance++; if (currentDistance > maxDistance) { return; } for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { GridSpot spot = grid.GetSpot(startElement.spot.CoordX + i, startElement.spot.CoordY + j, true); if (spot != null) { MoveSetElement newOrUpdatedElement = TryAndAddOrUpdate(spot, startElement, currentDistance); if (newOrUpdatedElement != null) { Explore(newOrUpdatedElement, currentDistance, maxDistance, grid); } } } } }
public void Update(MoveSetElement newPreviousElement, int newDistance) { previousElement = newPreviousElement; distance = newDistance; }
public MoveSetElement(GridSpot _spot, MoveSetElement _previousElement, int _distance) { spot = _spot; previousElement = _previousElement; distance = _distance; }