//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; }