Пример #1
0
        /// <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;
        }