Files
Blackjack.py/blackjack.py

264 lines
8.6 KiB
Python

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()