Esempio n. 1
0
 def getLegalActions(state, ghostIndex):
     """
     Ghosts cannot stop, and cannot turn around unless they
     reach a dead end, but can turn 90 degrees at intersections.
     """
     conf = state.getGhostState(ghostIndex).configuration
     possibleActions = Actions.getPossibleActions(conf, state.data.layout.walls)
     reverse = Actions.reverseDirection(conf.direction)
     if Directions.STOP in possibleActions:
         possibleActions.remove(Directions.STOP)
     if reverse in possibleActions and len(possibleActions) > 1:
         possibleActions.remove(reverse)
     return possibleActions
Esempio n. 2
0
    def get_successors(self, state):
        """
    Returns successor states, the actions they require, and a cost of 1.

     As noted in search.py:
         For a given state, this should return a list of triples,
     (successor, action, stepCost), where 'successor' is a
     successor to the current state, 'action' is the action
     required to get there, and 'stepCost' is the incremental
     cost of expanding to that successor
    """

        successors = []
        for action in [
                Directions.NORTH, Directions.SOUTH, Directions.EAST,
                Directions.WEST
        ]:
            x, y = state
            dx, dy = Actions.directionToVector(action)
            nextx, nexty = int(x + dx), int(y + dy)
            if not self.walls[nextx][nexty]:
                nextState = (nextx, nexty)
                cost = self.costFn(nextState)
                successors.append((nextState, action, cost))

        # Bookkeeping for display purposes
        self._expanded += 1
        if state not in self._visited:
            self._visited[state] = True
            self._visitedlist.append(state)

        return successors
Esempio n. 3
0
  def getDistribution( self, state ):
    # Read variables from state
    ghostState = state.getGhostState( self.index )
    legalActions = state.getLegalActions( self.index )
    pos = state.getGhostPosition( self.index )
    isScared = ghostState.scaredTimer > 0
    
    speed = 1
    if isScared: speed = 0.5
    
    actionVectors = [Actions.directionToVector( a, speed ) for a in legalActions]
    newPositions = [( pos[0]+a[0], pos[1]+a[1] ) for a in actionVectors]
    pacmanPosition = state.getPacmanPosition()

    # Select best actions given the state
    distancesToPacman = [manhattanDistance( pos, pacmanPosition ) for pos in newPositions]
    if isScared:
      bestScore = max( distancesToPacman )
      bestProb = self.prob_scaredFlee
    else:
      bestScore = min( distancesToPacman )
      bestProb = self.prob_attack
    bestActions = [action for action, distance in zip( legalActions, distancesToPacman ) if distance == bestScore]
    
    # Construct distribution
    dist = util.Counter()
    for a in bestActions: dist[a] = bestProb / len(bestActions)
    for a in legalActions: dist[a] += ( 1-bestProb ) / len(legalActions)
    dist.normalize()
    return dist
Esempio n. 4
0
    def applyAction(state, action, ghostIndex):

        legal = GhostRules.getLegalActions(state, ghostIndex)
        if action not in legal:
            raise Exception("Illegal ghost action " + str(action))

        ghostState = state.data.agentStates[ghostIndex]
        speed = GhostRules.GHOST_SPEED
        if ghostState.scaredTimer > 0: speed /= 2.0
        vector = Actions.directionToVector(action, speed)
        ghostState.configuration = ghostState.configuration.generateSuccessor(vector)
Esempio n. 5
0
 def getCostOfActions(self, actions):
     """
 Returns the cost of a particular sequence of actions.  If those actions
 include an illegal move, return 999999.  This is implemented for you.
 """
     if actions == None: return 999999
     x, y = self.startingPosition
     for action in actions:
         dx, dy = Actions.directionToVector(action)
         x, y = int(x + dx), int(y + dy)
         if self.walls[x][y]: return 999999
     return len(actions)
Esempio n. 6
0
 def getCostOfActions(self, actions):
     """Returns the cost of a particular sequence of actions.  If those actions
 include an illegal move, return 999999"""
     x, y = self.getStartState()[0]
     cost = 0
     for action in actions:
         # figure out the next state and see whether it's legal
         dx, dy = Actions.directionToVector(action)
         x, y = int(x + dx), int(y + dy)
         if self.walls[x][y]:
             return 999999
         cost += 1
     return cost
Esempio n. 7
0
 def getSuccessors(self, state):
   "Returns successor states, the actions they require, and a cost of 1."
   successors = []
   self._expanded += 1
   for direction in [Directions.NORTH, Directions.SOUTH, Directions.EAST, Directions.WEST]:
     x,y = state[0]
     dx, dy = Actions.directionToVector(direction)
     nextx, nexty = int(x + dx), int(y + dy)
     if not self.walls[nextx][nexty]:
       nextFood = state[1].copy()
       nextFood[nextx][nexty] = False
       successors.append( ( ((nextx, nexty), nextFood), direction, 1) )
   return successors
Esempio n. 8
0
 def get_cost_of_actions(self, actions):
     """
 Returns the cost of a particular sequence of actions.  If those actions
 include an illegal move, return 999999
 """
     if actions == None: return 999999
     x, y = self.get_start_state()
     cost = 0
     for action in actions:
         # Check figure out the next state and see whether its' legal
         dx, dy = Actions.directionToVector(action)
         x, y = int(x + dx), int(y + dy)
         if self.walls[x][y]: return 999999
         cost += self.costFn((x, y))
     return cost
Esempio n. 9
0
    def applyAction(state, action):
        """
        Edits the state to reflect the results of the action.
        """
        legal = PacmanRules.getLegalActions(state)
        if action not in legal:
            raise Exception("Illegal action " + str(action))

        pacmanState = state.data.agentStates[0]

        # Update Configuration
        vector = Actions.directionToVector(action, PacmanRules.PACMAN_SPEED)
        pacmanState.configuration = pacmanState.configuration.generateSuccessor(vector)

        # Eat
        next = pacmanState.configuration.getPosition()
        nearest = nearestPoint(next)
        if manhattanDistance(nearest, next) <= 0.5:
            # Remove food
            PacmanRules.consume(nearest, state)
Esempio n. 10
0
 def getLegalActions(state):
     """
     Returns a list of possible actions.
     """
     return Actions.getPossibleActions(state.getPacmanState().configuration, state.data.layout.walls)