X-Git-Url: https://git.ucc.asn.au/?p=progcomp2013.git;a=blobdiff_plain;f=qchess%2Fsrc%2Fplayer.py;h=d0f6cfb8d8c66c16e989666759b933283cb97f4c;hp=b3f0eb70b641beb9c01e9f9a8f75f3f7f801557e;hb=13106edfbf2a97cdb79148ea43067d8f31fac083;hpb=877034f05346e24fdf822f6e6149ad50d891f030 diff --git a/qchess/src/player.py b/qchess/src/player.py index b3f0eb7..d0f6cfb 100644 --- a/qchess/src/player.py +++ b/qchess/src/player.py @@ -1,7 +1,7 @@ import subprocess import select import platform - +import re agent_timeout = -1.0 # Timeout in seconds for AI players to make moves # WARNING: Won't work for windows based operating systems @@ -18,6 +18,9 @@ class Player(): def update(self, result): pass + def reset_board(self, s): + pass + # Player that runs from another process class ExternalAgent(Player): @@ -50,7 +53,7 @@ class ExternalAgent(Player): if self.p.stdout in ready: #sys.stderr.write("Reading from " + str(self.p) + " 's stdout...\n") try: - result = self.p.stdout.readline().strip("\r\n") + result = self.p.stdout.readline().strip(" \t\r\n") #sys.stderr.write("Read \'" + result + "\' from " + str(self.p) + "\n") return result except: # Exception, e: @@ -64,7 +67,8 @@ class ExternalAgent(Player): line = self.get_response() try: - result = map(int, line.split(" ")) + m = re.match("\s*(\d+)\s+(\d+)\s*", line) + result = map(int, [m.group(1), m.group(2)]) except: raise Exception("GIBBERISH \"" + str(line) + "\"") return result @@ -80,11 +84,19 @@ class ExternalAgent(Player): line = self.get_response() try: - result = map(int, line.split(" ")) + m = re.match("\s*(\d+)\s+(\d+)\s*", line) + result = map(int, [m.group(1), m.group(2)]) + except: raise Exception("GIBBERISH \"" + str(line) + "\"") return result + def reset_board(self, s): + self.send_message("BOARD") + for line in s.split("\n"): + self.send_message(line.strip(" \r\n")) + self.send_message("END BOARD") + def quit(self, final_result): try: self.send_message("QUIT " + final_result) @@ -167,6 +179,9 @@ class InternalAgent(Player): self.board.update(result) self.board.verify() + def reset_board(self, s): + self.board.reset_board(s) + def quit(self, final_result): pass @@ -203,8 +218,6 @@ class AgentRandom(InternalAgent): def run_agent(agent): #sys.stderr.write(sys.argv[0] + " : Running agent " + str(agent) + "\n") - colour = sys.stdin.readline().strip(" \r\n") - agent.colour = colour while True: line = sys.stdin.readline().strip(" \r\n") if line == "SELECTION?": @@ -220,6 +233,14 @@ def run_agent(agent): #sys.stderr.write(sys.argv[0] + " : Quitting\n") agent.quit(" ".join(line.split(" ")[1:])) # Quits the game break + elif line.split(" ")[0] == "BOARD": + s = "" + line = sys.stdin.readline().strip(" \r\n") + while line != "END BOARD": + s += line + "\n" + line = sys.stdin.readline().strip(" \r\n") + agent.board.reset_board(s) + else: agent.update(line) # Updates agent.board return 0 @@ -229,7 +250,7 @@ def run_agent(agent): class ExternalWrapper(ExternalAgent): def __init__(self, agent): - run = "python -u -c \"import sys;import os;from qchess import *;agent = " + agent.__class__.__name__ + "('" + agent.name + "','"+agent.colour+"');sys.exit(run_agent(agent))\"" + run = "python -u -c \"import sys;import os;from qchess import *;agent = " + agent.__class__.__name__ + "('" + agent.name + "','"+agent.colour+"');sys.stdin.readline();sys.exit(run_agent(agent))\"" # str(run) ExternalAgent.__init__(self, run, agent.colour)