Wacky_rubia

Untitled

Mar 11th, 2014
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using mazes;
  5. using System.Linq;
  6.  
  7. namespace Flies
  8. {
  9. public class PathFinder
  10. {
  11.  
  12. static Point[] p = new Point[] { new Point(0, 1), new Point(0, -1), new Point(1, 0), new Point(-1, 0) };
  13. static Random r = new Random();
  14.  
  15. private static IEnumerable<Point> GetNeighbours(Point from, IWorld world, Point[,] map)
  16. {
  17. //А если перемешивать всех соседей перед тем как вернуть, то поведение мух визуально будет естественнее.
  18. var listOfPoint = p.Select(z => new Point(z.X + from.X, z.Y + from.Y))
  19. .OrderBy(
  20. .Where(z => CanMove(z.X, z.Y, world, map))
  21.  
  22. .ToArray();
  23. return listOfPoint;
  24. }
  25.  
  26. static bool CanMove(int x, int y, IWorld world, Point[,] map)
  27. {
  28. return x >= 0 && y >= 0 && x < world.Size.Width && y < world.Size.Height && !world.Contains<Wall>(new Point(x, y)) && map[x,y] == new Point(0, 0) /*&& !world.Contains<Fly>(new Point(x, y))*/;
  29. }
  30.  
  31. public static Point GetDirectionTo(Point source, Point target, IWorld world)
  32. {
  33. if (world.Contains<Wall>(new Point(target.X, target.Y)))
  34. return Point.Empty;
  35. var queue = new Queue<Point>();
  36. var map = new Point[world.Size.Width, world.Size.Height];
  37. map[source.X, source.Y] = new Point{ X = -1, Y = -1 };
  38. queue.Enqueue(new Point { X = source.X, Y = source.Y });
  39. while (queue.Count != 0)
  40. {
  41. var point = queue.Dequeue();
  42. if (point == target)
  43. {
  44. break;
  45. }
  46. foreach (var e in GetNeighbours(point, world, map)
  47. .ToArray())
  48. {
  49. queue.Enqueue(e);
  50. map[e.X, e.Y] = point;
  51. }
  52. }
  53. var currentPoint = new Point { X = target.X, Y = target.Y };
  54. while (true)
  55. {
  56. var Step = GetNeighbours(currentPoint, world, map).Where(z => map[currentPoint.X, currentPoint.Y] == z).ToArray();
  57. if (Step[0] == source)
  58. break;
  59. currentPoint = Step[0];
  60. }
  61. return new Point(currentPoint.X - source.X, currentPoint.Y - source.Y);
  62. // Реализуйте поиск в ширину. Используйте функцию GetNeighbours для получения всех соседей, в которые можно перейти.
  63. // Функция должна возвращать направление — смещение относительно source, то есть вектор длины 1.
  64. //return Point.Empty;
  65. }
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment