|
|
|
import tkinter as tk
|
|
|
|
from random import shuffle
|
|
|
|
from File import File_lst as File
|
|
|
|
from Pile import Pile_lst as Pile
|
|
|
|
|
|
|
|
class Carte:
|
|
|
|
def __init__(self, valeur, couleur): # initialise les cartes avec une valeur et une couleur
|
|
|
|
self.valeur = valeur
|
|
|
|
self.couleur = couleur
|
|
|
|
|
|
|
|
def __repr__ (self): #permet de mettre "Carte(11, 1)" sous forme "Valet de cœur" (trouver sur python pas a pas)
|
|
|
|
couleur = {1: "Cœur", 2: "Carreau", 3: "Trèfle", 4: "Pique"}
|
|
|
|
valeur = {11: "Valet", 12: "Dame", 13: "Roi", 14: "As"}
|
|
|
|
valeur_str = valeur.get(self.valeur, self.valeur)
|
|
|
|
couleur_str = couleur.get(self.couleur, self.couleur)
|
|
|
|
return f"{valeur_str} de {couleur_str}"
|
|
|
|
|
|
|
|
def compare(self, other):# compare la valeur des cartes des deux joueurs
|
|
|
|
if self.valeur > other.valeur:# si self est une carte avec une valeur plus grande
|
|
|
|
return 1
|
|
|
|
elif self.valeur < other.valeur:# si other est une carte avec une valeur plus grande
|
|
|
|
return -1
|
|
|
|
return 0 # même valeur, il y a bataille
|
|
|
|
|
|
|
|
class Jeux:
|
|
|
|
def __init__(self, taille_paquet = 32): # creer les piles et files necessaire au jeu
|
|
|
|
self.taille_paquet = taille_paquet
|
|
|
|
self.paquet = self.creer_paquet()
|
|
|
|
self.melanger_paquet()
|
|
|
|
self.joueur1 = File()
|
|
|
|
self.joueur2 = File()
|
|
|
|
self.distribuer_cartes()
|
|
|
|
|
|
|
|
def creer_paquet(self): #crer le nombre de carte choisi
|
|
|
|
if self.taille_paquet == 52:
|
|
|
|
valeurs = list(range(2, 15))
|
|
|
|
else:
|
|
|
|
valeurs = list(range(7, 15))
|
|
|
|
couleurs = ["Coeur", "Carreau", "Trefle", "Pique"]
|
|
|
|
paquet = Pile()
|
|
|
|
for couleur in couleurs:
|
|
|
|
for valeur in valeurs:
|
|
|
|
paquet.empiler(Carte(valeur, couleur))
|
|
|
|
return paquet
|
|
|
|
|
|
|
|
def melanger_paquet(self):#mélange le paquet
|
|
|
|
cartes = []
|
|
|
|
while not self.paquet.est_vide():
|
|
|
|
cartes.append(self.paquet.depiler())
|
|
|
|
shuffle(cartes)
|
|
|
|
for carte in cartes:
|
|
|
|
self.paquet.empiler(carte)
|
|
|
|
|
|
|
|
def distribuer_cartes(self):#distribue les cartes aux joueurs
|
|
|
|
while not self.paquet.est_vide():
|
|
|
|
self.joueur1.enfiler(self.paquet.depiler())
|
|
|
|
if not self.paquet.est_vide():
|
|
|
|
self.joueur2.enfiler(self.paquet.depiler())
|
|
|
|
|
|
|
|
def jouer_tour(self): #joue un tour
|
|
|
|
if self.joueur1.est_vide() or self.joueur2.est_vide():
|
|
|
|
return "Fin du jeu"
|
|
|
|
|
|
|
|
carte1 = self.joueur1.defiler()
|
|
|
|
carte2 = self.joueur2.defiler()
|
|
|
|
|
|
|
|
resultat = carte1.compare(carte2)
|
|
|
|
if resultat == 1:# Joueur 1 a gagné
|
|
|
|
self.joueur1.enfiler(carte1)
|
|
|
|
self.joueur1.enfiler(carte2)
|
|
|
|
return f"Joueur 1 gagne le tour avec {carte1} contre {carte2}."
|
|
|
|
elif resultat == -1:# Joueur 2 a gagné
|
|
|
|
self.joueur2.enfiler(carte1)
|
|
|
|
self.joueur2.enfiler(carte2)
|
|
|
|
return f"Joueur 2 gagne le tour avec {carte2} contre {carte1}."
|
|
|
|
else:# bataille
|
|
|
|
return self.bataille([carte1], [carte2])
|
|
|
|
|
|
|
|
def bataille(self, pile1, pile2): # si bataille, elle compare les cartes deux et/ou trois
|
|
|
|
if self.joueur1.taille() < 2 or self.joueur2.taille() < 2:
|
|
|
|
return "Un joueur n'a plus assez de cartes pour continuer la bataille."
|
|
|
|
|
|
|
|
pile1.append(self.joueur1.defiler())
|
|
|
|
pile1.append(self.joueur1.defiler())
|
|
|
|
pile2.append(self.joueur2.defiler())
|
|
|
|
pile2.append(self.joueur2.defiler())
|
|
|
|
|
|
|
|
carte_bataille1 = pile1[-1]
|
|
|
|
carte_bataille2 = pile2[-1]
|
|
|
|
|
|
|
|
resultat = carte_bataille1.compare(carte_bataille2)
|
|
|
|
if resultat == 1:# Joueur 1 a gagné
|
|
|
|
for carte in pile1 + pile2:
|
|
|
|
self.joueur1.enfiler(carte)
|
|
|
|
return f"Bataille! Joueur 1 remporte avec {carte_bataille1} contre {carte_bataille2}."
|
|
|
|
elif resultat == -1: # Joueur 2 a gagné
|
|
|
|
for carte in pile1 + pile2:
|
|
|
|
self.joueur2.enfiler(carte)
|
|
|
|
return f"Bataille! Joueur 2 remporte avec {carte_bataille2} contre {carte_bataille1}."
|
|
|
|
else:
|
|
|
|
return self.bataille(pile1, pile2) # bataille
|
|
|
|
|
|
|
|
class Lancer_Jeu:
|
|
|
|
def __init__(self, root): # interface tkinter, pour ouvrir la fenetre, creer les bouton et faire le nombre de cartes en réponse a cocher
|
|
|
|
self.root = root
|
|
|
|
self.root.title("Jeu de Bataille")
|
|
|
|
|
|
|
|
self.taille_paquet = tk.IntVar(value=32)
|
|
|
|
|
|
|
|
self.label_options = tk.Label(root, text="Choisissez le nombre de cartes :", font=("Helvetica", 12))
|
|
|
|
self.label_options.pack(pady=5)
|
|
|
|
|
|
|
|
self.option_32 = tk.Radiobutton(root, text="32 cartes", variable=self.taille_paquet, value=32, font=("Helvetica", 10))
|
|
|
|
self.option_32.pack()
|
|
|
|
|
|
|
|
self.option_52 = tk.Radiobutton(root, text="52 cartes", variable=self.taille_paquet, value=52, font=("Helvetica", 10))
|
|
|
|
self.option_52.pack()
|
|
|
|
|
|
|
|
self.bouton_demarrer = tk.Button(root, text="Démarrer le jeu", command=self.demarrer_jeu, font=("Helvetica", 12))
|
|
|
|
self.bouton_demarrer.pack(pady=10)
|
|
|
|
|
|
|
|
self.label_info = tk.Label(root, text="", font=("Helvetica", 14))
|
|
|
|
self.label_info.pack(pady=10)
|
|
|
|
|
|
|
|
self.label_score = tk.Label(root, text="", font=("Helvetica", 12))
|
|
|
|
self.label_score.pack(pady=10)
|
|
|
|
|
|
|
|
self.bouton_tour = tk.Button(root, text="Jouer un tour", command=self.jouer_tour, font=("Helvetica", 12), state=tk.DISABLED)
|
|
|
|
self.bouton_tour.pack(pady=10)
|
|
|
|
|
|
|
|
def demarrer_jeu(self): # commence la partie après avoir eu le nombre de cartes a utilisé, avec la fonction du bouton
|
|
|
|
self.jeu = Jeux(taille_paquet=self.taille_paquet.get())
|
|
|
|
self.label_info.config(text="Le jeu commence! Cliquez pour jouer un tour.")
|
|
|
|
self.bouton_tour.config(state=tk.NORMAL)
|
|
|
|
|
|
|
|
def jouer_tour(self): # joue un tour, avec la fonction du bouton
|
|
|
|
resultat = self.jeu.jouer_tour()
|
|
|
|
self.label_info.config(text=resultat)
|
|
|
|
if self.jeu.joueur1.est_vide():
|
|
|
|
self.label_score.config(text="Joueur 2 a gagné la partie!")
|
|
|
|
self.bouton_tour.config(state=tk.DISABLED)
|
|
|
|
elif self.jeu.joueur2.est_vide():
|
|
|
|
self.label_score.config(text="Joueur 1 a gagné la partie!")
|
|
|
|
self.bouton_tour.config(state=tk.DISABLED)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
root = tk.Tk()
|
|
|
|
lancer = Lancer_Jeu(root)
|
|
|
|
root.mainloop()
|