You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
5.6 KiB
143 lines
5.6 KiB
6 days ago
|
import tkinter as tk
|
||
|
from tkinter import messagebox
|
||
|
from PIL import Image, ImageTk
|
||
|
from bataille.Jeux import Jeux
|
||
|
from structure.File import File_lst
|
||
|
|
||
|
class BatailleGUI:
|
||
|
"""Interface graphique pour le jeu de bataille"""
|
||
|
|
||
|
|
||
|
def __init__(self, root):
|
||
|
"""Constructeur de la classe BatailleGUI"""
|
||
|
self.root = root
|
||
|
self.root.title("Jeu de Bataille")
|
||
|
|
||
|
# Set background image
|
||
|
self.bg_image = Image.open("gui/ressources/tapis.png")
|
||
|
self.bg_image = self.bg_image.resize((1000, 700))
|
||
|
self.bg_photo = ImageTk.PhotoImage(self.bg_image)
|
||
|
self.bg_label = tk.Label(root, image=self.bg_photo)
|
||
|
self.bg_label.place(relwidth=1, relheight=1)
|
||
|
|
||
|
self.jeux = Jeux()
|
||
|
self.f1, self.f2 = self.jeux.distribue(File_lst)
|
||
|
|
||
|
self.total_cartes_label = tk.Label(root, text=f"Total cartes: {len(self.jeux.paquet)}", bg="green", fg="white")
|
||
|
self.total_cartes_label.grid(row=0, column=0, columnspan=3)
|
||
|
|
||
|
self.canvas_joueur1 = tk.Canvas(root, width=200, height=300, bg="green")
|
||
|
self.canvas_joueur1.grid(row=2, column=0, padx=20, pady=20)
|
||
|
|
||
|
self.canvas_joueur2 = tk.Canvas(root, width=200, height=300, bg="green")
|
||
|
self.canvas_joueur2.grid(row=2, column=2, padx=20, pady=20)
|
||
|
|
||
|
self.label_joueur1 = tk.Label(root, text="Joueur 1", bg="green", fg="white")
|
||
|
self.label_joueur1.grid(row=3, column=0)
|
||
|
|
||
|
self.label_joueur2 = tk.Label(root, text="Joueur 2", bg="green", fg="white")
|
||
|
self.label_joueur2.grid(row=3, column=2)
|
||
|
|
||
|
self.bouton_tour = tk.Button(root, text="Jouer un tour", command=self.jouer_tour)
|
||
|
self.bouton_tour.grid(row=4, column=1)
|
||
|
|
||
|
self.bouton_restart = tk.Button(root, text="Redémarrer", command=self.restart_game)
|
||
|
self.bouton_restart.grid(row=5, column=1)
|
||
|
|
||
|
self.bouton_auto = tk.Button(root, text="Défilement auto", command=self.auto_play)
|
||
|
self.bouton_auto.grid(row=6, column=0)
|
||
|
|
||
|
self.bouton_quit_auto = tk.Button(root, text="Quitter auto play", command=self.quit_auto_play)
|
||
|
self.bouton_quit_auto.grid(row=6, column=2)
|
||
|
|
||
|
self.bouton_quit = tk.Button(root, text="Quitter", command=root.quit)
|
||
|
self.bouton_quit.grid(row=7, column=1)
|
||
|
|
||
|
self.auto_playing = False
|
||
|
|
||
|
self.update_cartes()
|
||
|
|
||
|
def update_cartes(self):
|
||
|
"""Met à jour les cartes des joueurs"""
|
||
|
self.label_joueur1.config(text=f"Joueur 1: {self.f1.taille()} cartes")
|
||
|
self.label_joueur2.config(text=f"Joueur 2: {self.f2.taille()} cartes")
|
||
|
|
||
|
if not self.f1.est_vide():
|
||
|
carte1 = self.f1.tete()
|
||
|
img1 = f"gui/ressources/{carte1.valeur}-{carte1.couleur}.png"
|
||
|
image1 = Image.open(img1)
|
||
|
image1 = image1.resize((200, 300))
|
||
|
self.photo1 = ImageTk.PhotoImage(image1)
|
||
|
self.canvas_joueur1.create_image(0, 0, anchor=tk.NW, image=self.photo1)
|
||
|
|
||
|
if not self.f2.est_vide():
|
||
|
carte2 = self.f2.tete()
|
||
|
img2 = f"gui/ressources/{carte2.valeur}-{carte2.couleur}.png"
|
||
|
image2 = Image.open(img2)
|
||
|
image2 = image2.resize((200, 300))
|
||
|
self.photo2 = ImageTk.PhotoImage(image2)
|
||
|
self.canvas_joueur2.create_image(0, 0, anchor=tk.NW, image=self.photo2)
|
||
|
|
||
|
def jouer_tour(self):
|
||
|
"""Joue un tour de jeu"""
|
||
|
if self.f1.est_vide() or self.f2.est_vide():
|
||
|
if self.f1.taille() > self.f2.taille():
|
||
|
messagebox.showinfo("Fin de la partie", "Le joueur 1 a gagné!")
|
||
|
else:
|
||
|
messagebox.showinfo("Fin de la partie", "Le joueur 2 a gagné!")
|
||
|
self.restart_game()
|
||
|
self.auto_playing = False
|
||
|
return
|
||
|
|
||
|
|
||
|
cartes_jouees = []
|
||
|
|
||
|
while True:
|
||
|
if self.f1.est_vide() or self.f2.est_vide():
|
||
|
if self.f1.taille() > self.f2.taille():
|
||
|
messagebox.showinfo("Fin de la partie", "Le joueur 1 a gagné!")
|
||
|
else:
|
||
|
messagebox.showinfo("Fin de la partie", "Le joueur 2 a gagné!")
|
||
|
self.restart_game()
|
||
|
self.auto_playing = False
|
||
|
return
|
||
|
|
||
|
carte1 = self.f1.defiler()
|
||
|
carte2 = self.f2.defiler()
|
||
|
cartes_jouees.extend([carte1, carte2])
|
||
|
|
||
|
if carte1.valeur > carte2.valeur:
|
||
|
# Ajoutez chaque carte une par une
|
||
|
for carte in cartes_jouees:
|
||
|
self.f1.enfiler(carte)
|
||
|
break
|
||
|
elif carte2.valeur > carte1.valeur:
|
||
|
# Ajoutez chaque carte une par une
|
||
|
for carte in cartes_jouees:
|
||
|
self.f2.enfiler(carte)
|
||
|
break
|
||
|
else:
|
||
|
if self.f1.taille() < 1 or self.f2.taille() < 1:
|
||
|
messagebox.showinfo("Fin de la partie", "Un joueur n'a pas assez de cartes pour continuer!")
|
||
|
return
|
||
|
cartes_jouees.extend([self.f1.defiler(), self.f2.defiler()])
|
||
|
|
||
|
self.update_cartes()
|
||
|
|
||
|
def restart_game(self):
|
||
|
"""Redémarre le jeu"""
|
||
|
self.jeux = Jeux()
|
||
|
self.f1, self.f2 = self.jeux.distribue(File_lst)
|
||
|
self.update_cartes()
|
||
|
|
||
|
def auto_play(self):
|
||
|
"""Défilement automatique"""
|
||
|
self.auto_playing = True
|
||
|
while not self.f1.est_vide() and not self.f2.est_vide() and self.auto_playing:
|
||
|
self.jouer_tour()
|
||
|
self.root.update()
|
||
|
self.root.after(300)
|
||
|
|
||
|
def quit_auto_play(self):
|
||
|
"""Quitter le défilement automatique"""
|
||
|
self.auto_playing = False
|