Exemplo n.º 1
0
 private int calcTotalThreat(Destination a) {
   Routes routes = Routes.getInstance();
   int threat = 0;
   for (Destination dest : routes.getNeighbors(a)) {
     ArrayList<Route> fooRouteBundle = routes.getRoutes(dest, a);
     for (Route fooRoute : fooRouteBundle) {
       if (!(fooRoute.getOwner() instanceof TTRPlayer)) {
         threat++;
       }
     }
   }
   return threat;
 }
Exemplo n.º 2
0
  /**
   * Determines the routes comprising the shortest path between two cities
   *
   * @param to city 1
   * @param from city 2
   * @param considerMadeMoves should the algorithm look to see if all routes have been claimed
   * @return the list of routes in the shortest path between destinations, nested ArrayList allows
   *     access to multiple existant routes between adjacent cities, returns null if no route is
   *     found
   */
  public ArrayList<ArrayList<Route>> getPath(
      Destination to, Destination from, boolean considerMadeMoves) {
    Routes routes = Routes.getInstance();
    PriorityQueue<PathNode> openList = new PriorityQueue<PathNode>(1, new PathNodeComparator());
    ArrayList<PathNode> closedList = new ArrayList<PathNode>();

    // get origin onto PQ
    PathNode origin = new PathNode(from);
    openList.add(origin);

    while (!openList.isEmpty()) {
      PathNode node = openList.poll();
      // int fooCost = routes.shortestPathcost(from, node.getCurr());
      // System.out.println("Were looking at "+node.getCurr().name()+". The previous node is
      // "+node.getPrev()+". The distance from start is "+ node.getDistToStart()+ ". The best
      // possible cost to here is "+fooCost);
      // deal with the node having already been closed
      if (closedList.contains(node)) {
        // System.out.println("Skipping already searched city "+node.getCurr().name()+"\n");
        continue;
      }
      // deal with this being the end node
      if (node.getCurr() == to) {
        // push all the routes into a stack
        Stack<ArrayList<Route>> pathBuilder = new Stack<ArrayList<Route>>();
        boolean pathNotComplete = true;
        PathNode curr = node;
        PathNode prev = null;
        for (PathNode fooNode : closedList) {
          if (fooNode.getCurr() == curr.getPrev()) {
            prev = fooNode;
            break;
          }
        }
        while (pathNotComplete) {
          // if its the start node
          Destination currName = curr.getCurr();
          Destination prevName = prev.getCurr();
          if (currName == from) {
            break;
          }
          // System.out.println("Building path from "+currName.name()+ " to "+prevName.name());
          pathBuilder.push(routes.getRoutes(currName, prevName));
          curr = prev;
          for (PathNode fooNode : closedList) {
            if (fooNode.getCurr() == curr.getPrev()) {
              prev = fooNode;
            }
          }
        }

        // System.out.println("Building route");
        ArrayList<ArrayList<Route>> orderedRoute = new ArrayList<ArrayList<Route>>();
        while (!pathBuilder.isEmpty()) {
          orderedRoute.add(pathBuilder.pop());
        }
        return orderedRoute;
      }
      // add all values to the pq
      for (Destination dest : routes.getNeighbors(node.getCurr())) {
        // prevents looping
        boolean isClosed = false;
        for (PathNode fooNode : closedList) {
          if (dest == fooNode.getCurr()) {
            // System.out.println(dest.name()+" Node is closed");
            isClosed = true;
            break;
          }
        }
        Route thisRoute = routes.getRoutes(dest, node.getCurr()).get(0);
        if (considerMadeMoves) {
          if (!isClosed
              && (!routes.isRouteClaimed(thisRoute)
                  || (thisRoute.getOwner() instanceof TTRPlayer))) {
            // get cost of this node
            int cost = thisRoute.getCost();
            // System.out.println("Adding "+dest.name()+" to be searched. Its previous node is
            // "+node.getCurr()+". Its cost is "+cost+". Its total cost is
            // "+(cost+node.getDistToStart())+" Its owner is "+thisRoute.getOwner());
            PathNode nextNode = new PathNode(dest, node.getCurr(), node.getDistToStart() + cost);
            openList.add(nextNode);
          } else {
            // System.out.println("Not searching "+dest.name()+" because it is already closed.");
          }
        } else {
          if (!isClosed) {
            // get cost of this node
            int cost = thisRoute.getCost();
            // System.out.println("Adding "+dest.name()+" to be searched. Its previous node is
            // "+node.getCurr()+". Its cost is "+cost+". Its total cost is
            // "+(cost+node.getDistToStart()));
            PathNode nextNode = new PathNode(dest, node.getCurr(), node.getDistToStart() + cost);
            openList.add(nextNode);
          } else {
            // System.out.println("Not searching "+dest.name()+" because it is already closed.");
          }
        }
      }
      // close node
      closedList.add(node);
      // System.out.println("Closing: "+ node.getCurr()+"\n");
    }
    return null;
  }