Код сохраняет данные на следущий вызов команды
Код сохраняет карты на следущий вызов команды вместо того чтобы брать новые в Блэкджеке, я уже пробовал дебагать, получилось, что условие выполняется даже если 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