Пример #1
0
 //returns available node which is closest to goal (using manhattan distance)
 public FieldNode getClosestNext(FieldNode node, FieldNode goal)
 {
     //if the goal is a neighbor
     if (Math.Abs(node.x - goal.x) == 1 || Math.Abs(node.y - goal.y) == 1)
     {
         //if the only item in the goal space is the hiding spot, return it
         if (map[goal.x, goal.y] == 1)
             return goal;
         //otherwise, need to find a new hiding spot
         else
             throw new SpotTakenException();
     }
     int x = node.x;
     int y = node.y;
     if (x >= sizeX || y >= sizeY || x < 0 || y < 0)
         return null;
     //go through all neighbors and find the one which is closest to the hiding spot, using Manhattan distancea
     FieldNode best = null;
     double bestVal = 300;
     if (y + 1 < sizeY && map[x, y + 1] <= 0)
     {
         FieldNode next = new FieldNode(x, y + 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x + 1 < sizeX && y + 1 < sizeY && map[x + 1, y + 1] <= 0)
     {
         FieldNode next = new FieldNode(x + 1, y + 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x + 1 < sizeX && map[x + 1, y] <= 0)
     {
         FieldNode next = new FieldNode(x + 1, y);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x + 1 < sizeX && y - 1 >= 0 && map[x + 1, y - 1] <= 0)
     {
         FieldNode next = new FieldNode(x + 1, y - 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (y - 1 >= 0 && map[x, y - 1] <= 0)
     {
         FieldNode next = new FieldNode(x, y - 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x - 1 >= 0 && y - 1 >= 0 && map[x - 1, y - 1] <= 0)
     {
         FieldNode next = new FieldNode(x - 1, y - 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x - 1 >= 0 && map[x - 1, y] <= 0)
     {
         FieldNode next = new FieldNode(x - 1, y);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     if (x - 1 >= 0 && y + 1 < sizeY && map[x - 1, y + 1] <= 0)
     {
         FieldNode next = new FieldNode(x - 1, y + 1);
         double val = next.EuclideanDist(goal);
         if (val < bestVal)
         {
             bestVal = val;
             best = next;
         }
     }
     return best;
 }