Advertisement
timeshifter

pathfinder yield return

Dec 8th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.09 KB | None | 0 0
  1.         List<Point> ComputeBestPath(Point startPt, Point endPt) {
  2.             pbField.Refresh();
  3.             field[startPt.X, startPt.Y].DistanceFromStart = 0;
  4.  
  5.             int x, y;
  6.             List<Point> scanPoints = new List<Point>();
  7.             List<Point> retPath = new List<Point>();
  8.             scanPoints.Add(startPt);
  9.  
  10.             if (!field[startPt.X, startPt.Y].Cell.Traversable || !field[endPt.X, endPt.Y].Cell.Traversable) {
  11.                 bestPath.Clear();
  12.                 lblPathDifficulty.Text = "n/a";
  13.                 lblDistance.Text = "n/a";
  14.                 return new List<Point>();
  15.             }
  16.  
  17.             int iterations = 0;
  18.  
  19.             bool searching = true;
  20.             Point newPt = new Point();
  21.             Point pt = endPt;
  22.             double dist = initialDist;
  23.  
  24.             g.Clear(Color.Transparent);
  25.  
  26.             while (scanPoints.Count > 0 && searching) {
  27.                 x = scanPoints[0].X;
  28.                 y = scanPoints[0].Y;
  29.  
  30.  
  31.                 foreach (MoveDir p in ValidMoves(x, y)) {
  32.                     double d = field[x, y].DistanceFromStart + (field[p.X, p.Y].Cell.Difficulty * p.Distance);
  33.                     if (d < field[p.X, p.Y].DistanceFromStart) {
  34.                         if (cbShowScan.Checked)
  35.                             g.DrawRectangle(new Pen(Color.FromArgb(63, Color.White), 2f), p.X * cellSize + 1.5f, p.Y * cellSize + 1.5f, cellSize - 3, cellSize - 3);
  36.  
  37.                         if (cbAnimateScan.Checked && ++iterations == numAnimationSpeed.Value) {
  38.                             pbField.Refresh();
  39.                             iterations = 0;
  40.                         }
  41.  
  42.                         field[p.X, p.Y].DistanceFromStart = d;
  43.  
  44.                         if (p.X == endPt.X && p.Y == endPt.Y) {
  45.                             searching = false;
  46.                             break;
  47.                         }
  48.                         scanPoints.Add(new Point(p.X, p.Y));
  49.                     }
  50.                 }
  51.                 scanPoints.RemoveAt(0);
  52.  
  53.                 scanPoints = (from Point p in scanPoints
  54.                               orderby (field[p.X, p.Y].DistanceFromStart * diffWeight) + (CalculateDistance(p, endPt) * distWeight)
  55.                               select p).ToList();
  56.  
  57.             }
  58.  
  59.             double totalDiff = 0.0;
  60.             if (field[endPt.X, endPt.Y].DistanceFromStart == initialDist)
  61.                 retPath.Clear();
  62.             else {
  63.                 pt = endPt;
  64.                 int moveTurns = 0;
  65.                 searching = true;
  66.  
  67.                 while (searching) {
  68.                     retPath.Insert(0, pt);
  69.                     totalDiff += field[pt.X, pt.Y].Cell.Difficulty;
  70.                     dist = initialDist;
  71.                     moveTurns++;
  72.  
  73.                     foreach (MoveDir p in ValidMoves(pt.X, pt.Y)) {
  74.                         if (field[p.X, p.Y].DistanceFromStart < dist) {
  75.                             newPt = new Point(p.X, p.Y);
  76.                             dist = field[p.X, p.Y].DistanceFromStart;
  77.                         }
  78.                     }
  79.                     pt = newPt;
  80.                     if (newPt == startPt)
  81.                         searching = false;
  82.                 }
  83.             }
  84.             lblDistance.Text = (retPath.Count == 0 ? "no path" : retPath.Count.ToString());
  85.             lblPathDifficulty.Text = totalDiff.ToString();
  86.  
  87.             return retPath;
  88.         }
  89.  
  90.  
  91.  
  92.         IEnumerable<MoveDir> ValidMoves(int x, int y) {
  93.             foreach (MoveDir pt in movePoints) {
  94.                 MoveDir p = new MoveDir(x + pt.X, y + pt.Y, pt.Distance);
  95.                 if (p.X >= 0 && p.X < maxX && p.Y >= 0 && p.Y < maxY) {
  96.                     if (field[p.X, p.Y].Cell.Traversable) {
  97.                         if (x != p.X && y != p.Y) {
  98.                             if (field[x, p.Y].Cell.Traversable && field[p.X, y].Cell.Traversable)
  99.                                 yield return p;
  100.                         }
  101.                         else
  102.                             yield return p;
  103.                     }
  104.                 }
  105.             }
  106.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement