using System.Collections; using System.Collections.Generic; using UnityEngine; internal static class BreadthFirstAlgorithms { static public HaxNode[] FindReachable(HaxNode start, int maxMovement) { List<HaxNode> open = new List<HaxNode>(); List<HaxNode> visited = new List<HaxNode>(); open.Add(start); visited.Add(start); start.BreadthFirstProperties.DistanceMoved = 0; int SavetyLoopCount = 0; while (open.Count > 0) { HaxNode[] neighbors = Grid.instance.GetNeighborsHax(open[0]).ToArray(); for (int i = 0; i < neighbors.Length; i++) { if (open[0].BreadthFirstProperties.DistanceMoved + neighbors[i].MoveCost >= neighbors[i].BreadthFirstProperties.DistanceMoved || open[0].BreadthFirstProperties.DistanceMoved + neighbors[i].MoveCost > maxMovement) continue; neighbors[i].BreadthFirstProperties.DistanceMoved = open[0].BreadthFirstProperties.DistanceMoved + neighbors[i].MoveCost; neighbors[i].BreadthFirstProperties.Parant = open[0]; if (neighbors[i].IsWalkable) { if (!visited.Contains(neighbors[i])) visited.Add(neighbors[i]); if (!open.Contains(neighbors[i])) open.Add(neighbors[i]); } } open.RemoveAt(0); SavetyLoopCount++; if (SavetyLoopCount > 1000) break; } HexNodeCleanUp(visited); return visited.ToArray(); } static void HexNodeCleanUp(List<HaxNode> nodes) { for (int i = 0; i < nodes.Count; i++) { nodes[i].BreadthFirstProperties.DistanceMoved = int.MaxValue; nodes[i].BreadthFirstProperties.Parant = null; } } } public class BreadthFirstProperties { public int DistanceMoved = int.MaxValue; public HaxNode Parant; }
Recent Comments