def connect(self, host, port, teamname, version='15.5'): """ Gives us a connection to the server as one player on a team. This immediately connects the agent to the server and starts receiving and parsing the information it sends. """ # if already connected, raise an error since user may have wanted to # connect again to a different server. if self.__connected: msg = "Cannot connect while already connected, disconnect first." raise sp_exceptions.AgentConnectionStateError(msg) # the pipe through which all of our communication takes place self.__sock = sock.Socket(host, port) # our models of the world and our body self.wm = WorldModel(handler.ActionHandler(self.__sock, self.teamname)) # set the team name of the world model to the given name self.wm.teamname = teamname # handles all messages received from the server self.msg_handler = handler.MessageHandler(self.wm, self.teamname) self.action_handler = handler.ActionHandler(port, self.teamname) # set up our threaded message receiving system self.__parsing = True # tell thread that we're currently running self.__msg_thread = threading.Thread(target=self.__message_loop, name="message_loop") self.__msg_thread.daemon = True # dies when parent thread dies # start processing received messages. this will catch the initial server # response and all subsequent communication. self.__msg_thread.start() # send the init message and allow the message handler to handle further # responses. init_address = self.__sock.address init_msg = "( init %s ( version %s ) )" self.__sock.send(init_msg % (teamname, version)) print(init_msg) # wait until the socket receives a response from the server and gets its # assigned port. while self.__sock.address == init_address: time.sleep(0.0001) # create our thinking thread. this will perform the actions necessary # to play a game of robo-soccer. self.__thinking = False self.__think_thread = threading.Thread(target=self.__think_loop, name="think_loop") self.__think_thread.daemon = True # set connected state. done last to prevent state inconsistency if # something goes wrong beforehand. self.__connected = True
def play(self): """ Kicks off the thread that does the agent's thinking, allowing it to play during the game. Throws an exception if called while the agent is already playing. """ # ensure we're connected before doing anything if not self.__connected: msg = "Must be connected to a server to begin play." raise sp_exceptions.AgentConnectionStateError(msg) # throw exception if called while thread is already running if self.__thinking: raise sp_exceptions.AgentAlreadyPlayingError( "Agent is already playing.") # run the method that sets up the agent's persistant variables self.setup_environment() # tell the thread that it should be running, then start it self.__thinking = True self.__should_think_on_data = True self.__think_thread.start()