/**
   * Checks if is crowded.
   *
   * @param game the game
   * @return true, if is crowded
   */
  private boolean isCrowded(Game game) {
    GHOST[] ghosts = GHOST.values();
    float distance = 0;

    for (int i = 0; i < ghosts.length - 1; i++)
      for (int j = i + 1; j < ghosts.length; j++)
        distance +=
            game.getShortestPathDistance(
                game.getGhostCurrentNodeIndex(ghosts[i]), game.getGhostCurrentNodeIndex(ghosts[j]));

    return (distance / 6) < CROWDED_DISTANCE ? true : false;
  }
示例#2
0
  @Override
  public MOVE getMove(Game game, long timeDue) {
    int current = game.getPacmanCurrentNodeIndex();

    // Strategy 1: if any non-edible ghost is too close (less than MIN_DISTANCE), run away
    for (GHOST ghost : GHOST.values())
      if (game.getGhostEdibleTime(ghost) == 0 && game.getGhostLairTime(ghost) == 0)
        if (game.getShortestPathDistance(current, game.getGhostCurrentNodeIndex(ghost))
            < MIN_DISTANCE)
          return game.getNextMoveAwayFromTarget(
              game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(ghost), DM.PATH);

    // Strategy 2: find the nearest edible ghost and go after them
    int minDistance = Integer.MAX_VALUE;
    GHOST minGhost = null;

    for (GHOST ghost : GHOST.values())
      if (game.getGhostEdibleTime(ghost) > 0) {
        int distance = game.getShortestPathDistance(current, game.getGhostCurrentNodeIndex(ghost));

        if (distance < minDistance) {
          minDistance = distance;
          minGhost = ghost;
        }
      }

    if (minGhost != null) // we found an edible ghost
    return game.getNextMoveTowardsTarget(
          game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(minGhost), DM.PATH);

    // Strategy 3: go after the pills and power pills
    int[] pills = game.getPillIndices();
    int[] powerPills = game.getPowerPillIndices();

    ArrayList<Integer> targets = new ArrayList<Integer>();

    for (int i = 0; i < pills.length; i++) // check which pills are available	
    if (game.isPillStillAvailable(i)) targets.add(pills[i]);

    for (int i = 0; i < powerPills.length; i++) // check with power pills are available
    if (game.isPowerPillStillAvailable(i)) targets.add(powerPills[i]);

    int[] targetsArray = new int[targets.size()]; // convert from ArrayList to array

    for (int i = 0; i < targetsArray.length; i++) targetsArray[i] = targets.get(i);

    // return the next direction once the closest target has been identified
    return game.getNextMoveTowardsTarget(
        current, game.getClosestNodeIndexFromNodeIndex(current, targetsArray, DM.PATH), DM.PATH);
  }
  /* (non-Javadoc)
   * @see pacman.controllers.Controller#getMove(pacman.game.Game, long)
   */
  public EnumMap<GHOST, MOVE> getMove(Game game, long timeDue) {
    int pacmanIndex = game.getPacmanCurrentNodeIndex();

    for (GHOST ghost : GHOST.values()) {
      if (game.doesGhostRequireAction(ghost)) {
        int currentIndex = game.getGhostCurrentNodeIndex(ghost);

        // if ghosts are all in close proximity and not near Ms Pac-Man, disperse
        if (isCrowded(game) && !closeToMsPacMan(game, currentIndex))
          myMoves.put(ghost, getRetreatActions(game, ghost)); // go towards the power pill locations
        // if edible or Ms Pac-Man is close to power pill, move away from Ms Pac-Man
        else if (game.getGhostEdibleTime(ghost) > 0 || closeToPower(game))
          myMoves.put(
              ghost,
              game.getApproximateNextMoveAwayFromTarget(
                  currentIndex,
                  pacmanIndex,
                  game.getGhostLastMoveMade(ghost),
                  DM.PATH)); // move away from ms pacman
        // else go towards Ms Pac-Man
        else
          myMoves.put(
              ghost,
              game.getApproximateNextMoveTowardsTarget(
                  currentIndex,
                  pacmanIndex,
                  game.getGhostLastMoveMade(ghost),
                  DM.PATH)); // go towards ms pacman
      }
    }

    return myMoves;
  }
示例#4
0
  /**
   * Changes the state. Checks if there is active power pills nearby, if true go eat. Checks if
   * there still is a ghost close, if true stay in state Defaults to eat pill state
   *
   * @return returns change state. Returns null if it remains in this state
   */
  public State changeState(Game game, long timeDue) {
    int pacmanPos = game.getPacmanCurrentNodeIndex();
    // Check for power pill
    int closestPowerPill = 0;
    int closestDistPowerPill = -1;
    if (game.getNumberOfActivePowerPills() > 0) {
      for (int i : game.getActivePowerPillsIndices()) {
        int temp = game.getShortestPathDistance(pacmanPos, i);
        if (closestDistPowerPill > temp || closestDistPowerPill == -1) {
          closestPowerPill = i;
          closestDistPowerPill = temp;
        }
      }
    }
    if (game.getNumberOfActivePowerPills() > 0
        && game.getShortestPathDistance(pacmanPos, closestPowerPill) < mach.DistToPowerPill) {
      // System.out.println("(RunFromGhost)Try power pill");
      return (State) mach.dataStruc.get("moveNearestPowerPill");
    }
    // Check for ghost distance

    for (GHOST ghost : GHOST.values()) {
      if (game.getGhostLairTime(ghost) > 0 || game.isGhostEdible(ghost)) {
        continue;
      }
      if (game.getShortestPathDistance(pacmanPos, game.getGhostCurrentNodeIndex(ghost))
          < mach.DistFromNonEdible) {
        mach.dataStruc.put("ghost", ghost);
        return null;
      }
    }
    // System.out.println("(RunFromGhost) Try nearest pill");
    return (State) mach.dataStruc.get("moveNearestPill");
  }
示例#5
0
 /** runs from current ghost */
 @Override
 public MOVE run(Game game, long timeDue) {
   return game.getNextMoveAwayFromTarget(
       game.getPacmanCurrentNodeIndex(),
       game.getGhostCurrentNodeIndex((GHOST) mach.dataStruc.get("ghost")),
       DM.PATH);
 }
示例#6
0
 private double averageGhostDistance(Game state) {
   double sumDistance = 0;
   for (Constants.GHOST g : Constants.GHOST.values()) {
     double d =
         state.getManhattanDistance(
             state.getPacmanCurrentNodeIndex(), state.getGhostCurrentNodeIndex(g));
     sumDistance += d;
   }
   return (sumDistance / Constants.GHOST.values().length);
 }
  /* (non-Javadoc)
   * @see pacman.controllers.Controller#getMove(pacman.game.Game, long)
   */
  public EnumMap<GHOST, MOVE> getMove(Game game, long timeDue) {
    myMoves.clear();

    int targetNode = game.getPacmanCurrentNodeIndex();

    if (game.doesGhostRequireAction(GHOST.BLINKY))
      myMoves.put(
          GHOST.BLINKY,
          game.getApproximateNextMoveTowardsTarget(
              game.getGhostCurrentNodeIndex(GHOST.BLINKY),
              targetNode,
              game.getGhostLastMoveMade(GHOST.BLINKY),
              DM.PATH));

    if (game.doesGhostRequireAction(GHOST.INKY))
      myMoves.put(
          GHOST.INKY,
          game.getApproximateNextMoveTowardsTarget(
              game.getGhostCurrentNodeIndex(GHOST.INKY),
              targetNode,
              game.getGhostLastMoveMade(GHOST.INKY),
              DM.MANHATTAN));

    if (game.doesGhostRequireAction(GHOST.PINKY))
      myMoves.put(
          GHOST.PINKY,
          game.getApproximateNextMoveTowardsTarget(
              game.getGhostCurrentNodeIndex(GHOST.PINKY),
              targetNode,
              game.getGhostLastMoveMade(GHOST.PINKY),
              DM.EUCLID));

    if (game.doesGhostRequireAction(GHOST.SUE))
      myMoves.put(GHOST.SUE, moves[rnd.nextInt(moves.length)]);

    return myMoves;
  }
  /**
   * Gets the retreat actions.
   *
   * @param game the game
   * @param ghost the ghost
   * @return the retreat actions
   */
  private MOVE getRetreatActions(Game game, GHOST ghost) {
    int currentIndex = game.getGhostCurrentNodeIndex(ghost);
    int pacManIndex = game.getPacmanCurrentNodeIndex();

    if (game.getGhostEdibleTime(ghost) == 0
        && game.getShortestPathDistance(currentIndex, pacManIndex) < PACMAN_DISTANCE)
      return game.getApproximateNextMoveTowardsTarget(
          currentIndex, pacManIndex, game.getGhostLastMoveMade(ghost), DM.PATH);
    else
      return game.getApproximateNextMoveTowardsTarget(
          currentIndex,
          game.getPowerPillIndices()[cornerAllocation.get(ghost)],
          game.getGhostLastMoveMade(ghost),
          DM.PATH);
  }
示例#9
0
  public DataTuple(Game game, MOVE move) {
    if (move == MOVE.NEUTRAL) {
      move = game.getPacmanLastMoveMade();
    }

    this.DirectionChosen = move;

    this.mazeIndex = game.getMazeIndex();
    this.currentLevel = game.getCurrentLevel();
    this.pacmanPosition = game.getPacmanCurrentNodeIndex();
    this.pacmanLivesLeft = game.getPacmanNumberOfLivesRemaining();
    this.currentScore = game.getScore();
    this.totalGameTime = game.getTotalTime();
    this.currentLevelTime = game.getCurrentLevelTime();
    this.numOfPillsLeft = game.getNumberOfActivePills();
    this.numOfPowerPillsLeft = game.getNumberOfActivePowerPills();

    if (game.getGhostLairTime(GHOST.BLINKY) == 0) {
      this.isBlinkyEdible = game.isGhostEdible(GHOST.BLINKY);
      this.blinkyDist =
          game.getShortestPathDistance(
              game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.BLINKY));
    }

    if (game.getGhostLairTime(GHOST.INKY) == 0) {
      this.isInkyEdible = game.isGhostEdible(GHOST.INKY);
      this.inkyDist =
          game.getShortestPathDistance(
              game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.INKY));
    }

    if (game.getGhostLairTime(GHOST.PINKY) == 0) {
      this.isPinkyEdible = game.isGhostEdible(GHOST.PINKY);
      this.pinkyDist =
          game.getShortestPathDistance(
              game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.PINKY));
    }

    if (game.getGhostLairTime(GHOST.SUE) == 0) {
      this.isSueEdible = game.isGhostEdible(GHOST.SUE);
      this.sueDist =
          game.getShortestPathDistance(
              game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.SUE));
    }

    this.blinkyDir =
        game.getNextMoveTowardsTarget(
            game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.BLINKY), DM.PATH);
    this.inkyDir =
        game.getNextMoveTowardsTarget(
            game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.INKY), DM.PATH);
    this.pinkyDir =
        game.getNextMoveTowardsTarget(
            game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.PINKY), DM.PATH);
    this.sueDir =
        game.getNextMoveTowardsTarget(
            game.getPacmanCurrentNodeIndex(), game.getGhostCurrentNodeIndex(GHOST.SUE), DM.PATH);

    this.numberOfNodesInLevel = game.getNumberOfNodes();
    this.numberOfTotalPillsInLevel = game.getNumberOfPills();
    this.numberOfTotalPowerPillsInLevel = game.getNumberOfPowerPills();
  }