====== Testing agents ======
===== Mock games =====
In order to test agents, you need to set up a "mock" game, place the agents in the situation you want to test, then run the game for a few rounds to see if they behave correctly. We wrote a module, ''testingTools'', that contains a function to set up a small-scale game.
def get_mock_game(layout_txt, agents, first_agent=0):
"""Set up a mock game with given layout and agents.
Input arguments:
layout_txt -- a string with the layout of the maze (see layout.py)
agents -- a list of instances of Agent , the agents that are going to play
the mock game
first_agent -- 0 is the red team starts, 1 otherwise
Return (layout, game)
layout -- an instance of layout.Layout, object representing the maze
game -- instance of game.Game, with which you can manipulate the game
"""
The game object can be manipulated using three methods:
- ''game._init_run()'': initialize the game, must be called to start the game
- ''game._one_game_step()'': run one step of the game; the first time this function is called, the agent with index 0 is moved; the second time, the agent with index 1; and so on until all agents are moved, and the agent with index 0 is moved again.
- ''game._end_run()'': end the game, can be called at the end of the game to clean up objects
===== Obtaining game states =====
In order to obtain the game state from the point of view of a particular agent, you should call ''game_state = game.state.makeObservation(agent_index)''. The returned game state is then equivalent to the one received by the agent with ID ''agent_index'' on its turn, including the masking of distant enemies. //Do not use ''game.state'' directly to request information about agents.// The information in ''game.state'' depends on the agent that is currently moving, and so direct requests to the object is prone to introduce bugs in the tests.
===== Example: GoEastAgent =====
Imagine you want to test an agent that always goes East:
import basic_agents
from game import Directions
class GoEastAgent(basic_agents.BasicAgent):
def choose_action(self, game_state):
return Directions.EAST
In order to do this, we draw the game maze using symbols for walls (%), food (.), and agents (1,2 represent different agents, odd for one team and even for the other).
import unittest
import basic_agents
from testingTools import get_mock_game
from goeast_agents import GoEastAgent
class GoEastTestCase(unittest.TestCase):
def test_east(self):
layout_txt = """%%%%%%%%
% 2%
% .%
%1 %
%%%%%%%%
"""
# BasicAgent does nothing by default
lt, game = get_mock_game(layout_txt, [GoEastAgent(0),
basic_agents.BasicAgent(1)])
game._init_run()
# test that the start position is correct (unnecessary in general)
game_state = game.state.makeObservation(0)
assert game_state.getAgentPosition(0) == (1,1)
game._one_game_step()
# test that the agent really moved east!
game_state = game.state.makeObservation(0)
assert game_state.getAgentPosition(0) == (2,1)
if __name__=='__main__':
unittest.main()