53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
|
# pacmanAgents.py
|
||
|
# ---------------
|
||
|
# Licensing Information: You are free to use or extend these projects for
|
||
|
# educational purposes provided that (1) you do not distribute or publish
|
||
|
# solutions, (2) you retain this notice, and (3) you provide clear
|
||
|
# attribution to UC Berkeley, including a link to http://ai.berkeley.edu.
|
||
|
#
|
||
|
# Attribution Information: The Pacman AI projects were developed at UC Berkeley.
|
||
|
# The core projects and autograders were primarily created by John DeNero
|
||
|
# (denero@cs.berkeley.edu) and Dan Klein (klein@cs.berkeley.edu).
|
||
|
# Student side autograding was added by Brad Miller, Nick Hay, and
|
||
|
# Pieter Abbeel (pabbeel@cs.berkeley.edu).
|
||
|
|
||
|
|
||
|
from pacman import Directions
|
||
|
from game import Agent
|
||
|
import random
|
||
|
import game
|
||
|
import util
|
||
|
|
||
|
class LeftTurnAgent(game.Agent):
|
||
|
"An agent that turns left at every opportunity"
|
||
|
|
||
|
def getAction(self, state):
|
||
|
legal = state.getLegalPacmanActions()
|
||
|
current = state.getPacmanState().configuration.direction
|
||
|
if current == Directions.STOP: current = Directions.NORTH
|
||
|
left = Directions.LEFT[current]
|
||
|
if left in legal: return left
|
||
|
if current in legal: return current
|
||
|
if Directions.RIGHT[current] in legal: return Directions.RIGHT[current]
|
||
|
if Directions.LEFT[left] in legal: return Directions.LEFT[left]
|
||
|
return Directions.STOP
|
||
|
|
||
|
class GreedyAgent(Agent):
|
||
|
def __init__(self, evalFn="scoreEvaluation"):
|
||
|
self.evaluationFunction = util.lookup(evalFn, globals())
|
||
|
assert self.evaluationFunction != None
|
||
|
|
||
|
def getAction(self, state):
|
||
|
# Generate candidate actions
|
||
|
legal = state.getLegalPacmanActions()
|
||
|
if Directions.STOP in legal: legal.remove(Directions.STOP)
|
||
|
|
||
|
successors = [(state.generateSuccessor(0, action), action) for action in legal]
|
||
|
scored = [(self.evaluationFunction(state), action) for state, action in successors]
|
||
|
bestScore = max(scored)[0]
|
||
|
bestActions = [pair[1] for pair in scored if pair[0] == bestScore]
|
||
|
return random.choice(bestActions)
|
||
|
|
||
|
def scoreEvaluation(state):
|
||
|
return state.getScore()
|