Fixed networking!
[progcomp2013.git] / qchess / src / player.py
index b3f0eb7..99d3616 100644 (file)
@@ -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
@@ -16,6 +16,9 @@ class Player():
                self.colour = colour
 
        def update(self, result):
+               return result
+
+       def reset_board(self, s):
                pass
 
 # Player that runs from another process
@@ -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
@@ -72,7 +76,7 @@ class ExternalAgent(Player):
        def update(self, result):
                #print "Update " + str(result) + " called for AgentPlayer"
                self.send_message(result)
-
+               return result
 
        def get_move(self):
                
@@ -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)
@@ -150,6 +162,7 @@ class HumanPlayer(Player):
                        pass
                else:
                        sys.stdout.write(result + "\n") 
+               return result
 
 
 # Default internal player (makes random moves)
@@ -165,7 +178,11 @@ class InternalAgent(Player):
        def update(self, result):
                
                self.board.update(result)
-               self.board.verify()
+               #self.board.verify()
+               return result
+
+       def reset_board(self, s):
+               self.board.reset_board(s)
 
        def quit(self, final_result):
                pass
@@ -203,8 +220,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 +235,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 +252,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)
 

UCC git Repository :: git.ucc.asn.au