Пример #1
0
    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
Пример #2
0
    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