@Override
 public void rob() {
   // try and place robber on sheep hex where aiPlayer doesn't have a building itself
   try {
     for (HexLocation sheepHex : sheepHexes) {
       ArrayList<Integer> potentialVictims = getPlayers(sheepHex);
       if (potentialVictims.size() > 0
           && !potentialVictims.contains(getPlayerIndex())
           && !game.getMap().getRobber().getLocation().equals(sheepHex)) {
         game.rob(getPlayerIndex(), potentialVictims.get(0), sheepHex);
         return;
       }
     }
     // this is if the aiPlayer has a building on every single sheep hex.  Now it will just pick a
     // random hex where it doesn't have a building
     java.util.Map<HexLocation, Hex> hexes = game.getMap().getHexes();
     for (java.util.Map.Entry<HexLocation, Hex> entry : hexes.entrySet()) {
       if (entry.getValue().getType() != HexType.WATER) {
         ArrayList<Integer> potentialVictims = getPlayers(entry.getKey());
         if (potentialVictims.size() != 0
             && !potentialVictims.contains(getPlayerIndex())
             && !game.getMap().getRobber().getLocation().equals(entry.getKey())) {
           // this robs a random person on a random hex where the aiPlayer doesn't have a building
           // there
           int victim = potentialVictims.remove(0);
           game.rob(getPlayerIndex(), victim, entry.getKey());
           return;
         }
       }
     }
     // this is if the aiPlayer has a building on every hex that has a building.  Now it will just
     // not rob anyone
     for (java.util.Map.Entry<HexLocation, Hex> entry : hexes.entrySet()) {
       if (entry.getValue().getType() != HexType.WATER) {
         if (!game.getMap().getRobber().getLocation().equals(entry.getKey())) {
           game.rob(getPlayerIndex(), getPlayerIndex(), entry.getKey());
           return;
         }
       }
     }
   } catch (Exception | InvalidTypeException e) {
     e.printStackTrace();
   }
 }
 private void playRoadBuilder()
     throws InvalidPlayerException, PlayerExistsException, InvalidLocationException,
         StructureException, DevCardException {
   EdgeLocation firstRoad = null;
   EdgeLocation secondRoad = null;
   for (EdgeLocation edge : sheepEdges) {
     if (game.canPlaceRoadBuildingCard(getPlayerIndex(), edge)) {
       if (firstRoad == null && secondRoad == null) {
         firstRoad = edge;
       } else if (firstRoad != null && secondRoad == null) {
         secondRoad = edge;
         game.useRoadBuilder(getPlayerIndex(), firstRoad, secondRoad);
         return;
       }
     }
   }
   java.util.Map<EdgeLocation, Edge> edges = game.getMap().getEdges();
   for (java.util.Map.Entry<EdgeLocation, Edge> entry : edges.entrySet()) {
     if (game.canPlaceRoadBuildingCard(getPlayerIndex(), entry.getKey())) {
       if (firstRoad == null && secondRoad == null) {
         firstRoad = entry.getKey();
       } else if (firstRoad != null && secondRoad == null) {
         secondRoad = entry.getKey();
         game.useRoadBuilder(getPlayerIndex(), firstRoad, secondRoad);
         return;
       }
     }
   }
 }
 private void playCity()
     throws InvalidLocationException, InvalidPlayerException, PlayerExistsException,
         StructureException {
   for (VertexLocation vertex : sheepVertices) {
     if (game.canBuildCity(getPlayerIndex(), vertex)) {
       game.buildCity(getPlayerIndex(), vertex);
       return;
     }
   }
   java.util.Map<VertexLocation, Vertex> vertices = game.getMap().getVertices();
   for (java.util.Map.Entry<VertexLocation, Vertex> entry : vertices.entrySet()) {
     if (game.canBuildCity(getPlayerIndex(), entry.getKey())) {
       game.buildCity(getPlayerIndex(), entry.getKey());
       return;
     }
   }
 }
 private void playRoad()
     throws InvalidLocationException, InvalidPlayerException, PlayerExistsException,
         StructureException {
   for (EdgeLocation edge : sheepEdges) {
     if (game.canBuildRoad(getPlayerIndex(), edge)) {
       game.buildRoad(getPlayerIndex(), edge);
       return;
     }
   }
   java.util.Map<EdgeLocation, Edge> edges = game.getMap().getEdges();
   for (java.util.Map.Entry<EdgeLocation, Edge> entry : edges.entrySet()) {
     if (game.canBuildRoad(getPlayerIndex(), entry.getKey())) {
       game.buildRoad(getPlayerIndex(), entry.getKey());
       return;
     }
   }
 }
 private void setSheepLocations() {
   sheepHexes = new ArrayList<>();
   sheepVertices = new ArrayList<>();
   sheepEdges = new ArrayList<>();
   java.util.Map<HexLocation, Hex> hexes = game.getMap().getHexes();
   for (java.util.Map.Entry<HexLocation, Hex> entry : hexes.entrySet()) {
     if (entry.getValue().getType() == HexType.SHEEP) {
       sheepHexes.add(entry.getKey());
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.NorthWest));
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.NorthEast));
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.East));
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.SouthEast));
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.SouthWest));
       sheepVertices.add(new VertexLocation(entry.getKey(), VertexDirection.West));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.NorthWest));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.North));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.NorthEast));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.SouthEast));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.South));
       sheepEdges.add(new EdgeLocation(entry.getKey(), EdgeDirection.SouthWest));
     }
   }
 }