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 gamegame._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
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.
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()