コード例 #1
0
    def run(self):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind((socket.gethostname(), SERVER_PORT))
        server_socket.listen()

        server_socket.settimeout(1.5)

        while len(self.clients) == 0 or len(self.not_ready) > 0:
            try:
                client = Client(*server_socket.accept())

                self.not_ready[client.uuid] = True
                self.clients.append(client)

                client_thread = Thread(
                    target=self.client_thread_wait_for_ready,
                    args=(client, ),
                    daemon=True)
                client_thread.start()

                # logging -- when a connection happens
                print("New connection: " + str(len(self.clients)))
            except socket.timeout:
                continue

        # minor cleanup
        server_socket.close()

        # play the blackjack game:
        consecutive_passes = 0
        players_at_or_above_max = 0

        # send message to all players announcing start
        self.broadcast("The game is beginning.\n")

        # main game loop: infinite cycle through clients, until exit conditions are met
        for player in cycle(self.clients):
            # ask client for move
            player.client_socket.send(b"TAKE or PASS")

            # receive move: if TAKE, give player a card and update players min score
            data = player.client_socket.recv(128)
            data = data.decode("utf-8")

            # move will be broadcast to all players
            move = "Player " + str(player.uuid) + " has: "

            if data == "PASS":
                consecutive_passes += 1

                move += " opted to PASS.\n"
            elif data == "TAKE":
                card = Card.random()
                player.cards.append(card)
                player.client_socket.send(
                    bytes("Your card: " + str(card) + ".\n", "utf-8"))

                move += " TAKEN the card " + str(card) + "\n"

                # check if this player's min sum of card values is at or above 21
                if Card.min_value(player.cards) >= 21:
                    players_at_or_above_max += 1

                # reset consecutive passes
                consecutive_passes = 0
            else:
                # invalid request
                pass

            # send move broadcast
            self.broadcast(move, dont_send_to=player)

            # check for game over conditions
            if consecutive_passes == len(
                    self.clients) or players_at_or_above_max == len(
                        self.clients):
                break

        # decide winner and send to all clients
        # todo
        message = "It's over! "
        if consecutive_passes == len(self.clients):
            message = "Game is over because each player has passed consecutively.\n"

            # todo get winner

        elif players_at_or_above_max == len(self.clients):
            message = "Game is over because every player is either at or above 21 score.\n"

            # todo get winners

        # send final message
        for player in self.clients:
            player.client_socket.send(bytes(message, "utf-8"))

        # cleanup the server
        for player in self.clients:
            player.client_socket.close()
コード例 #2
0
    def run(self):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.bind((socket.gethostname(), SERVER_PORT))
        server_socket.listen()

        server_socket.settimeout(1.5)

        while len(self.clients) == 0 or len(self.not_ready) > 0:
            try:
                client = Client(*server_socket.accept())

                self.not_ready[client.uuid] = True
                self.clients.append(client)

                client_thread = Thread(target=self.client_thread_wait_for_ready, args=(client,), daemon=True)
                client_thread.start()

                # logging -- when a connection happens
                print("New connection: " + str(len(self.clients)))
            except socket.timeout:
                continue

        # minor cleanup
        server_socket.close()

        # play the blackjack game:
        consecutive_passes = 0
        players_at_or_above_max = 0

        # send message to all players announcing start
        self.broadcast("The game is beginning.\n")

        # main game loop: infinite cycle through clients, until exit conditions are met
        for player in cycle(self.clients):
            # ask client for move
            player.client_socket.send(b"TAKE or PASS")

            # receive move: if TAKE, give player a card and update players min score
            data = player.client_socket.recv(128)
            data = data.decode("utf-8")

            # move will be broadcast to all players
            move = "Player " + str(player.uuid) + " has: "

            if data == "PASS":
                consecutive_passes += 1

                move += " opted to PASS.\n"
            elif data == "TAKE":
                card = Card.random()
                player.cards.append(card)
                player.client_socket.send(
                    bytes("Your card: " + str(card) + ".\n", "utf-8")
                )

                move += " TAKEN the card " + str(card) + "\n"

                # check if this player's min sum of card values is at or above 21
                if Card.min_value(player.cards) >= 21:
                    players_at_or_above_max += 1

                # reset consecutive passes
                consecutive_passes = 0
            else:
                # invalid request
                pass

            # send move broadcast
            self.broadcast(move, dont_send_to=player)

            # check for game over conditions
            if consecutive_passes == len(self.clients) or players_at_or_above_max == len(self.clients):
                break

        # decide winner and send to all clients
        # todo
        message = "It's over! "
        if consecutive_passes == len(self.clients):
            message = "Game is over because each player has passed consecutively.\n"

            # todo get winner

        elif players_at_or_above_max == len(self.clients):
            message = "Game is over because every player is either at or above 21 score.\n"

            # todo get winners

        # send final message
        for player in self.clients:
            player.client_socket.send(bytes(message, "utf-8"))

        # cleanup the server
        for player in self.clients:
            player.client_socket.close()