# ########################################################################### # Projet : Puissance 4 # Programmeurs : Tony, Gianni, Nolhann et ChatGPT # Mai 2026 # nsi.gecif.net # ########################################################################### """ Le jeu proposé est un puissance 4, pour jouer il faut simplement séléctionné entre Joueur ou IA L'IA joue grace a un algorithme qui s'electionne une colonne aleatoirement (l'IA joue alors aleatoirement) Pour le bouton joueur lorse qu'il est selectionné deux joueur s'affronte sur la meme machine chaque joueur joue un coup a la fois. En cas de victoir ou defaite, la couleur du gagnant serras affiché. En cas d'égalité il y auras un texte indiquant une égalité. """ from tkinter import * import random # ----------------------------- # CONSTANTES DU JEU # ----------------------------- NB_LIGNES = 6 NB_COLONNES = 7 TAILLE_CASE = 80 LARGEUR = NB_COLONNES * TAILLE_CASE HAUTEUR = NB_LIGNES * TAILLE_CASE VIDE = 0 JOUEUR_ROUGE = 1 JOUEUR_JAUNE = 2 # ----------------------------- # CLASSE DU JEU # ----------------------------- class Jeu: """Creation de la classe Jeu """ def __init__(self, fenetre, mode): self.fenetre = fenetre self.mode = mode self.grille = [] for i in range(NB_LIGNES): ligne = [] for j in range(NB_COLONNES): ligne.append(VIDE) self.grille.append(ligne) self.joueur_actuel = JOUEUR_ROUGE self.partie_finie = False self.canvas = Canvas( fenetre, width=LARGEUR, height=HAUTEUR, bg="blue" ) self.canvas.pack() self.label = Label( fenetre, text="Tour du joueur rouge", font=("Arial", 16) ) self.label.pack(pady=10) self.canvas.bind("", self.clic_joueur) self.dessiner_grille() def dessiner_grille(self): """Creation de la fonction qui s'occupe de crée la grille""" self.canvas.delete("all") for ligne in range(NB_LIGNES): for colonne in range(NB_COLONNES): x1 = colonne * TAILLE_CASE + 10 y1 = ligne * TAILLE_CASE + 10 x2 = x1 + TAILLE_CASE - 20 y2 = y1 + TAILLE_CASE - 20 valeur = self.grille[ligne][colonne] if valeur == VIDE: couleur = "white" elif valeur == JOUEUR_ROUGE: couleur = "red" else: couleur = "yellow" self.canvas.create_oval(x1, y1, x2, y2, fill=couleur) def clic_joueur(self, event): """Detection du click du joueur """ if self.partie_finie: return colonne = event.x // TAILLE_CASE if colonne < 0 or colonne >= NB_COLONNES: return coup_valide = self.jouer_coup(colonne) if coup_valide: self.apres_coup() def jouer_coup(self, colonne): """focntion qui adapte la grille pendant le coup""" for ligne in range(NB_LIGNES - 1, -1, -1): if self.grille[ligne][colonne] == VIDE: self.grille[ligne][colonne] = self.joueur_actuel self.dessiner_grille() return True return False def apres_coup(self): """Rafrechissement de la grille apres coup""" if self.verifier_victoire(self.joueur_actuel): if self.joueur_actuel == JOUEUR_ROUGE: self.label.config(text="Le joueur rouge a gagné !") else: self.label.config(text="Le joueur jaune a gagné !") self.partie_finie = True return if self.grille_pleine(): self.label.config(text="Match nul !") self.partie_finie = True return self.changer_joueur() if self.mode == "IA" and self.joueur_actuel == JOUEUR_JAUNE: self.fenetre.after(500, self.tour_ia) def changer_joueur(self): """Fonction qui alterne entre les deux joueurs apres coup""" if self.joueur_actuel == JOUEUR_ROUGE: self.joueur_actuel = JOUEUR_JAUNE self.label.config(text="Tour du joueur jaune") else: self.joueur_actuel = JOUEUR_ROUGE self.label.config(text="Tour du joueur rouge") def tour_ia(self): """Fonction IA qui genere un nombre aleatoir entre 0 et 6""" if self.partie_finie: return colonne = random.randint(0, 6) while self.colonne_pleine(colonne): colonne = random.randint(0, 6) self.jouer_coup(colonne) self.apres_coup() def colonne_pleine(self, colonne): """Fonction qui indique qu'une colonne est pleine""" return self.grille[0][colonne] != VIDE def grille_pleine(self): """Fonction qui indique qu'une grille est pleine""" for colonne in range(NB_COLONNES): if self.grille[0][colonne] == VIDE: return False return True def verifier_victoire(self, joueur): # Vérification horizontale for ligne in range(NB_LIGNES): for colonne in range(NB_COLONNES - 3): if self.grille[ligne][colonne] == joueur and \ self.grille[ligne][colonne + 1] == joueur and \ self.grille[ligne][colonne + 2] == joueur and \ self.grille[ligne][colonne + 3] == joueur: return True # Vérification verticale for ligne in range(NB_LIGNES - 3): for colonne in range(NB_COLONNES): if self.grille[ligne][colonne] == joueur and \ self.grille[ligne + 1][colonne] == joueur and \ self.grille[ligne + 2][colonne] == joueur and \ self.grille[ligne + 3][colonne] == joueur: return True # Vérification diagonale descendante for ligne in range(NB_LIGNES - 3): for colonne in range(NB_COLONNES - 3): if self.grille[ligne][colonne] == joueur and \ self.grille[ligne + 1][colonne + 1] == joueur and \ self.grille[ligne + 2][colonne + 2] == joueur and \ self.grille[ligne + 3][colonne + 3] == joueur: return True # Vérification diagonale montante for ligne in range(3, NB_LIGNES): for colonne in range(NB_COLONNES - 3): if self.grille[ligne][colonne] == joueur and \ self.grille[ligne - 1][colonne + 1] == joueur and \ self.grille[ligne - 2][colonne + 2] == joueur and \ self.grille[ligne - 3][colonne + 3] == joueur: return True return False # ----------------------------- # CLASSE MENU # ----------------------------- class Menu: """Classe Menu : elle sert à afficher le menu ou l'on choisi contre qui on joue (IA ou joueur) """ """création def__init__""" def __init__(self, fenetre): self.fenetre = fenetre self.frame = Frame(fenetre) self.frame.pack(pady=100) self.titre = Label( self.frame, text="Choisis ton mode de jeu", font=("Arial", 24) ) self.titre.pack(pady=20) self.bouton_ia = Button( self.frame, text="IA", font=("Arial", 18), width=15, command=self.lancer_ia ) self.bouton_ia.pack(pady=10) self.bouton_joueur = Button( self.frame, text="Joueur", font=("Arial", 18), width=15, command=self.lancer_joueur ) self.bouton_joueur.pack(pady=10) def lancer_ia(self): """Fonction qui envoie en paramettre IA a la classe jeu apres avoir supprimé le menu""" self.frame.destroy() Jeu(self.fenetre, "IA") def lancer_joueur(self): """Fonction qui envoie en paramettre JOUEUR a la classe jeu apres avoir supprimé le menu""" self.frame.destroy() Jeu(self.fenetre, "JOUEUR") # ----------------------------- # LANCEMENT DU PROGRAMME # ----------------------------- fenetre = Tk() fenetre.title("Puissance 4") menu = Menu(fenetre) fenetre.mainloop()