/** * 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; }
@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; }
/** * 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"); }
/** 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); }
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); }
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(); }