private Move askAlienForMove() {

                // Get all possible nodes for the alien
                final Set<Edge> allPossibleEdges = Ship.getAll(ship.getAlienNode().getCoordinates(), ship, connectedShip);

                // Get the adjacent nodes for the predator
                final Set<Edge> adjacentEdges = ship.getAlienNode().getAdjacent();

                // Determine whether or not the alien is at the scanner
                boolean alienAtScanner = ship.getAlienNode().equals(scannerNode);

                // If the Alien picks up the scanner, indicate that he should
                // have it
                // for the rest of the game
                if (alienAtScanner) {
                        alienHasScanner = true;
                        scannerNode = null;

                        // prints to status bar
                        uigui.changeScannerStatus("  The Alien has the Scanner");
                }

                // By default the Alien does not get updates from the
                // scanner
                Ship scannerShip = null;

                // If the alien has the scanner, then give him a copy of
                // the ship
                if (alienHasScanner) {
                        // Make a copy of the ship
                        scannerShip = Engine.ship.clone();
                }

                // By default, the predator is not within sight
                boolean isPredatorWithinSight = false;

                // By default, the alien does not know which direction
                // the predator
                // is in
                Edge directionOfPredator = null;

                // Get the shortest path between the alien and predator
                List<Edge> shortestPath = Engine.ship.getPath(ship.getAlienNode(), ship.getPredatorNode());

                // If there is a path between the alien and the predator
                // and it is
                // within the alien's sensing distance
                if (shortestPath != null && shortestPath.size() <= ALIEN_SENSE) {

                        // Indicate that the predator is in sight of the
                        // Alien
                        isPredatorWithinSight = true;

                        // Indicate the shortest path to the predator
                        directionOfPredator = shortestPath.iterator().next();

                        // prints to the status bar
                        uigui.changeASenseStatus("  The Alien senses the Predator");
                }
                else {
                        uigui.changeASenseStatus("");
                }

                // By default, the predator is not on the other side of the wall
                Edge wall = null;

                // For every possible edge surrounding the alien
                for (Edge e : allPossibleEdges) {

                        // If the predator is on the other side of the edge
                        if (Node.getOtherNode(e, ship.getAlienNode()).equals(ship.getPredatorNode())) {

                                // prints to the status bar
                                uigui.changeASenseStatus("  The Alien senses the Predator");

                                // If the edge is a wall or a closed door
                                if ((e.getEdgeState() == null || e.getEdgeState() == EdgeState.CLOSED)) {
                                        // Store the edge
                                        wall = e;
                                }
                        }
                }

                // Info for the alien
                Info info = new Info(ship.getAlienNode(), allPossibleEdges, adjacentEdges, false, alienAtScanner, scannerShip, isPredatorWithinSight,
                                directionOfPredator, wall);

                // Get the alien's move
                Move alienMove = alien.nextMove(info);

                // Validate the alien's move
                if (validateMove(alienMove, allPossibleEdges, true, PRINT_DIAGNOSTIC)) {

                        // If valid, make the move
                        return alienMove;
                }
                else {
                        // Otherwise indicate a pass
                        return new Move(adjacentEdges.iterator().next(), false, false);
                }

        }