import random import os import time import sys # --- CONFIGURATION & COULEURS --- class Couleurs: RESET = "\033[0m" ROUGE = "\033[91m" # Pour Coeur/Carreau NOIR = "\033[97m" # Blanc pour Pique/Trèfle (sur fond noir) VERT = "\033[92m" # Tapis / Argent JAUNE = "\033[93m" # Infos CYAN = "\033[96m" # Titres GRAS = "\033[1m" # Symboles des cartes SUITS = { 'Pique': '♠', 'Coeur': '♥', 'Carreau': '♦', 'Trefle': '♣' } # Valeurs faciales RANKS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] VALUES = {'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} def cls(): os.system('cls' if os.name == 'nt' else 'clear') # --- CLASSES --- class Carte: def __init__(self, rank, suit): self.rank = rank self.suit = suit self.symbol = SUITS[suit] self.valeur = VALUES[rank] # Couleur rouge pour coeur/carreau self.couleur = Couleurs.ROUGE if suit in ['Coeur', 'Carreau'] else Couleurs.NOIR def visuel(self): """Retourne une liste de chaînes représentant la carte ligne par ligne.""" r = self.rank.ljust(2) s = self.symbol c = self.couleur end = Couleurs.RESET # ASCII Art de la carte return [ f"{c}┌─────────┐{end}", f"{c}│ {r} │{end}", f"{c}│ │{end}", f"{c}│ {s} │{end}", f"{c}│ │{end}", f"{c}│ {r} │{end}", f"{c}└─────────┘{end}" ] class Paquet: def __init__(self): self.cartes = [] self.generer() def generer(self): self.cartes = [Carte(r, s) for s in SUITS for r in RANKS] random.shuffle(self.cartes) def tirer(self): if not self.cartes: self.generer() # Nouveau paquet si vide return self.cartes.pop() class Main: def __init__(self): self.cartes = [] self.valeur = 0 self.aces = 0 def ajouter(self, carte): self.cartes.append(carte) self.calculer() def calculer(self): self.valeur = 0 self.aces = 0 for carte in self.cartes: self.valeur += carte.valeur if carte.rank == 'A': self.aces += 1 # Gestion des As (11 ou 1) while self.valeur > 21 and self.aces: self.valeur -= 10 self.aces -= 1 def afficher_table(main_joueur, main_dealer, cache_dealer=True): cls() print(f"{Couleurs.VERT}╔══════════════════════════════════════════════════════════╗") print(f"║ 🎰 CASINO PYTHON 🎰 ║") print(f"╚══════════════════════════════════════════════════════════╝{Couleurs.RESET}\n") # --- CROUPIER --- print(f"{Couleurs.JAUNE}🤠 CROUPIER{Couleurs.RESET}") lignes_dealer = [""] * 7 for i, carte in enumerate(main_dealer.cartes): # Si c'est la première carte et qu'on doit la cacher if i == 0 and cache_dealer: dos_carte = [ "┌─────────┐", "│░░░░░░░░░│", "│░░░░░░░░░│", "│░░PYTHON░│", "│░░░░░░░░░│", "│░░░░░░░░░│", "└─────────┘" ] img = dos_carte else: img = carte.visuel() for idx, ligne in enumerate(img): lignes_dealer[idx] += ligne + " " for ligne in lignes_dealer: print(ligne) if cache_dealer: print(f" Score : ?") else: print(f" Score : {main_dealer.valeur}") print("\n" + "-"*40 + "\n") # --- JOUEUR --- print(f"{Couleurs.CYAN}👤 JOUEUR{Couleurs.RESET}") lignes_joueur = [""] * 7 for carte in main_joueur.cartes: img = carte.visuel() for idx, ligne in enumerate(img): lignes_joueur[idx] += ligne + " " for ligne in lignes_joueur: print(ligne) print(f" Score : {main_joueur.valeur}") print("\n") # --- MOTEUR DE JEU --- def jeu(): argent = 100 paquet = Paquet() while True: if argent <= 0: cls() print(f"{Couleurs.ROUGE}💸 Vous êtes ruiné ! Game Over.{Couleurs.RESET}") break cls() print(f"{Couleurs.VERT}💰 Votre solde : {argent} €{Couleurs.RESET}") # 1. Mise mise = 0 while True: try: entree = input("Placez votre mise (ou 'q' pour quitter) : ") if entree.lower() == 'q': sys.exit() mise = int(entree) if 0 < mise <= argent: break print("Mise invalide.") except: print("Entrez un nombre.") # 2. Distribution initiale joueur = Main() dealer = Main() joueur.ajouter(paquet.tirer()) joueur.ajouter(paquet.tirer()) dealer.ajouter(paquet.tirer()) dealer.ajouter(paquet.tirer()) fin_tour = False doubler = False # Vérification Blackjack naturel if joueur.valeur == 21: afficher_table(joueur, dealer, cache_dealer=False) print(f"{Couleurs.JAUNE}✨ BLACKJACK ! ✨{Couleurs.RESET}") argent += int(mise * 1.5) fin_tour = True time.sleep(2) # 3. Tour du Joueur while not fin_tour: afficher_table(joueur, dealer, cache_dealer=True) if joueur.valeur > 21: print(f"{Couleurs.ROUGE}💥 BUST ! Vous avez dépassé 21.{Couleurs.RESET}") argent -= mise fin_tour = True break print(f"Options : {Couleurs.GRAS}[T]irer{Couleurs.RESET} | {Couleurs.GRAS}[R]ester{Couleurs.RESET}", end="") if len(joueur.cartes) == 2 and argent >= mise * 2: print(f" | {Couleurs.GRAS}[D]oubler{Couleurs.RESET}", end="") print() choix = input("Votre choix : ").lower() if choix == 't': joueur.ajouter(paquet.tirer()) elif choix == 'r': break elif choix == 'd' and len(joueur.cartes) == 2: if argent >= mise * 2: mise *= 2 doubler = True print(f"{Couleurs.JAUNE}Mise doublée ! ({mise}€){Couleurs.RESET}") joueur.ajouter(paquet.tirer()) if joueur.valeur > 21: afficher_table(joueur, dealer, cache_dealer=True) print(f"{Couleurs.ROUGE}💥 BUST !{Couleurs.RESET}") argent -= mise fin_tour = True break # On double, on tire une carte, et c'est fini else: print("Pas assez d'argent pour doubler.") time.sleep(1) # 4. Tour du Croupier if not fin_tour: # Révélation afficher_table(joueur, dealer, cache_dealer=False) time.sleep(1) while dealer.valeur < 17: print("Le croupier tire...") time.sleep(1) dealer.ajouter(paquet.tirer()) afficher_table(joueur, dealer, cache_dealer=False) # 5. Résultat if dealer.valeur > 21: print(f"{Couleurs.VERT}🎉 Le croupier saute ! Vous gagnez {mise} €.{Couleurs.RESET}") argent += mise elif dealer.valeur > joueur.valeur: print(f"{Couleurs.ROUGE}❌ Le croupier gagne ({dealer.valeur} vs {joueur.valeur}).{Couleurs.RESET}") argent -= mise elif dealer.valeur < joueur.valeur: print(f"{Couleurs.VERT}🎉 Vous gagnez ! ({joueur.valeur} vs {dealer.valeur}){Couleurs.RESET}") argent += mise else: print(f"{Couleurs.JAUNE}🤝 Égalité (Push). Mise remboursée.{Couleurs.RESET}") input(f"\nAppuyez sur Entrée pour continuer...") if __name__ == "__main__": jeu()