|
|
@ -1,87 +1,116 @@ |
|
|
import tkinter as tk |
|
|
import tkinter as tk # Librairie pour créer l'interface graphique |
|
|
from projet_bataille import * |
|
|
from projet_bataille import * # Import du jeu de bataille (cartes, files, comparaisons) |
|
|
from time import sleep |
|
|
from time import sleep # Permet de faire des pauses (pas utilisé ici) |
|
|
|
|
|
|
|
|
|
|
|
# Initialisation des noms des joueurs |
|
|
nom1 = "" |
|
|
nom1 = "" |
|
|
nom2 = "" |
|
|
nom2 = "" |
|
|
|
|
|
|
|
|
|
|
|
# Création du jeu avec les deux joueurs |
|
|
mon_jeu = Jeu(nom1, nom2) |
|
|
mon_jeu = Jeu(nom1, nom2) |
|
|
mon_jeu.distribue(52) # Ou le nombre que tu souhaites |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Distribution des 52 cartes entre les deux joueurs |
|
|
|
|
|
mon_jeu.distribue(52) |
|
|
|
|
|
|
|
|
|
|
|
# Création de la fenêtre principale |
|
|
fenetre = tk.Tk() |
|
|
fenetre = tk.Tk() |
|
|
fenetre.title("Fenêtre verte") |
|
|
fenetre.title("Fenêtre verte") |
|
|
fenetre.geometry("1280x720") |
|
|
fenetre.geometry("1280x720") |
|
|
fenetre.configure(bg="green") |
|
|
fenetre.configure(bg="green") # Fond vert (table de jeu) |
|
|
|
|
|
|
|
|
|
|
|
# Configuration de la grille (5 lignes / 5 colonnes) |
|
|
for i in range(5): |
|
|
for i in range(5): |
|
|
fenetre.grid_rowconfigure(i, weight=1) |
|
|
fenetre.grid_rowconfigure(i, weight=1) |
|
|
fenetre.grid_columnconfigure(i, weight=1) |
|
|
fenetre.grid_columnconfigure(i, weight=1) |
|
|
|
|
|
|
|
|
|
|
|
# Compteur de tours |
|
|
compteur = 0 |
|
|
compteur = 0 |
|
|
|
|
|
|
|
|
|
|
|
# Carte du joueur 1 |
|
|
label_carte1 = tk.Label(fenetre, bg="white", fg="black", font=("Arial", 14), width=9, height=8) |
|
|
label_carte1 = tk.Label(fenetre, bg="white", fg="black", font=("Arial", 14), width=9, height=8) |
|
|
label_carte1.grid(row=1, column=2) |
|
|
label_carte1.grid(row=1, column=2) |
|
|
|
|
|
|
|
|
|
|
|
# Nombre de cartes restantes du joueur 1 |
|
|
label_paquet1 = tk.Label(fenetre, text=mon_jeu.f1.taille(), bg="green", fg="white", font=("Aria", 20)) |
|
|
label_paquet1 = tk.Label(fenetre, text=mon_jeu.f1.taille(), bg="green", fg="white", font=("Aria", 20)) |
|
|
label_paquet1.grid(row=1, column=3) |
|
|
label_paquet1.grid(row=1, column=3) |
|
|
|
|
|
|
|
|
|
|
|
# Carte du joueur 2 |
|
|
label_carte2 = tk.Label(fenetre, bg="white", fg="black", font=("Arial", 14), width=9, height=8) |
|
|
label_carte2 = tk.Label(fenetre, bg="white", fg="black", font=("Arial", 14), width=9, height=8) |
|
|
label_carte2.grid(row=3, column=2) |
|
|
label_carte2.grid(row=3, column=2) |
|
|
|
|
|
|
|
|
|
|
|
# Nombre de cartes restantes du joueur 2 |
|
|
label_paquet2 = tk.Label(fenetre, text=mon_jeu.f2.taille(), bg="green", fg="white", font=("Aria", 20)) |
|
|
label_paquet2 = tk.Label(fenetre, text=mon_jeu.f2.taille(), bg="green", fg="white", font=("Aria", 20)) |
|
|
label_paquet2.grid(row=3, column=3) |
|
|
label_paquet2.grid(row=3, column=3) |
|
|
|
|
|
|
|
|
|
|
|
# Affichage des noms des joueurs |
|
|
label_nom1 = tk.Label(fenetre, text=nom1, bg="green", fg="white", font=("Aria", 20)) |
|
|
label_nom1 = tk.Label(fenetre, text=nom1, bg="green", fg="white", font=("Aria", 20)) |
|
|
label_nom2 = tk.Label(fenetre, text=nom2, bg="green", fg="white", font=("Aria", 20)) |
|
|
label_nom2 = tk.Label(fenetre, text=nom2, bg="green", fg="white", font=("Aria", 20)) |
|
|
label_nom1.grid(row=1, column=1) |
|
|
label_nom1.grid(row=1, column=1) |
|
|
label_nom2.grid(row=3, column=1) |
|
|
label_nom2.grid(row=3, column=1) |
|
|
|
|
|
|
|
|
|
|
|
# Fonction appelée quand on valide les noms |
|
|
def valider_noms(): |
|
|
def valider_noms(): |
|
|
global nom1, nom2 |
|
|
global nom1, nom2 |
|
|
|
|
|
|
|
|
|
|
|
# Récupération des noms entrés |
|
|
nom1 = entree1.get() |
|
|
nom1 = entree1.get() |
|
|
nom2 = entree2.get() |
|
|
nom2 = entree2.get() |
|
|
|
|
|
|
|
|
|
|
|
# Valeurs par défaut si champs vides |
|
|
if nom1 == "": nom1 = "Joueur 1" |
|
|
if nom1 == "": nom1 = "Joueur 1" |
|
|
if nom2 == "": nom2 = "Joueur 2" |
|
|
if nom2 == "": nom2 = "Joueur 2" |
|
|
|
|
|
|
|
|
# On met à jour les noms sur le tapis vert |
|
|
# Mise à jour des labels |
|
|
label_nom1.config(text=nom1) |
|
|
label_nom1.config(text=nom1) |
|
|
label_nom2.config(text=nom2) |
|
|
label_nom2.config(text=nom2) |
|
|
|
|
|
|
|
|
# On ferme la petite fenêtre |
|
|
# Fermeture de la fenêtre des noms |
|
|
fenetre_noms.destroy() |
|
|
fenetre_noms.destroy() |
|
|
|
|
|
|
|
|
|
|
|
# Fonction appelée à chaque clic sur le bouton (un tour de jeu) |
|
|
def incrementer(): |
|
|
def incrementer(): |
|
|
global compteur |
|
|
global compteur |
|
|
|
|
|
|
|
|
|
|
|
# Si un joueur n'a plus de cartes, on arrête |
|
|
if mon_jeu.f1.est_vide() or mon_jeu.f2.est_vide(): |
|
|
if mon_jeu.f1.est_vide() or mon_jeu.f2.est_vide(): |
|
|
return |
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
# Incrémentation du tour |
|
|
compteur += 1 |
|
|
compteur += 1 |
|
|
label_compteur.config(text="Tour " + str(compteur)) |
|
|
label_compteur.config(text="Tour " + str(compteur)) |
|
|
|
|
|
|
|
|
|
|
|
# Joueur 1 joue une carte |
|
|
c1 = mon_jeu.f1.defiler() |
|
|
c1 = mon_jeu.f1.defiler() |
|
|
label_carte1.config(text=str(c1)) |
|
|
label_carte1.config(text=str(c1)) |
|
|
label_paquet1.config(text=str(mon_jeu.f1.taille())) |
|
|
label_paquet1.config(text=str(mon_jeu.f1.taille())) |
|
|
|
|
|
|
|
|
|
|
|
# Joueur 2 joue une carte |
|
|
c2 = mon_jeu.f2.defiler() |
|
|
c2 = mon_jeu.f2.defiler() |
|
|
label_carte2.config(text=str(c2)) |
|
|
label_carte2.config(text=str(c2)) |
|
|
label_paquet2.config(text=str(mon_jeu.f2.taille())) |
|
|
label_paquet2.config(text=str(mon_jeu.f2.taille())) |
|
|
|
|
|
|
|
|
|
|
|
# Comparaison des deux cartes |
|
|
score = c1.compare(c2) |
|
|
score = c1.compare(c2) |
|
|
|
|
|
|
|
|
if score == 1: |
|
|
if score == 1: |
|
|
# Joueur 1 gagne |
|
|
# Joueur 1 gagne le pli |
|
|
mon_jeu.f1.enfiler(c1) |
|
|
mon_jeu.f1.enfiler(c1) |
|
|
mon_jeu.f1.enfiler(c2) |
|
|
mon_jeu.f1.enfiler(c2) |
|
|
|
|
|
|
|
|
elif score == -1: |
|
|
elif score == -1: |
|
|
# Joueur 2 gagne |
|
|
# Joueur 2 gagne le pli |
|
|
mon_jeu.f2.enfiler(c1) |
|
|
mon_jeu.f2.enfiler(c1) |
|
|
mon_jeu.f2.enfiler(c2) |
|
|
mon_jeu.f2.enfiler(c2) |
|
|
|
|
|
|
|
|
else: |
|
|
else: |
|
|
|
|
|
# Égalité → bataille |
|
|
label_compteur.config(text="BATAILLE !") |
|
|
label_compteur.config(text="BATAILLE !") |
|
|
pot = [c1, c2] |
|
|
pot = [c1, c2] # Pot de cartes en jeu |
|
|
c1_og = str(c1) |
|
|
c1_og = str(c1) |
|
|
c2_og = str(c2) |
|
|
c2_og = str(c2) |
|
|
|
|
|
|
|
|
while True: |
|
|
while True: |
|
|
# On vérifie s'ils ont assez de cartes (besoin de 2 cartes chacun minimum) |
|
|
# Vérification du nombre de cartes restantes |
|
|
if mon_jeu.f1.taille() < 2 and mon_jeu.f2.taille() < 2: |
|
|
if mon_jeu.f1.taille() < 2 and mon_jeu.f2.taille() < 2: |
|
|
label_compteur.config(text=" égalité au bout de " + str(compteur) + " tour") |
|
|
label_compteur.config(text=" égalité au bout de " + str(compteur) + " tour") |
|
|
return |
|
|
return |
|
|
@ -92,31 +121,34 @@ def incrementer(): |
|
|
label_compteur.config(text=nom1 + " gagne au bout de " + str(compteur) + " tour car " + nom2 + " n'a plus assez de cartes") |
|
|
label_compteur.config(text=nom1 + " gagne au bout de " + str(compteur) + " tour car " + nom2 + " n'a plus assez de cartes") |
|
|
return |
|
|
return |
|
|
|
|
|
|
|
|
# On tire une carte face cachée (on l'ajoute juste au pot) |
|
|
# Carte face cachée |
|
|
pot.append(mon_jeu.f1.defiler()) |
|
|
pot.append(mon_jeu.f1.defiler()) |
|
|
pot.append(mon_jeu.f2.defiler()) |
|
|
pot.append(mon_jeu.f2.defiler()) |
|
|
|
|
|
|
|
|
# On tire la nouvelle carte de combat |
|
|
# Carte de combat |
|
|
c1 = mon_jeu.f1.defiler() |
|
|
c1 = mon_jeu.f1.defiler() |
|
|
c2 = mon_jeu.f2.defiler() |
|
|
c2 = mon_jeu.f2.defiler() |
|
|
pot.extend([c1, c2]) |
|
|
pot.extend([c1, c2]) |
|
|
|
|
|
|
|
|
# On met à jour l'affichage avec les nouvelles cartes |
|
|
# Mise à jour de l'affichage |
|
|
label_carte1.config(text=str(c1_og) + "\n" + str(c1)) |
|
|
label_carte1.config(text=str(c1_og) + "\n" + str(c1)) |
|
|
label_carte2.config(text=str(c2_og) + "\n" + str(c2)) |
|
|
label_carte2.config(text=str(c2_og) + "\n" + str(c2)) |
|
|
|
|
|
|
|
|
score = c1.compare(c2) |
|
|
score = c1.compare(c2) |
|
|
|
|
|
|
|
|
# Qui gagne le pot ? |
|
|
# Attribution du pot |
|
|
if score == 1: # Si J1 gagne |
|
|
if score == 1: |
|
|
for carte in pot: mon_jeu.f1.enfiler(carte) |
|
|
for carte in pot: mon_jeu.f1.enfiler(carte) |
|
|
break |
|
|
break |
|
|
elif score == -1: # Si J2 gagne |
|
|
elif score == -1: |
|
|
for carte in pot: mon_jeu.f2.enfiler(carte) |
|
|
for carte in pot: mon_jeu.f2.enfiler(carte) |
|
|
break |
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
# Mise à jour du nombre de cartes |
|
|
label_paquet1.config(text=str(mon_jeu.f1.taille())) |
|
|
label_paquet1.config(text=str(mon_jeu.f1.taille())) |
|
|
label_paquet2.config(text=str(mon_jeu.f2.taille())) |
|
|
label_paquet2.config(text=str(mon_jeu.f2.taille())) |
|
|
|
|
|
|
|
|
|
|
|
# Vérification de la victoire |
|
|
if mon_jeu.f1.est_vide(): |
|
|
if mon_jeu.f1.est_vide(): |
|
|
label_compteur.config(text=nom2 + " gagne car " + nom1 + " n'a plus de carte") |
|
|
label_compteur.config(text=nom2 + " gagne car " + nom1 + " n'a plus de carte") |
|
|
bouton.config(state="disabled") |
|
|
bouton.config(state="disabled") |
|
|
@ -124,17 +156,21 @@ def incrementer(): |
|
|
label_compteur.config(text=nom1 + " gagne car " + nom2 + " n'a plus de carte") |
|
|
label_compteur.config(text=nom1 + " gagne car " + nom2 + " n'a plus de carte") |
|
|
bouton.config(state="disabled") |
|
|
bouton.config(state="disabled") |
|
|
|
|
|
|
|
|
label_compteur = tk.Label( fenetre, text="Tour 0", bg="green", fg="white", font=("Arial", 20)) |
|
|
# Affichage du compteur de tours |
|
|
|
|
|
label_compteur = tk.Label(fenetre, text="Tour 0", bg="green", fg="white", font=("Arial", 20)) |
|
|
label_compteur.grid(row=2, column=3, sticky="e", padx=20) |
|
|
label_compteur.grid(row=2, column=3, sticky="e", padx=20) |
|
|
|
|
|
|
|
|
|
|
|
# Bouton pour jouer un tour |
|
|
bouton = tk.Button(fenetre, bg="red", width=10, height=5, command=incrementer) |
|
|
bouton = tk.Button(fenetre, bg="red", width=10, height=5, command=incrementer) |
|
|
bouton.grid(row=2, column=4, padx=30) |
|
|
bouton.grid(row=2, column=4, padx=30) |
|
|
|
|
|
|
|
|
|
|
|
# Fenêtre secondaire pour entrer les noms |
|
|
fenetre_noms = tk.Toplevel(fenetre) |
|
|
fenetre_noms = tk.Toplevel(fenetre) |
|
|
fenetre_noms.title("Noms des joueurs") |
|
|
fenetre_noms.title("Noms des joueurs") |
|
|
fenetre_noms.geometry("300x200") |
|
|
fenetre_noms.geometry("300x200") |
|
|
fenetre_noms.config(bg="white") |
|
|
fenetre_noms.config(bg="white") |
|
|
|
|
|
|
|
|
|
|
|
# Champs de saisie des noms |
|
|
tk.Label(fenetre_noms, text="Nom Joueur 1 :", bg="white").pack(pady=5) |
|
|
tk.Label(fenetre_noms, text="Nom Joueur 1 :", bg="white").pack(pady=5) |
|
|
entree1 = tk.Entry(fenetre_noms) |
|
|
entree1 = tk.Entry(fenetre_noms) |
|
|
entree1.pack() |
|
|
entree1.pack() |
|
|
@ -143,9 +179,11 @@ tk.Label(fenetre_noms, text="Nom Joueur 2 :", bg="white").pack(pady=5) |
|
|
entree2 = tk.Entry(fenetre_noms) |
|
|
entree2 = tk.Entry(fenetre_noms) |
|
|
entree2.pack() |
|
|
entree2.pack() |
|
|
|
|
|
|
|
|
|
|
|
# Bouton pour lancer la partie |
|
|
tk.Button(fenetre_noms, text="Commencer la partie", command=valider_noms).pack(pady=20) |
|
|
tk.Button(fenetre_noms, text="Commencer la partie", command=valider_noms).pack(pady=20) |
|
|
|
|
|
|
|
|
# On empêche de cliquer sur la fenêtre principale tant qu'on n'a pas validé |
|
|
# Bloque la fenêtre principale tant que les noms ne sont pas validés |
|
|
fenetre_noms.grab_set() |
|
|
fenetre_noms.grab_set() |
|
|
|
|
|
|
|
|
fenetre.mainloop() |
|
|
# Lancement de la boucle principale |
|
|
|
|
|
fenetre.mainloop() |
|
|
|