示例#1
0
def end_turn(server, clockwise=True):
    global current_player
    all_sockets = list(server.clients)
    for i, socket in enumerate(all_sockets):
        if socket == current_player.socket:
            if clockwise is True:
                if i + 1 >= len(all_sockets):
                    current_player = server.find_client_by_socket(
                        all_sockets[0])
                else:
                    current_player = server.find_client_by_socket(
                        all_sockets[i + 1])
            else:
                current_player = server.find_client_by_socket(all_sockets[i -
                                                                          1])
            server.send_message(
                server_data.Data(
                    content_type=SERV_BROADCAST,
                    content_data=
                    f'Discard Pile: Top Card - {discard_pile.get_top_card()}'))
            server.send_message(
                server_data.Data(
                    content_type=SERV_BROADCAST,
                    content_data=f'It is {current_player.name}\'s turn.'))
            return
示例#2
0
def on_connect(*params):
    socket = params[0]
    message = params[1]
    if game_started:
        server.close_socket(sock=socket)
        return
    if message is None:
        return
    temp_client = server.find_client_by_socket(socket)
    new_client = Player(temp_client.socket, temp_client.name)
    if new_client.name_set_flag:
        return
    new_name = message
    if message.lower() in [
            server.clients[client].name.lower() for client in server.clients
    ]:
        print(
            f"[{server.name}] A client tried to join with the same name as an existing client. "
            "A randomly generated name has been given instead.")
    else:
        new_client.name = new_name
    new_client.name_set_flag = True
    server.set_client(new_client)
    server.send_message(server_data.Data(
        content_type=SERV_MESSAGE, content_data=f'!setname {new_client.name}'),
                        sock=socket)
    server.send_message(server_data.Data(content_type=SERV_MESSAGE,
                                         content_data=f'!setserver'),
                        sock=socket)
    server.send_message(server_data.Data(
        content_type=SERV_MESSAGE, content_data=f'Hello {new_client.name}!'),
                        sock=socket)
    server.send_message(
        server_data.Data(content_type=SERV_BROADCAST,
                         content_data=f'{new_client.name} joined the server.'))
示例#3
0
def on_disconnect(*params):
    global game_started
    socket = params[0]
    server.send_message(
        server_data.Data(
            content_type=SERV_BROADCAST,
            content_data=
            f"Client has disconnected: {server.find_client_by_socket(socket).name}({socket.getpeername()})"
        ))
    server.send_message(server_data.Data(content_type=SERV_MESSAGE,
                                         content_data='!quit'),
                        sock=socket)
    if game_started:
        if len(server.clients) <= 2:
            game.end_flag = True
            server.send_message(
                server_data.Data(
                    content_type=SERV_BROADCAST,
                    content_data=
                    "The game has been shutdown as there are too few players to continue playing."
                ))
        elif game.current_player.socket == socket:
            game.end_turn(server)
    game_started = False
    server.close_socket(socket)
示例#4
0
def on_player_play_card(*params):
    socket = params[0]
    try:
        card_index = int(params[1])
    except TypeError:
        return
    global game_started
    if game_started:
        if game.current_player.socket == socket:
            my_card = None
            for i, card in enumerate(game.current_player.hand):
                # print(f"ITERATING HAND - Card({card.color}:{card.value})")
                if i == card_index:
                    my_card = card
                    # print(f"FOUND CARD - Card({card.color}:{card.value})")
            if my_card is None:
                return
            if my_card.color == game.discard_pile.get_top_card(
            ).color or my_card.value == game.discard_pile.get_top_card().value:
                # print(f"CARD PLAYED - Card({my_card.color}:{my_card.value})")
                removed_card = game.current_player.remove_from_hand(my_card)
                game.discard_pile.add_to_top(removed_card)
                server.send_message(
                    server_data.Data(
                        content_type=SERV_BROADCAST,
                        content_data=
                        f'{game.current_player.name} played ({my_card.color}:{my_card.value})'
                    ))
                game.end_turn(server)
示例#5
0
def on_view_cards(*params):
    socket = params[0]
    client = server.find_client_by_socket(sock=socket)
    if client:
        if client.hand_size() == 0:
            server.send_message(server_data.Data(
                content_type=SERV_MESSAGE,
                content_data=f'{client.name} has no cards on hand.'),
                                sock=socket)
            # server.outputs.append(socket)
            return
        for i, card in enumerate(client.hand.deck):
            server.send_message(server_data.Data(
                content_type=SERV_MESSAGE,
                content_data=f'[{i}]({card.color}:{card.value})'),
                                sock=socket)
示例#6
0
def game_loop(server):
    global current_player, game_deck, discard_pile, registered_cards

    register_cards()
    game_deck = Deck()
    discard_pile = Deck()
    game_deck.generate_default_deck(
        num_of_players=len(server.clients),
        card_definitions_file='../definitions/cards.json')
    print(f"Deck Size: {game_deck.size}")
    server.send_message(
        server_data.Data(content_type=SERV_MESSAGE,
                         content_data=f'THE GAME HAS STARTED!',
                         client=server.name))
    for client in server.clients:
        while server.clients[client].hand_size() < 7:
            card = game_deck.draw()
            server.clients[client].add_to_hand(card)
            server.send_message(server_data.Data(
                content_type=SERV_MESSAGE,
                content_data=
                f'Given {server.clients[client].name}: {card.get_json()}',
                client=server.name),
                                sock=server.clients[client].socket)
            print(f'Cards left in deck: {game_deck.size}')

    # Draw first card
    discard_pile.add_to_top(game_deck.draw())
    print(f"Chosen Card - {discard_pile.get_top_card()}")
    server.send_message(
        server_data.Data(
            content_type=SERV_BROADCAST,
            content_data=
            f'Discard Pile: Top Card - {discard_pile.get_top_card()}'))

    # Get first player
    current_player = random.choice(list(server.clients.values()))
    print(f"First Player - {current_player.name}")
    server.send_message(
        server_data.Data(
            content_type=SERV_BROADCAST,
            content_data=f'The first player is {current_player.name}'))

    while not end_flag:
        time.sleep(1)
    clear_game(server)
示例#7
0
def on_get_clients(*params):
    socket = params[0]
    all_clients = [server.clients[client].name for client in server.clients]
    server.send_message(server_data.Data(
        content_type=SERV_MESSAGE,
        content_data=
        f"All Clients ({len(server.clients)}) -  {', '.join(all_clients)}"),
                        sock=socket)
示例#8
0
def on_message(*params):
    socket = params[0]
    message = params[1].strip()
    if len(message) != 0:
        server.send_message(
            server_data.Data(content_type=SERV_BROADCAST,
                             content_data=f'{message}',
                             client=server.find_client_by_socket(socket).name))
        print(f'[{server.find_client_by_socket(socket).name}]: {message}')
示例#9
0
def outbound_data_to_server():
    # Send connect message
    connect_data = server_data.Data(content_type=SERV_MESSAGE,
                                    content_data=f"!connect {PLAYER_NAME}",
                                    client=PLAYER_NAME)
    ssl_socket.send(bytes(prepare_message(connect_data), 'utf-8'))
    while not kill_threads:
        try:
            # Send data to the server.
            data_to_send = input()
            if len(data_to_send) != 0:
                data_to_send = server_data.Data(content_type=SERV_MESSAGE,
                                                content_data=data_to_send,
                                                client=PLAYER_NAME)
                ssl_socket.send(bytes(prepare_message(data_to_send), 'utf-8'))
        except socket.error as e:
            # print(e)
            disconnect_from_server()
            return
        time.sleep(CLIENT_TICK_RATE)
示例#10
0
def on_draw_card(*params):
    socket = params[0]
    if game_started:
        if game.current_player.socket == socket:
            card = game.game_deck.draw()
            game.current_player.add_to_hand(card)
            server.send_message(server_data.Data(
                content_type=SERV_MESSAGE,
                content_data=f'You drew the card ({card.color}:{card.value})'),
                                sock=game.current_player.socket)
            game.end_turn(server)
示例#11
0
def on_game_stop(*params):
    socket = params[0]
    client = server.find_client_by_socket(socket)
    global game_started
    if game_started:
        game_started = False
        server.send_message(
            server_data.Data(
                content_type=SERV_BROADCAST,
                content_data=f'The game has been closed by {client.name}'))
        game.clear_game(server=server)
示例#12
0
def on_game_start(*params):
    socket = params[0]
    client = server.find_client_by_socket(socket)
    global game_started
    if not game_started:
        game_started = True
        server.send_message(server_data.Data(
            content_type=SERV_BROADCAST,
            content_data=f'The game has been started by {client.name}'),
                            sock=socket)
        game.game_loop(server=server)