+++ /dev/null
-import subprocess
-import select
-import platform
-
-agent_timeout = -1.0 # Timeout in seconds for AI players to make moves
- # WARNING: Won't work for windows based operating systems
-
-if platform.system() == "Windows":
- agent_timeout = -1 # Hence this
-
-# A player who can't play
-class Player():
- def __init__(self, name, colour):
- self.name = name
- self.colour = colour
-
-# Player that runs from another process
-class AgentPlayer(Player):
-
-
- def __init__(self, name, colour):
- Player.__init__(self, name, colour)
- self.p = subprocess.Popen(name, stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
-
- self.send_message(colour)
-
- def send_message(self, s):
- if agent_timeout > 0.0:
- ready = select.select([], [self.p.stdin], [], agent_timeout)[1]
- else:
- ready = [self.p.stdin]
- if self.p.stdin in ready:
- #print "Writing to p.stdin"
- try:
- self.p.stdin.write(s + "\n")
- except:
- raise Exception("UNRESPONSIVE")
- else:
- raise Exception("UNRESPONSIVE")
-
- def get_response(self):
- if agent_timeout > 0.0:
- ready = select.select([self.p.stdout], [], [], agent_timeout)[0]
- else:
- ready = [self.p.stdout]
- if self.p.stdout in ready:
- #print "Reading from p.stdout"
- try:
- return self.p.stdout.readline().strip("\r\n")
- except: # Exception, e:
- raise Exception("UNRESPONSIVE")
- else:
- raise Exception("UNRESPONSIVE")
-
- def select(self):
-
- self.send_message("SELECTION?")
- line = self.get_response()
-
- try:
- result = map(int, line.split(" "))
- except:
- raise Exception("GIBBERISH \"" + str(line) + "\"")
- return result
-
- def update(self, result):
- #print "Update " + str(result) + " called for AgentPlayer"
- self.send_message(result)
-
-
- def get_move(self):
-
- self.send_message("MOVE?")
- line = self.get_response()
-
- try:
- result = map(int, line.split(" "))
- except:
- raise Exception("GIBBERISH \"" + str(line) + "\"")
- return result
-
- def quit(self, final_result):
- try:
- self.send_message("QUIT " + final_result)
- except:
- self.p.kill()
-
-# So you want to be a player here?
-class HumanPlayer(Player):
- def __init__(self, name, colour):
- Player.__init__(self, name, colour)
-
- # Select your preferred account
- def select(self):
- if isinstance(graphics, GraphicsThread):
- # Basically, we let the graphics thread do some shit and then return that information to the game thread
- graphics.cond.acquire()
- # We wait for the graphics thread to select a piece
- while graphics.stopped() == False and graphics.state["select"] == None:
- graphics.cond.wait() # The difference between humans and machines is that humans sleep
- select = graphics.state["select"]
-
-
- graphics.cond.release()
- if graphics.stopped():
- return [-1,-1]
- return [select.x, select.y]
- else:
- # Since I don't display the board in this case, I'm not sure why I filled it in...
- while True:
- sys.stdout.write("SELECTION?\n")
- try:
- p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
- except:
- sys.stderr.write("ILLEGAL GIBBERISH\n")
- continue
- # It's your move captain
- def get_move(self):
- if isinstance(graphics, GraphicsThread):
- graphics.cond.acquire()
- while graphics.stopped() == False and graphics.state["dest"] == None:
- graphics.cond.wait()
- graphics.cond.release()
-
- return graphics.state["dest"]
- else:
-
- while True:
- sys.stdout.write("MOVE?\n")
- try:
- p = map(int, sys.stdin.readline().strip("\r\n ").split(" "))
- except:
- sys.stderr.write("ILLEGAL GIBBERISH\n")
- continue
-
- # Are you sure you want to quit?
- def quit(self, final_result):
- if graphics == None:
- sys.stdout.write("QUIT " + final_result + "\n")
-
- # Completely useless function
- def update(self, result):
- if isinstance(graphics, GraphicsThread):
- pass
- else:
- sys.stdout.write(result + "\n")
-
-
-# Player that makes random moves
-class AgentRandom(Player):
- def __init__(self, name, colour):
- Player.__init__(self, name, colour)
- self.choice = None
-
- self.board = Board(style = "agent")
-
- def select(self):
- while True:
- self.choice = self.board.pieces[self.colour][random.randint(0, len(self.board.pieces[self.colour])-1)]
- all_moves = []
- # Check that the piece has some possibility to move
- tmp = self.choice.current_type
- if tmp == "unknown": # For unknown pieces, try both types
- for t in self.choice.types:
- if t == "unknown":
- continue
- self.choice.current_type = t
- all_moves += self.board.possible_moves(self.choice)
- else:
- all_moves = self.board.possible_moves(self.choice)
- self.choice.current_type = tmp
- if len(all_moves) > 0:
- break
- return [self.choice.x, self.choice.y]
-
- def get_move(self):
- moves = self.board.possible_moves(self.choice)
- move = moves[random.randint(0, len(moves)-1)]
- return move
-
- def update(self, result):
- #sys.stderr.write(sys.argv[0] + " : Update board for AgentRandom\n")
- self.board.update(result)
- self.board.verify()
-
- def quit(self, final_result):
- pass