Contest: Pacman Capture the Flag
The course contest involves a multi-player capture-the-flag variant of Pacman, where agents control both Pacman and ghosts in coordinated team-based strategies. Your team will try to eat the food on the far side of the map, while defending the food on your home side.
Academic Dishonesty: While we won't grade contests, we still expect you not to falsely represent your work. Please don't let us down.
Rules of Pacman Capture the FlagLayout: The Pacman map is now divided into two halves: blue (right) and red (left). Red agents (which all have even indices) must defend the red food while trying to eat the blue food. When on the red side, a red agent is a ghost. When crossing into enemy territory, the agent becomes a Pacman.
Scoring: When a Pacman eats a food dot, the food is permanently removed and one point is scored for that Pacman's team. Red team scores are positive, while Blue team scores are negative.
Eating Pacman: When a Pacman is eaten by an opposing ghost, the Pacman returns to its starting position (as a ghost). No points are awarded for eating an opponent.
Power capsules: If Pacman eats a power capsule, agents on the opposing team become "scared" for the next 40 moves, or until they are eaten and respawn, whichever comes sooner. Agents that are "scared" are susceptible while in the form of ghosts (i.e. while on their own team's side) to being eaten by Pacman. Specifically, if Pacman collides with a "scared" ghost, Pacman is unaffected and the ghost respawns at its starting position (no longer in the "scared" state).
Observations: Agents can only observe an opponent's configuration (position and direction) if they or their teammate is within 5 squares (Manhattan distance). In addition, an agent always gets a noisy distance reading for each agent on the board, which can be used to approximately locate unobserved opponents.
Winning: A game ends when one team eats all but two of the opponents' dots. Games are also limited to 1200 agent moves (300 moves per each of the four agents). If this move limit is reached, whichever team has eaten the most food wins. If the score is zero (i.e., tied) this is recorded as a tie game.
Computation Time: We will run your submissions on the WashU cluster (like all your assignments). Each agent has 1 second to return each action. Each move which does not return within one second will incur a warning. After three warnings, or any single move taking more than 3 seconds, the game is forfeited. There will be an initial start-up allowance of 15 seconds (use the
Getting StartedBy default, you can run a game with the simple
A wealth of options are available to you:
python capture.py --helpThere are four slots for agents, where agents 0 and 2 are always on the red team, and 1 and 3 are on the blue team. Agents are created by agent factories (one for Red, one for Blue). See the section on designing agents for a description of the agents invoked above. The only team that we provide is the
python capture.py -r baselineTeam -b baselineTeamwhich specifies that the red team
python capture.py --keys0The arrow keys control your character, which will change from ghost to Pacman when crossing the center line.
LayoutsBy default, all games are run on the
All layouts are symmetric, and the team that moves first is randomly chosen.
Designing AgentsUnlike project 2, an agent now has the more complex job of trading off offense versus defense and effectively functioning as both a ghost and a Pacman in a team setting. Furthermore, the limited information provided to your agent will likely necessitate some probabilistic tracking (like project 4). Finally, the added time limit of computation introduces new challenges.
Baseline Team: To kickstart your agent design, we have provided you with a team of two baseline agents, defined in
Finally, you can access the list of noisy distance observations via
Distance Calculation: To facilitate agent development, we provide code in
To get started designing your own agent, we recommend subclassing the
def getFood(self, gameState): """ Returns the food you're meant to eat. This is in the form of a matrix where m[x][y]=true if there is food you can eat (based on your team) in that square. """ def getFoodYouAreDefending(self, gameState): """ Returns the food you're meant to protect (i.e., that your opponent is supposed to eat). This is in the form of a matrix where m[x][y]=true if there is food at (x,y) that your opponent can eat. """ def getOpponents(self, gameState): """ Returns agent indices of your opponents. This is the list of the numbers of the agents (e.g., red might be "1,3") """ def getTeam(self, gameState): """ Returns agent indices of your team. This is the list of the numbers of the agents (e.g., red might be "1,3") """ def getScore(self, gameState): """ Returns how much you are beating the other team by in the form of a number that is the difference between your score and the opponents score. This number is negative if you're losing. """ def getMazeDistance(self, pos1, pos2): """ Returns the distance between two points; These are calculated using the provided distancer object. If distancer.getMazeDistances() has been called, then maze distances are available. Otherwise, this just returns Manhattan distance. """ def getPreviousObservation(self): """ Returns the GameState object corresponding to the last state this agent saw (the observed state of the game last time this agent moved - this may not include all of your opponent's agent locations exactly). """ def getCurrentObservation(self): """ Returns the GameState object corresponding this agent's current observation (the observed state of the game - this may not include all of your opponent's agent locations exactly). """ def debugDraw(self, cells, color, clear=False): """ Draws a colored box on each of the cells you specify. If clear is True, will clear all old drawings before drawing on the specified cells. This is useful for debugging the locations that your code works with. color: list of RGB values between 0 and 1 (i.e. [1,0,0] for red) cells: list of game positions to draw on (i.e. [(20,5), (3,22)]) """
Restrictions: You are free to design any agent you want. However, you will need to respect the provided APIs if you want to participate in the tournaments. Agents which compute during the opponent's turn will be disqualified. In particular, any form of multi-threading is disallowed, because we have found it very hard to ensure that no computation takes place on the opponent's turn.
Warning: If one of your agents produces any stdout/stderr output during its games in the nightly tournaments, that output will be included in the contest results posted on the website. Additionally, in some cases a stack trace may be shown among this output in the event that one of your agents throws an exception. You should design your code in such a way that this does not expose any information that you wish to keep confidential.
To enter into the tournament, your team must be defined in a file whose filename matches your
Teams: You may work in teams of up to 5 people.
Scoring: Rankings are determined according to the points achieved in individual games. Currently any commit leads to a recomputation of the leaderboard. This might change if the computational burden becomes too high (in which case we will switch to nightly competitions).
This project is out of 20 points total. You will get fourteen points for beating the BASELINE program. You can earn extra points for winning certain matches. You get 2 points for beating the other benchmarks, Bender, Jarvis, Sonny and Random. You can also gain extra points for having the best agent on particular days.
If you have one of the top two agents on 12/1 (Monday after Thanksgiving) at 2:30pm, then you gain an extra point. If you have one of the top three agents on 12/4 (our last lecture) at 2:30pm, you also gain an extra point. Finally, if you have one of the top four agents at the end of the class, 2:30 on 12/17, then you gain one additional point.
It is possible to earn extra credit on this assignment, but note that points beyond 20 count half.
AcknowledgementsThanks to Barak Michener and Ed Karuna for providing improved graphics and debugging help.