myircbot/plugins/blackjack.py
2025-05-29 22:58:53 +02:00

114 lines
4.6 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
# Definir los valores de las cartas
CARD_VALUES = {
"A": 11, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6,
"7": 7, "8": 8, "9": 9, "10": 10, "J": 10, "Q": 10, "K": 10
}
# Definir los palos de las cartas
SUITS = ["", "", "", ""]
class BlackjackPlugin:
def __init__(self):
self.active_games = {} # {usuario: {"cartas": [], "total": int}}
def deal_card(self):
"""Reparte una carta aleatoria."""
card = random.choice(list(CARD_VALUES.keys()))
suit = random.choice(SUITS)
return f"{card}{suit}", CARD_VALUES[card]
def calculate_total(self, cards):
"""Calcula el valor total de la mano."""
total = sum(value for _, value in cards)
num_ases = sum(1 for card, value in cards if card.startswith("A"))
# Ajustar Ases de 11 a 1 si es necesario
while total > 21 and num_ases:
total -= 10 # Cambiar un As de 11 a 1
num_ases -= 1
return total
def bot_turn(self):
"""El bot juega automáticamente su turno después de que el jugador se planta."""
bot_cards = []
while self.calculate_total(bot_cards) < 17: # El bot se planta con 17 o más
card, value = self.deal_card()
bot_cards.append((card, value))
return bot_cards
def run(self, sender, *args):
"""Controla el juego de Blackjack."""
if not args:
return " Uso: `.blackjack start` para jugar, `.hit` para pedir carta, `.stand` para plantarte."
command = args[0].lower()
if command == "start":
# Comenzar una nueva partida
card1, value1 = self.deal_card()
card2, value2 = self.deal_card()
self.active_games[sender] = {"cartas": [(card1, value1), (card2, value2)]}
total = self.calculate_total(self.active_games[sender]["cartas"])
if total == 21:
self.active_games.pop(sender) # Eliminar partida
return f" {sender} tiene **Blackjack** con {card1} {card2}! ¡Ganaste!"
return f"🃏 {sender} ha comenzado una partida.\nCartas: {card1} {card2} (Total: {total})\nUsa `.hit` para pedir carta o `.stand` para plantarte."
elif command == "hit":
# Pedir una carta extra
if sender not in self.active_games:
return " No tienes una partida activa. Usa `.blackjack start` para comenzar."
card, value = self.deal_card()
self.active_games[sender]["cartas"].append((card, value))
total = self.calculate_total(self.active_games[sender]["cartas"])
if total > 21:
self.active_games.pop(sender) # Eliminar partida
return f" {sender} pidió {card} y ahora tiene {total}. ¡Te pasaste!"
return f"🃏 {sender} pidió {card}. **Total:** {total}\nUsa `.hit` para otra carta o `.stand` para plantarte."
elif command == "stand":
# Plantarse y terminar la partida
if sender not in self.active_games:
return " No tienes una partida activa. Usa `.blackjack start` para comenzar."
player_total = self.calculate_total(self.active_games[sender]["cartas"])
# 🃏 TURNO DEL BOT
bot_cards = self.bot_turn()
bot_total = self.calculate_total(bot_cards)
# Determinar el resultado final
if bot_total > 21:
result = f" El bot se pasó con {bot_total}. ¡{sender} gana!"
elif player_total > bot_total:
result = f" {sender} gana con {player_total} contra {bot_total} del bot. ¡Felicidades!"
elif player_total < bot_total:
result = f" El bot gana con {bot_total} contra {player_total} de {sender}."
else:
result = f" Empate con {player_total}."
# Borrar la partida una vez terminado
self.active_games.pop(sender)
return (f"🃏 {sender} se planta con {player_total}.\n\n"
f" **Turno del bot...**\nCartas del bot: {', '.join(card for card, _ in bot_cards)} (Total: {bot_total})\n\n"
f"{result}")
else:
return " Uso: `.blackjack start` para jugar, `.hit` para pedir carta, `.stand` para plantarte."
def help(self):
"""Descripción del plugin para el comando .help"""
return ("🃏 **Blackjack** - Juego de cartas\n"
" Usa `.blackjack start` para comenzar.\n"
" Luego `.hit` para pedir carta o `.stand` para plantarte.\n"
" ¡Gana si consigues 21 o el bot se pasa!")