def run_game(self): #Set Player 2 client_socket = self.create_server(self.IP, self.port) self.remote_player = RemoteContractProxy(connection=client_socket) player2_name = self.remote_player.register() self.remote_player.receive_stone(StoneEnum.WHITE) #Set Player 1 player1_name = self.local_player.register() self.local_player.receive_stone(StoneEnum.BLACK) # Pass to Referee to start game go_ref = GoReferee(player1=self.local_player, player2=self.remote_player) connected = True valid_response = True # Play game while not go_ref.game_over and connected and valid_response: try: go_ref.referee_game() except socket_error: go_ref.game_over = True print("{} disconnected.".format( go_ref.players[go_ref.current_player].name)) connected = False go_ref.winner = get_other_type(go_ref.current_player) break except PointException: go_ref.game_over = True valid_response = False print("{} played an invalid move.".format( go_ref.players[go_ref.current_player].name)) go_ref.winner = get_other_type(go_ref.current_player) break if go_ref.broke_rules: print("{} broke the rules.".format( go_ref.players[go_ref.broke_rules].name)) if connected: winner = go_ref.get_winners() elif not connected: winner = [self.local_player.name] else: raise Exception("GO ADMIN: Game ended unexpectedly.") return winner
def run_game(self, player1, player2): go_ref = GoReferee(player1=player1, player2=player2) connected = True valid_response = True cheater = None # Distribute Stones Before Game player1_received = False try: player1.receive_stone(StoneEnum.BLACK) player1_received = True except: go_ref.winner = StoneEnum.WHITE cheater = player1.name connected = False cheater = player1.name print("Unsuccessful receive stone for {}.".format(cheater)) go_ref.winner = StoneEnum.WHITE if player1_received: try: player2.receive_stone(StoneEnum.WHITE) except: go_ref.winner = StoneEnum.BLACK cheater = player2.name connected = False cheater = player2.name print("Unsuccessful receive stone for {}.".format(cheater)) go_ref.winner = StoneEnum.BLACK # Referee game and check for cheating condition # - Game over via breaking the rules. # - Invalid responses during game. # - Disconnecting during game. while not go_ref.game_over and connected and valid_response: try: go_ref.referee_game() except OSError: go_ref.game_over = True connected = False cheater = go_ref.players[go_ref.current_player].name print("Player {} disconnected.".format(cheater)) go_ref.winner = get_other_type(go_ref.current_player) break except PointException: go_ref.game_over = True valid_response = False cheater = go_ref.players[go_ref.current_player].name print("Invalid response from player {}.".format(cheater)) go_ref.winner = get_other_type(go_ref.current_player) break if go_ref.broke_rules: cheater = go_ref.players[go_ref.broke_rules].name print("Player {} broke the rules.".format(cheater)) # Validate Game Over for both players if connected: #(go_ref.game_over and connected and valid_response) or not valid_response: if not player1.game_over([GAME_OVER]): cheater = player1.name print("Did not receive game_over from Player {}".format( player1.name)) go_ref.winner = StoneEnum.WHITE elif not player2.game_over([GAME_OVER]): cheater = player2.name print("Did not receive game_over from Player {}".format( player2.name)) go_ref.winner = StoneEnum.BLACK winner = go_ref.get_winners() # Randomly break ties if two winners if len(winner) == 1: return winner[0], cheater else: rand_idx = random.randint(0, 1) return winner[rand_idx], cheater