Usage¶
Create a controller¶
Create a class that inherits from the pyrts.server.Server class,
in, pass the ID of the player (0 or 1) and implement the
get_action() method. It is also
a good idea to instantiate your controller and call the
start() method in the main function of
your module, so that you can run this controller as a standalone script later.
from pyrts.server import Server
class AI(server):
def __init__(self, player_id):
super(AI, self).__init__(player_id)
def get_action(state):
# In here implement the algorithm that takes the state and creates the action
return [ .. list of actions]
if __name__ == '__main__':
ai = AI(0)
ai.start()
The method must return a list of actions, one action for each unit in the
game. The list is a standard Python list and each action is a Python dict
objects containing the unit ID and another dict containing the action and
its parameters. Action names and codes are listed in
pyrts.server.Action. Action parameters, which are mostly directions to
apply the actions, are listed in pyrts.server.Direction.
[
{
"unitID": 0 # the unit that you wish to control
"unitAction": {
'type': 1 # the type of action (this is defined in the unit type table)
'parameters': 0 # the parameters for the action (this is defined in the unit type table)
}
},
{
# more actions for different unit IDs
}
]
For every game tick, the get_action() method is called. A list of
actions is available in pyrts.Action. A list of directions (the only
argument taken by some of the actions) is available in
pyrts.Direction.
If there are no actions to send at a given time step, then an empty list
[] should be sent. If actions are sent to a subset of the units, the
other units must receive Action.NONE. Units that are still
performing actions from previous turns must also receive Action.NONE
(a list of these units is returned by the get_busy_units() method
inherited by your controller).
Examples¶
Example controllers can be found in the examples directory.
Currently the following algorithms are implemented:
random_actions.py: perform random actions for all unitsrandom_bot_movement.py: a random walk for the single worker that starts
Run your controller¶
Start your AI class in Python. You should see some logging that looks like this:
DEBUG:RTSServer:Socket created
DEBUG:RTSServer:Socket bind complete
DEBUG:RTSServer:Socket now listening
Once you see this logging, you can start a microRTS environment and it should connect to the control server.
Start microRTS in Client Mode¶
Since your controller is going to have the role of a server, microRTS
must be started in Client Mode. In order to do that, change the contents
of
config.properties
so that launch_mode=CLIENT. Make sure all other network parameters
are kept as default:
server_address=127.0.0.1
server_port=9898
serialization_type=2
Start microRTS. By now, you should see your Python agent interact with the game.
Starting MicroRTS automatically (experimental)¶
MicroRTS can be started automatically by python-microRTS. This is useful in case you wish to run multiple games in a loop. In order to do that:
the
MICRORTSPATHenvironment variable must be set, containing the path to the directory that has the necessary libraries to run MicroRTS, as well as MicroRTS.classfiles.a properties file must be provided (like this one), containing the necessary information to start MicroRTS.
Start your controller with the following parameters (edit them as necessary):
ai.start(start_microrts=True, microrts_properties='my_file.properties')
The following command in spawned using the subprocess package:
java -cp "${MICRORTSPATH}/lib/*:${MICRORTSPATH}/bin" rts.MicroRTS -f <microrts properties file>