static public void BStarStep(NLocate src, NLocate dst, NMap map, List <int> bufferIndex, NPathNode pathList) { if (src.Equals(dst)) { Console.WriteLine("FindPath with B*"); GPath = new List <NLocate>(pathList.GetPath()); return; } var dstLoc = src.NearLocTo(dst); if (!map.Alive(dstLoc)) { bufferIndex.Add(dstLoc.ToIndex(map)); BStarStep(dstLoc, dst, map, bufferIndex, pathList.AddChild(dstLoc.X, dstLoc.Y)); } else { foreach (var l in src.Branch(dstLoc)) { if (!bufferIndex.Contains(l.ToIndex(map.Width)) && !map.Alive(l)) { bufferIndex.Add(l.ToIndex(map)); BStarStep(l, dst, map, bufferIndex, pathList.AddChild(l.X, l.Y)); } } } }
public IEnumerable <NLocate> LineTo(NLocate dst) { NLocate curLoc = this; while (true) { curLoc = curLoc.NearLocTo(dst); if (curLoc.Equals(dst)) { yield break; } yield return(curLoc); } }
public static void AxisLine(NMap map, NLocate src, NLocate dst, byte digType) { if (src.Equals(dst)) { return; } int dx = dst.X - src.X; int dy = dst.Y - src.Y; NLocate crossLoc = Math.Abs(dx) > Math.Abs(dy) ? new NLocate(dst.X, src.Y) : new NLocate(src.X, dst.Y); Line(map, src, crossLoc, digType); Line(map, dst, crossLoc, digType); map.SetBlock(crossLoc, digType); }
public static void Line(NMap map, NLocate src, NLocate dst, byte digType) { if (src.Equals(dst)) { return; } if (map.WithIn(src)) { map.SetBlock(src.X, src.Y, digType); } List <NLocate> mos = new List <NLocate>(); mos.AddRange(src.Direction4()); mos.Sort((x, y) => x.DistanceTo(dst).CompareTo(y.DistanceTo(dst))); Line(map, mos[0], dst, digType); }
public static void Noise(NMap map, NLocate src, NLocate dst, byte movType, byte digType) { if (src.Equals(dst)) { return; } if (map.WithIn(src)) { map.SetBlock(src.X, src.Y, digType); } List <NLocate> mos = new List <NLocate>(); mos.AddRange(src.Direction4()); mos.Sort((x, y) => x.DistanceTo(dst).CompareTo(y.DistanceTo(dst))); Dictionary <NLocate, double> rateDict = new Dictionary <NLocate, double>(); if (map.WithIn(mos[0])) { rateDict.Add(mos[0], 0.6); } if (map.WithIn(mos[1])) { rateDict.Add(mos[1], 0.3); } if (map.WithIn(mos[2])) { rateDict.Add(mos[2], 0.1); } if (map.WithIn(mos[3])) { rateDict.Add(mos[3], 0.1); } NLocate mov = RandomSelectByRate <NLocate> .Select(rateDict); Noise(map, mov, dst, movType, digType); }