Téléverser les fichiers vers "/"
This commit is contained in:
264
blackjack.py
Normal file
264
blackjack.py
Normal file
@@ -0,0 +1,264 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user