From 5d8f204c6bde7cd0f4534e0904d20ad26df4ef5e Mon Sep 17 00:00:00 2001 From: Sam Moore Date: Thu, 16 May 2013 23:55:12 +0800 Subject: [PATCH] Work on cgi bin stuff --- qchess/qchess.py | 77 +++++++++++++++++++++++++++++++----- qchess/src/player.py | 45 +++++++++++++++++++++ web/qchess.cgi | 53 +++++++++++++++++++++++++ web/web_qchess/qchess.py | 1 - web/web_qchess/web_qchess.py | 16 -------- 5 files changed, 165 insertions(+), 27 deletions(-) create mode 100644 web/qchess.cgi delete mode 120000 web/web_qchess/qchess.py delete mode 100644 web/web_qchess/web_qchess.py diff --git a/qchess/qchess.py b/qchess/qchess.py index 8a3610b..0e03777 100755 --- a/qchess/qchess.py +++ b/qchess/qchess.py @@ -432,6 +432,12 @@ class Board(): return result def prob_is_type(self, p, state): + if p.current_type != 0: + if state == p.current_type: + return 1.0 + else: + return 0.0 + prob = 0.5 result = 0 for i in range(len(p.types)): @@ -587,6 +593,8 @@ class Board(): def on_board(self, x, y): return (x >= 0 and x < w) and (y >= 0 and y < h) + + # Pushes a move temporarily def push_move(self, piece, x, y): target = self.grid[x][y] @@ -612,7 +620,7 @@ class Board(): self.grid[x2][y2] = target for p in self.pieces["white"] + self.pieces["black"]: - p.possible_moves = None + p.possible_moves = None # --- board.py --- # import subprocess @@ -644,6 +652,51 @@ class Player(): def base_player(self): return self +# Player that runs through a fifo +class FifoPlayer(Player): + def __init__(self, name, colour): + Player.__init__(self, name, colour) + os.mkfifo(self.name+".in") + os.mkfifo(self.name+".out") + + + + + + def update(self, result): + sys.stderr.write("update fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write(result +"\n") + self.fifo_out.close() + return result + + def select(self): + sys.stderr.write("select fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write("SELECT?\n") + self.fifo_out.close() + self.fifo_in = open(self.name+".in", "r") + s = map(int, self.fifo_in.readline().strip(" \r\n").split(" ")) + self.fifo_in.close() + return s + + def get_move(self): + sys.stderr.write("get_move fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write("MOVE?\n") + self.fifo_out.close() + self.fifo_in = open(self.name+".in", "r") + s = map(int, self.fifo_in.readline().strip(" \r\n").split(" ")) + self.fifo_in.close() + return s + + def quit(self, result): + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write(result + "\n") + self.fifo_out.close() + os.remove(self.name+".in") + os.remove(self.name+".out") + # Player that runs from another process class ExternalAgent(Player): @@ -886,10 +939,9 @@ class ExternalWrapper(ExternalAgent): class AgentBishop(AgentRandom): # Inherits from AgentRandom (in qchess) - def __init__(self, name, colour): + def __init__(self, name, colour,value={"pawn" : 1, "bishop" : 3, "knight" : 3, "rook" : 5, "queen" : 9, "king" : 100, "unknown" : 2}): InternalAgent.__init__(self, name, colour) - self.value = {"pawn" : 1, "bishop" : 3, "knight" : 3, "rook" : 5, "queen" : 9, "king" : 100, "unknown" : 4} - + self.value = value self.aggression = 2.0 # Multiplier for scoring due to aggressive actions self.defence = 1.0 # Multiplier for scoring due to defensive actions @@ -1599,10 +1651,10 @@ class GameThread(StoppableThread): graphics.state["dest"] = None continue - try: - [x2,y2] = p.get_move() # Player selects a destination - except: - self.stop() + #try: + [x2,y2] = p.get_move() # Player selects a destination + #except: + # self.stop() if self.stopped(): #debug("Quitting in get_move") @@ -2531,7 +2583,11 @@ def make_player(name, colour): sys.stderr.write(sys.argv[0] + " : Can't find an internal agent matching \"" + s[1] + "\"\n") sys.stderr.write(sys.argv[0] + " : Choices are: " + str(map(lambda e : e[0], internal_agents)) + "\n") return None - + if s[0] == "fifo": + if len(s) > 1: + return FifoPlayer(s[1], colour) + else: + return FifoPlayer(str(os.getpid())+"."+colour, colour) else: return ExternalAgent(name, colour) @@ -2715,6 +2771,7 @@ def main(argv): server_addr = graphics.SelectServer() if server_addr != None: + pygame.quit() # Time to say goodbye if server_addr == True: return dedicated_server() else: @@ -2834,4 +2891,4 @@ if __name__ == "__main__": # --- main.py --- # -# EOF - created from make on Sat Apr 20 12:19:31 WST 2013 +# EOF - created from make on Thu May 16 23:54:28 WST 2013 diff --git a/qchess/src/player.py b/qchess/src/player.py index 53edb44..fb6cbcd 100644 --- a/qchess/src/player.py +++ b/qchess/src/player.py @@ -27,6 +27,51 @@ class Player(): def base_player(self): return self +# Player that runs through a fifo +class FifoPlayer(Player): + def __init__(self, name, colour): + Player.__init__(self, name, colour) + os.mkfifo(self.name+".in") + os.mkfifo(self.name+".out") + + + + + + def update(self, result): + sys.stderr.write("update fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write(result +"\n") + self.fifo_out.close() + return result + + def select(self): + sys.stderr.write("select fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write("SELECT?\n") + self.fifo_out.close() + self.fifo_in = open(self.name+".in", "r") + s = map(int, self.fifo_in.readline().strip(" \r\n").split(" ")) + self.fifo_in.close() + return s + + def get_move(self): + sys.stderr.write("get_move fifo called\n") + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write("MOVE?\n") + self.fifo_out.close() + self.fifo_in = open(self.name+".in", "r") + s = map(int, self.fifo_in.readline().strip(" \r\n").split(" ")) + self.fifo_in.close() + return s + + def quit(self, result): + self.fifo_out = open(self.name+".out", "w") + self.fifo_out.write(result + "\n") + self.fifo_out.close() + os.remove(self.name+".in") + os.remove(self.name+".out") + # Player that runs from another process class ExternalAgent(Player): diff --git a/web/qchess.cgi b/web/qchess.cgi new file mode 100644 index 0000000..83a847b --- /dev/null +++ b/web/qchess.cgi @@ -0,0 +1,53 @@ +#!/usr/bin/python + +# CGI wrapper to qchess + +import sys +import os + +import cgi +import subprocess + +def main(argv): + form = cgi.FieldStorage() + client = cgi.escape(os.environ["REMOTE_ADDR"]) + + try: + with open(client): pass + except IOError: + args = ["python", "../qchess/qchess.py", "--no-graphics", "@fifo:"+client, "@internal:AgentBishop"] + subprocess.Popen(args) + form["mode"] = "query" + + if form["mode"] == "response": + x = int(form["x"]) + y = int(form["y"]) + fifo_out = open(client+".in", "w") + fifo_out.write("%d %d\n" % (x, y)) + fifo_out.close() + form["mode"] = "query" + + + if form["mode"] == "query": + fifo_in = open(client+".out", "r") + s = fifo_in.readline().strip(" \r\n") + while s != "SELECT?" and s != "MOVE?" and s.split(" ")[0] != "white" and s.split(" ")[0] != "black": + print s + s = fifo_in.readline().strip(" \r\n") + print s + fifo_in.close() + form["mode"] = "response" + + if s == "quit": + os.remove(client) + + + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main(sys.argv)) + except, e: + print "Exception: ", e + sys.exit(1) diff --git a/web/web_qchess/qchess.py b/web/web_qchess/qchess.py deleted file mode 120000 index 35c6d6e..0000000 --- a/web/web_qchess/qchess.py +++ /dev/null @@ -1 +0,0 @@ -../../qchess/qchess.py \ No newline at end of file diff --git a/web/web_qchess/web_qchess.py b/web/web_qchess/web_qchess.py deleted file mode 100644 index c0513c1..0000000 --- a/web/web_qchess/web_qchess.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python - -import sys -import os -import cgi - - -if __name__ == "__main__": - form = cgi.FieldStorage() - x = int(form.getvalue("x")) - y = int(form.getvalue("y")) - - print "Content-type:text/html\r\n\r\n" - print "\n\nWebbified QChess\n\n" - print "

x = %d\ty = %d <\p>" % (x, y) - print "\n" \ No newline at end of file -- 2.20.1