Example #1
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)
Example #2
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)
Example #3
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)
Example #4
0
    def applyAction(state, action, agentIndex):
        """
    Edits the state to reflect the results of the action.
    """
        legal = AgentRules.getLegalActions(state, agentIndex)
        if action not in legal:
            action = 'STOP'
        cost = Costs[action]
        state.data.scoreChange += -cost if state.isOnRedTeam(
            agentIndex) else cost

        if action == 'FROZEN' or action == 'STOP':
            return
        if action == 'FREEZE':
            agentState = state.data.agentStates[agentIndex]
            agentState.freezeTimer = 0
            position = agentState.configuration.getPosition()
            for index in range(state.getNumAgents()):
                if index == agentIndex:
                    continue
                otherAgentState = state.data.agentStates[index]
                otherPosition = otherAgentState.getPosition()
                if otherPosition != None and manhattanDistance(
                        otherPosition, position) <= 3:
                    otherAgentState.frozenTimer = FROZEN_TIME
        else:
            # Update Configuration
            agentState = state.data.agentStates[agentIndex]

            # Jump Cooldown
            if "Jump_" in action:
                agentState.jumpTimer = 0

            speed = 1.0
            # if agentState.isPacman: speed = 0.5
            vector = Actions.directionToVector(action, speed)
            oldConfig = agentState.configuration
            agentState.configuration = oldConfig.generateSuccessor(vector)

            # Eat
            next = agentState.configuration.getPosition()
            nearest = nearestPoint(next)

            if next == nearest:
                isRed = state.isOnRedTeam(agentIndex)
                # Change agent type
                agentState.isPacman = [
                    isRed, state.isRed(agentState.configuration)
                ].count(True) == 1
                # if he's no longer pacman, he's on his own side, so reset the num carrying timer
                #agentState.numCarrying *= int(agentState.isPacman)
                if agentState.numCarrying > 0 and not agentState.isPacman:
                    score = agentState.numCarrying if isRed else -1 * agentState.numCarrying
                    state.data.scoreChange += score

                    agentState.numReturned += agentState.numCarrying
                    agentState.numCarrying = 0

                    redCount = 0
                    blueCount = 0
                    for index in range(state.getNumAgents()):
                        agentState = state.data.agentStates[index]
                        if index in state.getRedTeamIndices():
                            redCount += agentState.numReturned
                        else:
                            blueCount += agentState.numReturned
                    if redCount >= (TOTAL_FOOD /
                                    2) - MIN_FOOD or blueCount >= (
                                        TOTAL_FOOD / 2) - MIN_FOOD:
                        state.data._win = True

            if agentState.isPacman and manhattanDistance(nearest, next) <= 0.9:
                AgentRules.consume(nearest, state,
                                   state.isOnRedTeam(agentIndex))