""" PROJET NSI GROUPE : KELLIAN BITROU, ILHAN COULIBALY, ADRIEN VIGEANT DATE : MAI 2025 THEME : MORPION VERSION : 1 (Joueur contre Joueur) Kellian : - Tracé de la grille - Définition de la fenêtre - Gestion de l'interface (message de victoire) - Dessin des X et des O - Réinitialisation de la grille - Puis aide sur les erreurs Python et aide aux autres membres du groupe Ilhan : - Gestion de l'interactivité - Où afficher les X et les O - Vérification pour les coordonées pour ne pas dessiner hors de la grille Adrien : - Gestion des conditions de victoire - Aide pour l'interactivité et l'affichage des X et O FONCTIONS RÉALISÉES : Tracer la grille, affichage des X et O, gestion de la victoire FONCTIONS NON RÉALISÉES : Jeu en réseau, choix de jouer en joueur contre joueur ou en joueur contre IA, Intelligence Artificielle qui répond aux coups du joueur humain, coupure du jeu quand un joueur à gagné, annonce de l'égalité, altérnance des tours des joueurs """ from turtle import* # CRÉATION DE LA GRILLE def afficher_grille(): setup(1600,900) speed(0) up() hideturtle() # affiche le titre : goto(0,400) down() write("cliqué gauche dans une case pour l'afficher, cliqué droit pour redessiner la grille, appuyez sur R pour reset",align='center') # trace les 3 traits horizondaux : for i in range(4): up() x=-300 y=-300+200*i goto(x,y) down() forward(600) left(90) # trace les 3 traits verticaux : for i in range(4): up() x=-300+200*i y=-300 goto(x,y) down() forward(600) up() color("red") goto(-200,200) goto(0,-200) goto(200,200) goto(-200,0) goto(0,0) goto(200,0) goto(-200,-200) goto(0,-200) goto(200,-200) # VERIFIE S'IL Y A UN GAGNANT def verifier_victoire(): # Lignes for ligne in grille: if ligne[0] == ligne[1] == ligne[2] != 0: return ligne[0] # Colonnes for col in range(3): if grille[0][col] == grille[1][col] == grille[2][col] != 0: return grille[0][col] # Diagonales if grille[0][0] == grille[1][1] == grille[2][2] != 0: return grille[0][0] if grille[0][2] == grille[1][1] == grille[2][0] != 0: return grille[0][2] return 0 # EFFACE LES MESSAGES DE L'INTERACE def effacer_message(): up() goto(-400, 250) down() color("white") write(" ", font=("Arial", 16, "normal")) # AFFICHE UN MESSAGE DE VICTOIRE SUR LE CÔTÉ GAUCHE def afficher_victoire(message): color("black") up() goto(-600, 250) down() write(message, font=("Arial", 16, "normal")) # EFFACER LA GRILLE def effacer_grille(): # cette fonction est appelée si on clique sur le bouton droit de la souris global grille reset() clear() afficher_grille() grille=[[0,0,0],[0,0,0],[0,0,0]] # GESTION CLIC JOUEUR X def cliquer_gauche(x, y): color("red") # Détermine dans quelle case on est if -300 < x < -100 and 100 < y < 300: if grille[0][0] != 0: print("CASE 1 déjà occupée") return up(); goto(-226,155); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[0][0] = 1 elif -100 < x < 100 and 100 < y < 300: if grille[0][1] != 0: print("CASE 2 déjà occupée") return up(); goto(-26,155); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[0][1] = 1 elif 100 < x < 300 and 100 < y < 300: if grille[0][2] != 0: print("CASE 3 déjà occupée") return up(); goto(174,155); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[0][2] = 1 elif -300 < x < -100 and -100 < y < 100: if grille[1][0] != 0: print("CASE 4 déjà occupée") return up(); goto(-226,-55); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[1][0] = 1 elif -100 < x < 100 and -100 < y < 100: if grille[1][1] != 0: print("CASE 5 déjà occupée") return up(); goto(-26,-55); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[1][1] = 1 elif 100 < x < 300 and -100 < y < 100: if grille[1][2] != 0: print("CASE 6 déjà occupée") return up(); goto(174,-55); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[1][2] = 1 elif -300 < x < -100 and -300 < y < -100: if grille[2][0] != 0: print("CASE 7 déjà occupée") return up(); goto(-226,-255); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[2][0] = 1 elif -100 < x < 100 and -300 < y < -100: if grille[2][1] != 0: print("CASE 8 déjà occupée") return up(); goto(-26,-255); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[2][1] = 1 elif 100 < x < 300 and -300 < y < -100: if grille[2][2] != 0: print("CASE 9 déjà occupée") return up(); goto(174,-255); down(); write('\u2715', font=('Arial Unicode MS', 55)); grille[2][2] = 1 else: print("Clique en dehors de la grille") return print(grille) gagnant=verifier_victoire() if gagnant: if gagnant==1: afficher_victoire("le joueur X gagne") elif gagnant==2: afficher_victoire("le joueur O gagne ") # GESTION CLIC JOUEUR O def cliquer_droite(x, y): color("blue") if -300 < x < -100 and 100 < y < 300: if grille[0][0] != 0: print("CASE 1 déjà occupée") return up(); goto(-226,155); down(); write('O', font=('Arial Unicode MS', 55)); grille[0][0] = 2 elif -100 < x < 100 and 100 < y < 300: if grille[0][1] != 0: print("CASE 2 déjà occupée") return up(); goto(-26,155); down(); write('O', font=('Arial Unicode MS', 55)); grille[0][1] = 2 elif 100 < x < 300 and 100 < y < 300: if grille[0][2] != 0: print("CASE 3 déjà occupée") return up(); goto(174,155); down(); write('O', font=('Arial Unicode MS', 55)); grille[0][2] = 2 elif -300 < x < -100 and -100 < y < 100: if grille[1][0] != 0: print("CASE 4 déjà occupée") return up(); goto(-226,-55); down(); write('O', font=('Arial Unicode MS', 55)); grille[1][0] = 2 elif -100 < x < 100 and -100 < y < 100: if grille[1][1] != 0: print("CASE 5 déjà occupée") return up(); goto(-26,-55); down(); write('O', font=('Arial Unicode MS', 55)); grille[1][1] = 2 elif 100 < x < 300 and -100 < y < 100: if grille[1][2] != 0: print("CASE 6 déjà occupée") return up(); goto(174,-55); down(); write('O', font=('Arial Unicode MS', 55)); grille[1][2] = 2 elif -300 < x < -100 and -300 < y < -100: if grille[2][0] != 0: print("CASE 7 déjà occupée") return up(); goto(-226,-255); down(); write('O', font=('Arial Unicode MS', 55)); grille[2][0] = 2 elif -100 < x < 100 and -300 < y < -100: if grille[2][1] != 0: print("CASE 8 déjà occupée") return up(); goto(-26,-255); down(); write('O', font=('Arial Unicode MS', 55)); grille[2][1] = 2 elif 100 < x < 300 and -300 < y < -100: if grille[2][2] != 0: print("CASE 9 déjà occupée") return up(); goto(174,-255); down(); write('O', font=('Arial Unicode MS', 55)); grille[2][2] = 2 else: print("Clique en dehors de la grille") return print(grille) gagnant=verifier_victoire() if gagnant: if gagnant==1: afficher_victoire("le joueur X gagne ") elif gagnant==2: afficher_victoire("le joueur O gagne ") #=============================================================================== # PROGRAMME PRINCIPAL #=============================================================================== grille=[[0,0,0],[0,0,0],[0,0,0]] afficher_grille() onscreenclick(cliquer_gauche) onscreenclick(cliquer_droite, 3) onkeypress(effacer_grille,"r") listen() done()