Puissance 4 python tkinter
Résolu
Bonjour à tous !
J'ouvre ce topic car j'ai besoin d'un peu d'aide sur mon programme... Alors voila, je suis en classe de 1ère spécialité NSI et nous devons faire un programme (censé) ressembler au puissance 4 que l'on connait tous avec une grille de 6 rangées et 7 colonnes.
Mon problème est le suivant : Comment détecter que l'un des joueurs a gagné ?
On a vu en cours qu'il faut faire un mini tableau à double entrée au debut du programme avec des chiffres (0 quand il n'y a pas de jetons , 1 quand c'est jaune et 2 quand c'est rouge par exemple) .Le programme aligne bien les jetons mais ce n'est pas très intéressant un puissance 4 sans gagnants!
Merci à ceux qui répondront .
Voici mon programme :
J'ouvre ce topic car j'ai besoin d'un peu d'aide sur mon programme... Alors voila, je suis en classe de 1ère spécialité NSI et nous devons faire un programme (censé) ressembler au puissance 4 que l'on connait tous avec une grille de 6 rangées et 7 colonnes.
Mon problème est le suivant : Comment détecter que l'un des joueurs a gagné ?
On a vu en cours qu'il faut faire un mini tableau à double entrée au debut du programme avec des chiffres (0 quand il n'y a pas de jetons , 1 quand c'est jaune et 2 quand c'est rouge par exemple) .Le programme aligne bien les jetons mais ce n'est pas très intéressant un puissance 4 sans gagnants!
Merci à ceux qui répondront .
Voici mon programme :
from tkinter import * import random fen=Tk() fen.title("échafaudage") fen.geometry("1300x1300") JEU = [[0,0,0,0,0,0,0,8], #Tableau a double entrée , le 8 est utilisé comme bordure [0,0,0,0,0,0,0,8], [0,0,0,0,0,0,0,8], [0,0,0,0,0,0,0,8], [0,0,0,0,0,0,0,8], [0,0,0,0,0,0,0,8]] #Initialisation de la grille def trace_ligne_ver(x): x1=x y1=100 x2=x y2=700 Zone.create_line(x1,y1,x2,y2,width=1,fill="black") def trace_ligne_hor(x): x1=100 y1=x x2=800 y2=x Zone.create_line(x1,y1,x2,y2,width=1,fill="black") Zone=Canvas(fen,width=1000,height=900,bg="white") Zone.place(x=0,y=0) x=0 while x!=900: trace_ligne_ver(x) x=x+100 x=0 while x!=800: trace_ligne_hor(x) x=x+100 Joueur=random.randint(1,2) total=0 def Attendre_clic(event): global JEU global Joueur Nbre_jetons=0 global total xClic,yClic = event.x,event.y if 100<xClic<800: #Vérifier que le clic est dans le tableau colonne=Recherche_colonne(xClic) ligne=Recherche_ligne(colonne) if Joueur==1: #tour joueur rouge Zone.create_oval(colonne*100-20+150,ligne*100+170,colonne*100+20+150,ligne*100+130, fill='red') #Placement du jeton au milieu de la case Joueur=2 print("C'est au tour du joueur 2") JEU[ligne][colonne]=1 #Définir que cette case est rouge dans le tableau total=total+1 elif Joueur==2: #Tour du joueur jaune Zone.create_oval(colonne*100-20+150,ligne*100+170,colonne*100+20+150,ligne*100+130, fill='yellow') Joueur=1 print("C'est au tour du joueur 1") JEU[ligne][colonne]=2 total=total+1 if total==42: #Vérification de tout les jetons placés pour l'égalité print("égalité") fen.bind("<Button-1>", Attendre_clic) def Recherche_colonne(xClic): colonne=(xClic)//100-1 #Définir dans quelle colonne est le clic return colonne def Recherche_ligne(colonne): ligne1=5 for loop in range (6): #Vérifier si des jetons sont déjà présent dans la colonne pour choisir la ligne if JEU[ligne1][colonne]==0: ligne=ligne1 else: ligne1=ligne1-1 return ligne chaine = Label(fen) chaine.pack() fen.mainloop()
A voir également:
- Puissance 4 python corrigé
- +33 4 24 47 31 44 ✓ - Forum Mobile
- Test puissance pc - Guide
- Puissance en c++ - Forum C++
- Transmath 3eme corrigé pdf ✓ - Forum Études / Formation High-Tech
- Citizen code python avis - Accueil - Outils
1 réponse
mamiemando
Messages postés
33778
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
11 septembre 2025
7 884
7 févr. 2020 à 09:27
7 févr. 2020 à 09:27
Bonjour
Plusieurs conseils préalables
Passons à ta question
Moi j'aurais par exemple écrit :
Exemples :
Bonne chance
Plusieurs conseils préalables
- Concernant le message, soigne l'orthographe et utilise les balises de code (4e bouton) afin de le mettre en forme
- N'utilise pas de variable globale. C'est une très mauvaise habitude de programmation. Passe simplement tes variables globales actuelles comme des paramètres de fonction
- Suis les conventions PEP8 (autant prendre les bonnes habitudes) pour avoir un programme propre. Si tu utilises pycharm il te guidera.
- Pas réellement besoin d'avoir une interface Tk pour expliquer ton problème (tu aurais pu faire un puissance 4 en mode texte). Généralement il est bon de séparer le moteur du jeu (qui stocke le placement des pions, les règles...) du rendu (en mode texte, en mode graphique).
Passons à ta question
- La manière dont tu installes un pion sur le plateau est améliorable / incomplète. Un while serait plus approprié. À colonne donnée, tant que la case est occupée, on monte d'un cran. Si la case ne dépasse pas le haut du plateau, alors on peut installer le pion dans cette case. Sinon, on refuse le placement du jeton.
- La recherche de victoire consiste à chercher une ligne / colonne / diagonale peut se faire de plusieurs façon. Déjà il n'est utile de faire cette recherche que pour le joueur courant. La manière la plus simple de procéder en python est d'utiliser l'inclusion. Il suffit d'appliquer le raisonnement suivant. Pour chaque ligne (resp. colonne, resp. diagonale), tu extraies la liste
l
de cases correspondantes. Cela te donne une liste d'entiers. En admettant que le joueur courant soitj = 1
, le problème revient à chercher la sous-liste[j, j, j, j]
dansl
. Pour cela tu peux chercher comment faire sur internet (par exemple cette page) ou écrire toi-même une petite boucle.
Moi j'aurais par exemple écrit :
def find_sublist(sl, l): n = len(sl) for i in range(len(l)): if sl == l[i:i+n]: return True return False
Exemples :
In [3]: find_sublist([1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0, 0])
Out[3]: True
In [4]: find_sublist([1, 1, 1, 1], [0, 0, 1, 1, 0, 1, 0, 0])
Out[4]: False
Bonne chance