Пытаюсь запрограммировать своего компьютерного игрока, чтобы он был умнее в карточной игре "Go Fish". Более подробная информация в теле

''' Это карточная игра "Go Fish", и я пытаюсь сделать своего компьютерного игрока умнее. На данный момент, когда игрок 2 запрашивает карту, он делает это с помощью функции random.choice, подобной этой (player_2_choice = random.choice(player_2_hand). Я хочу попробовать ограничить доступные варианты, сравнив player_2_hand с двумя разными списками. . Один из них — for_player_2 = [], который представляет собой набор карт, которые запросил игрок 1, но которых не было у игрока 2. Если у игрока 2 не было карты, это означает, что карта все еще находится в руке игрока 1, поэтому компьютерный игрок должен знать, чтобы попросить эту карту, если они возьмут ее позже.Другой список — Remember_cards = [], который представляет собой набор карт, которые игрок 2 запрашивает у игрока 1, а у игрока 1 нет карты в руке, поэтому игрок 2 должен знать, что не следует попросите эту карту на определенное количество ходов, потому что игрок 2 знает, что у игрока 1 нет этой карты. Я опубликую большую часть программы и прокомментирую столько, сколько смогу, чтобы помочь объяснить, что я пытаюсь сделать. Просто ищу предложения по что я мог сделать Не разрешено использовать классы, это часть другого назначение. При сравнении for_player_2 и player_2_hand, а также Remember_cards и player_2_hand мне нужно сравнить только первую букву каждого элемента, чтобы найти совпадение. Пример: for_player_2 = ['2H'] player_2_hand = ['2C', '3C', '4c', 'KC', 'AC'] -- Проверка увидит, что 2H соответствует for_player_2, а 2C в player_2_hand совпадает, так что это будет значение, хранящееся в player_2_choice. Тогда это будет та карта, которую просит player_2. '''

import random
deck = build_deck()  #build_deck() builds a deck of cards
shuffle_deck(deck) #shuffles deck
player_1_hand = deal_hand(deck, 7) #Deals 7 cards to player1, card example: 'AS'
player_2_hand = deal_hand(deck, 7) #Deals 7 cards to player2
player_1_pairs = remove_pairs(player_1_hand) #Removes pairs at beginning of game
player_2_pairs = remove_pairs(player_2_hand) #Removes pairs at beginning of game
for_player_2 = [] # Will be added to later
remembered_cards = [] #Will be added to later
while True:
    if len(player_1_hand) == 0 or len(player_2_hand) == 0 or len(deck) == 0:
        break
    # Player 1's turn
    while True:
        if len(player_1_hand) == 0:
            break
        print("Your cards ", player_1_hand)
        desired_card = input("What card would you like from your opponent?")
        if desired_card not in player_1_hand:
            print("Invalid option, please choose again.")
            continue
        if check_guess(player_2_hand, player_1_hand, desired_card, player_1_pairs) == True:
            #This function above checks to see if the guess is in the other player's hand
            print("Well done!!!")
        else:
            print("Go Fish")
            player_1_hand.append(deal_top_card(deck)) #Deals top card of deck to player
            d_card = player_1_hand[-1] #Last card in hand is the card we just drew
            # Since we had to go fish, the desired card is added to the list for_player_2
            for_player_2.append(desired_card)
            if check_d_card(player_1_hand, player_1_pairs, desired_card, d_card) == True:
                print("Congratulations, you drew the match to your pair!!!")
                continue
            elif check_d_card(player_1_hand, player_1_pairs, desired_card, d_card) == False:
                for i in range(len(player_1_hand)):
                    for j in range(i + 1, len(player_1_hand)):
                        # If card ranks match
                        card1 = player_1_hand[i]
                        card2 = player_1_hand[j]
                        if card1[0] == card2[0]:
                            #Add the pairs to the player pair list
                            player_1_pairs.extend([card1, card2])
                            #Remove pairs from player's hand
                            player_1_hand.remove(card1)
                            player_1_hand.remove(card2)
                            break
            print(f"Player 1 has {len(player_1_hand)} cards in their hand")
            break
    #Player 2's turn
    while True:
        if len(player_2_hand) == 0:
            break
        #This is the section I am trying to figure out mainly
        #Want check and see if matching element between for_player_2 and player_2_hand
        cardFound = False
        for card in for_player_2:
            for hand_card in player_2_hand:
                if hand_card[0] == card[0]:
                    player_2_choice = card
                    print("Player 2 asked for ", card)
                    cardFound = True
                    break
        if not cardFound:
            #This is where the comparison needs to be made between 
            #remembered_cards and player_2_hand
        player_2_choice = random.choice(player_2_hand) # This is original but I want to change
        print("Player 2 asked for", player_2_choice) # Original
        #After first check between for_player_2 and player_2_hand I want to check another
        #Next I want to check if there is a matching element between remembered_cards
        #And player_2_hand because remembered_cards are the cards player2 asked for
        #and player1 didn't have, so player2 shouldn't ask for that card again for 
        #a set amount of turns. Not sure if that is possible.
        
        if player_2_choice not in player_2_hand:
            continue
        if check_guess(player_1_hand, player_2_hand, player_2_choice, player_2_pairs) == True:
            print("Player 2 got a pat on the back for guessing correctly!!!")
        else:
            print("Player 2 had to go fishing!!!")
            #Here is where the failed player_2_choice gets added to remembered cards
            remembered_cards.append(player_2_choice)
            player_2_hand.append(deal_top_card(deck)) #Deals top card of deck to player2
            d_card = player_2_hand[-1]
            if check_d_card(player_2_hand, player_2_pairs, player_2_choice, d_card) == True:
                print("Player 2 got a pat on the back for drawing the match to their pair")
                continue
            elif check_d_card(player_2_hand, player_2_pairs, player_2_choice, d_card) == Fals:
                for i in range(len(player_2_hand)):
                    for j in range(i + 1, len(player_2_hand)):
                        #If card ranks match
                        card1 = player_2_hand[i]
                        card2 = player_2_hand[j]
                        if card1[0] == card2[0]:
                            player_2_pairs.extend([card1, card2])
                            player_2_hand.remove(card1)
                            player_2_hand.remove(card2)
                            break
            print(f"Player 2 has {len(player_2_hand)} cards in their hand")
            break
        

Я уже реализовал это сравнение карт в своем ответе на ваш последний вопрос:<br> stackoverflow.com/questions/71962667/…

ibrahem 23.04.2022 04:16

#ibrahem, да, вы помогли мне с половиной вопроса. Другая часть вопроса заключается в том, как мне сделать вторую проверку между memory_cards и player_2_hand, и если она найдет совпадение, player2 не будет запрашивать эту карту. Я пытаюсь выяснить, как ограничить функцию random.choice, если это возможно, а если нет, я попробую что-нибудь еще.

Cameron Bratten 23.04.2022 04:31
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
import random
deck = build_deck()  #build_deck() builds a deck of cards
shuffle_deck(deck) #shuffles deck
player_1_hand = deal_hand(deck, 7) #Deals 7 cards to player1, card example: 'AS'
player_2_hand = deal_hand(deck, 7) #Deals 7 cards to player2
player_1_pairs = remove_pairs(player_1_hand) #Removes pairs at beginning of game
player_2_pairs = remove_pairs(player_2_hand) #Removes pairs at beginning of game
for_player_2 = [] # Will be added to later
remembered_cards = {} # <========== converted to a Set for better preformance
while True:
    if len(player_1_hand) == 0 or len(player_2_hand) == 0 or len(deck) == 0:
        break
    # Player 1's turn
    while True:
        if len(player_1_hand) == 0:
            break
        print("Your cards ", player_1_hand)
        desired_card = input("What card would you like from your opponent?")
        if desired_card not in player_1_hand:
            print("Invalid option, please choose again.")
            continue
        if check_guess(player_2_hand, player_1_hand, desired_card, player_1_pairs) == True:
            #This function above checks to see if the guess is in the other player's hand
            print("Well done!!!")
        else:
            print("Go Fish")
            player_1_hand.append(deal_top_card(deck)) #Deals top card of deck to player
            d_card = player_1_hand[-1] #Last card in hand is the card we just drew
            # Since we had to go fish, the desired card is added to the list for_player_2
            for_player_2.append(desired_card)
            if check_d_card(player_1_hand, player_1_pairs, desired_card, d_card) == True:
                print("Congratulations, you drew the match to your pair!!!")
                continue
            elif check_d_card(player_1_hand, player_1_pairs, desired_card, d_card) == False:
                for i in range(len(player_1_hand)):
                    for j in range(i + 1, len(player_1_hand)):
                        # If card ranks match
                        card1 = player_1_hand[i]
                        card2 = player_1_hand[j]
                        if card1[0] == card2[0]:
                            #Add the pairs to the player pair list
                            player_1_pairs.extend([card1, card2])
                            #Remove pairs from player's hand
                            player_1_hand.remove(card1)
                            player_1_hand.remove(card2)
                            break
            print(f"Player 1 has {len(player_1_hand)} cards in their hand")
            break
    #Player 2's turn
    while True:
        if len(player_2_hand) == 0:
            break
        #This is the section I am trying to figure out mainly
        #Want check and see if matching element between for_player_2 and player_2_hand
        cardFound = False
        for card in for_player_2:
            for hand_card in player_2_hand:
                if hand_card[0] == card[0]:
                    player_2_choice = card
                    # not_needed #print("Player 2 asked for ", card)
                    cardFound = True
                    break
        if not cardFound:
            #This is where the comparison needs to be made between 
            #remembered_cards and player_2_hand
            player_2_choice = random.choice( # random choose
                list( # random.choice requires list (as an argument)
                    set(player_2_hand).\ # convert player_2_hand to a Set to use difference method
                        difference(remembered_cards) # remove cards that is in remembered_cards
                ) # randomly choose from the result list
            )

        # not_needed #player_2_choice = random.choice(player_2_hand) # This is original but I want to change
        print("Player 2 asked for", player_2_choice) # Original
        #After first check between for_player_2 and player_2_hand I want to check another
        #Next I want to check if there is a matching element between remembered_cards
        #And player_2_hand because remembered_cards are the cards player2 asked for
        #and player1 didn't have, so player2 shouldn't ask for that card again for 
        #a set amount of turns. Not sure if that is possible.
        
        if player_2_choice not in player_2_hand:
            continue
        if check_guess(player_1_hand, player_2_hand, player_2_choice, player_2_pairs) == True:
            print("Player 2 got a pat on the back for guessing correctly!!!")
        else:
            print("Player 2 had to go fishing!!!")
            #Here is where the failed player_2_choice gets added to remembered cards
            remembered_cards.add(player_2_choice)
            player_2_hand.append(deal_top_card(deck)) #Deals top card of deck to player2
            d_card = player_2_hand[-1]
            if check_d_card(player_2_hand, player_2_pairs, player_2_choice, d_card) == True:
                print("Player 2 got a pat on the back for drawing the match to their pair")
                continue
            elif check_d_card(player_2_hand, player_2_pairs, player_2_choice, d_card) == Fals:
                for i in range(len(player_2_hand)):
                    for j in range(i + 1, len(player_2_hand)):
                        #If card ranks match
                        card1 = player_2_hand[i]
                        card2 = player_2_hand[j]
                        if card1[0] == card2[0]:
                            player_2_pairs.extend([card1, card2])
                            player_2_hand.remove(card1)
                            player_2_hand.remove(card2)
                            break
            print(f"Player 2 has {len(player_2_hand)} cards in their hand")
            break
        

Другие вопросы по теме