/// <summary> /// Получение списка соседей для точки: /// </summary> /// <param name="pathNode"></param> /// <param name="goalCorner"></param> /// <param name="field"></param> /// <returns></returns> private static Collection<PathNode> GetNeighbours(PathNode pathNode, Point goalCorner, Map map) { var result = new Collection<PathNode>(); // Соседними точками являются соседние по стороне клетки. Point[] neighbourPoints = new Point[4]; neighbourPoints[0] = new Point(pathNode.Position.X + 1, pathNode.Position.Y); neighbourPoints[1] = new Point(pathNode.Position.X - 1, pathNode.Position.Y); neighbourPoints[2] = new Point(pathNode.Position.X, pathNode.Position.Y + 1); neighbourPoints[3] = new Point(pathNode.Position.X, pathNode.Position.Y - 1); foreach (var point in neighbourPoints) { // Проверяем, что не вышли за границы карты. if (point.X < 0 || point.X >= map.Columns) continue; if (point.Y < 0 || point.Y >= map.Rows) continue; // Проверяем, что по клетке можно ходить. if (map.IsCornerBusy(point)) continue; // Заполняем данные для точки маршрута. var neighbourNode = new PathNode() { Position = point, CameFrom = pathNode, PathLengthFromStart = pathNode.PathLengthFromStart + GetDistanceBetweenNeighbours(), HeuristicEstimatePathLength = GetHeuristicPathLength(point, goalCorner) }; result.Add(neighbourNode); } return result; }