Код сохраняет данные на следущий вызов команды

Код сохраняет карты на следущий вызов команды вместо того чтобы брать новые в Блэкджеке, я уже пробовал дебагать, получилось, что условие выполняется даже если player_hand_value меньше 21 (и да, логика кнопок и проверка на участника еще не доделаны)

@bot.slash_command()
async def blackjack(inter):
    member = disnake.Member
    suits = ['♠', '♣', '♥', '♦']
    ranks = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 10, 'Q': 10, 'K': 10, 'A': 11}
    deck = [f"{rank}{suit}" for suit in suits for rank in ranks]
    player_hand = []
    dealer_hand = []

    random.shuffle(deck)
    player_hand = [deck.pop(), deck.pop()]
    dealer_hand = [deck.pop(), deck.pop()]

    def calculate_hand_value(hand):
        total = 0
        aces_count = 0
        for card in hand:
            rank = card[:-1]
            for r, value in ranks.items():
                if rank == r:
                    total += value
                    if rank == 'A':
                        aces_count += 1
        
        while total > 21 and aces_count > 0:
            total -= 10
            aces_count -= 1
        
        return total

    player_hand_value = calculate_hand_value(player_hand)
    dealer_hand_value = calculate_hand_value(dealer_hand)


    button_hit=disnake.ui.Button(style=ButtonStyle.primary, label="Hit", custom_id="hit")
    button_stand=disnake.ui.Button(style=ButtonStyle.secondary, label="Stand", custom_id="stand")
            
    embed = disnake.Embed(title="Blackjack", color=disnake.Color.green())
    embed.add_field(name="Your Hand", value=', '.join(player_hand), inline=False)
    embed.add_field(name="Total:", value=player_hand_value,inline=False)
    embed.add_field(name="Dealer's Hand", value=','.join(dealer_hand), inline=False)
    embed.add_field(name="Total:", value=dealer_hand_value,inline=False)

    @bot.listen("on_button_click")
    async def help_listener(inter: disnake.MessageInteraction):
        if inter.component.custom_id not in ["hit", "stand"]:
            return
        
        elif inter.component.custom_id == "hit":
            player_hand.append(deck.pop())
            player_hand_value = calculate_hand_value(player_hand)       
            if player_hand_value > 21 and player_hand != 0:
              embed = disnake.Embed(title="Blackjack", color=disnake.Color.green())
              embed.add_field(name="Your Hand", value=', '.join(player_hand), inline=False)           
              embed.add_field(name="Total:", value=player_hand_value, inline=False)
              embed.add_field(name="Dealer's Hand", value=','.join(dealer_hand), inline=False)
              embed.add_field(name="Total:", value=dealer_hand_value, inline=False)    
              embed.add_field(name="You lost", value="Your hand value exceeded 21", inline=False) 
              print(f"{player_hand} проигрыш до подозрительного момента")          
              await inter.response.edit_message(embed=embed, components=[])         
              print(f"{player_hand} - проигрыш") 
              return                      
            else:
              embed = disnake.Embed(title="Blackjack", color=disnake.Color.green())
              embed.add_field(name="Your Hand", value=', '.join(player_hand), inline=False)
              print(f"{player_hand} не выполняется больше 21")
              embed.add_field(name="Total:", value=player_hand_value, inline=False)
              embed.add_field(name="Dealer's Hand", value=','.join(dealer_hand), inline=False)
              embed.add_field(name="Total:", value=dealer_hand_value, inline=False)
              await inter.response.edit_message(embed=embed)
              return
              
    await inter.response.send_message(embed=embed, components=[button_hit, button_stand])
    return

Ответы (1 шт):

Автор решения: ArkanBro

Короче надо перед объявлением player_hand и dealer_hand объявлять их глобальными, по типу

global player_hand, dealer_hand
→ Ссылка