X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=qchess%2Fsrc%2Fgame.py;h=73adfe75cb078c1c87bc08b231ce2b2cacc2db6f;hb=52068b63d49f02f4455a4415356ecfe38db72f59;hp=4eebc76af62acbee1f8113fa9f476383300ebc46;hpb=a6d91c8bb286fa91f9e2a56b304043ff48154322;p=progcomp2013.git diff --git a/qchess/src/game.py b/qchess/src/game.py index 4eebc76..73adfe7 100644 --- a/qchess/src/game.py +++ b/qchess/src/game.py @@ -5,7 +5,7 @@ # A thread that runs the game class GameThread(StoppableThread): - def __init__(self, board, players): + def __init__(self, board, players, server = True): StoppableThread.__init__(self) self.board = board self.players = players @@ -14,6 +14,10 @@ class GameThread(StoppableThread): self.lock = threading.RLock() #lock for access of self.state self.cond = threading.Condition() # conditional for some reason, I forgot self.final_result = "" + self.server = server + + + @@ -24,22 +28,35 @@ class GameThread(StoppableThread): for p in self.players: with self.lock: - if isinstance(p, NetworkSender): - self.state["turn"] = p.base_player # "turn" contains the player who's turn it is - else: - self.state["turn"] = p - #try: - if True: + self.state["turn"] = p.base_player() + try: + #if True: [x,y] = p.select() # Player selects a square if self.stopped(): + #debug("Quitting in select") break - - - - result = self.board.select(x, y, colour = p.colour) + if isinstance(p, NetworkPlayer): + if p.network.server == True: + result = self.board.select(x, y, colour = p.colour) + else: + result = None + + else: + result = self.board.select(x, y, colour = p.colour) + + result = p.update(result) + if self.stopped(): + break for p2 in self.players: + if p2 == p: + continue p2.update(result) # Inform players of what happened + if self.stopped(): + break + + if self.stopped(): + break log(result) @@ -63,21 +80,43 @@ 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") break - - result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2) - log(result) - - self.board.update_move(x, y, x2, y2) + if isinstance(p, NetworkPlayer): + if p.network.server == True: + result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2) + self.board.update_move(x, y, x2, y2) + else: + result = None + + else: + result = str(x) + " " + str(y) + " -> " + str(x2) + " " + str(y2) + self.board.update_move(x, y, x2, y2) + + result = p.update(result) + if self.stopped(): + break for p2 in self.players: + if p2 == p: + continue p2.update(result) # Inform players of what happened + if self.stopped(): + break + + if self.stopped(): + break + + + + log(result) + @@ -93,28 +132,31 @@ class GameThread(StoppableThread): graphics.state["dest"] = None graphics.state["moves"] = None - # Commented out exception stuff for now, because it makes it impossible to tell if I made an IndentationError somewhere - # except Exception,e: - # result = e.message - # #sys.stderr.write(result + "\n") - # - # self.stop() - # with self.lock: - # self.final_result = self.state["turn"].colour + " " + e.message - - end = self.board.end_condition() - if end != None: - with self.lock: - if end == "DRAW": - self.final_result = self.state["turn"].colour + " " + end - else: - self.final_result = end - self.stop() + + end = self.board.end_condition() + if end != None: + with self.lock: + if end == "DRAW": + self.final_result = self.state["turn"].colour + " " + end + else: + self.final_result = end + self.stop() - if self.stopped(): + if self.stopped(): + break + except Exception,e: + #if False: + result = e.message + sys.stderr.write("qchess.py exception: "+result + "\n") + + self.stop() + + with self.lock: + self.final_result = self.state["turn"].colour + " " + e.message break + for p2 in self.players: p2.quit(self.final_result)