PUISSANCE 4 - Python et Tkinter

Résolu/Fermé
GGVisn Messages postés 2 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 24 février 2014 - 21 févr. 2014 à 16:51
GGVisn Messages postés 2 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 24 février 2014 - 24 févr. 2014 à 15:17
Bonjour à toutes et à tous. Nous sommes un groupe de 3 élèves en terminale S, et nous faisons spécialité ISN. Nous voulons créer un puissance 4 sous python et Tkinter.
Nous avons fait en sorte que lorsque l'on clique sur la case, un rond rouge ou jaune s'affiche (pas en rentrant les coordonnées sur le jeu) grâce à .bind et event.
Cependant nous ne parvenons pas à faire en sorte que le jeton tomber directement à la case inoccupée la plus basse, ni à détécter si la partie est terminée ou non (4 jetons alignés en ligne ou en diagonales).
Merci d'avance pour votre aide.

Ci-joint notre programme de départ:


from tkinter import*

def pointeur (event):
global compt,comptR,comptJ
#print(compt)
if(compt==42): #si on clique une derniere fois apres avoir fini
fenetre.quit() #la fenetre se ferme automatiquement
#print("x=",event.x,"\ny=",event.y)
if(event.x<700 and event.y<700): #si le clic de souris est positionné sur le quadrillage
for i in range (7): #on encadre la position du clic
for j in range (6): #a la centaine pres pour detecter
if(i*100<event.x<(i+1)*100 and j*100<event.y<(j+1)*100): #quelle case est concernée par le clic
#print(i+1,j+1)
if (compt%2==0): #si le compteur est pair :
graph.create_oval(100*i,100*j,100+100*i,100+100*j,fill="red") #c'est le joueur rouge qui a joué
comptR=comptR+1 #on place le pion, on fait avancer le compteur et on configure les labels
L2.config(text="Il vous reste "+str(21-comptR)+" pions")
L3.config(text="Vous avez joué "+str(comptR)+" coups")
else : #si le compteur est impair :
graph.create_oval(0+100*i,0+100*j,100+100*i,100+100*j,fill="gold")# c'est le joueur jaune qui a cliqué
comptJ=comptJ+1 #et idem que précédemment
L4.config(text="Il vous reste "+str(21-comptJ)+" pions")
L5.config(text="Vous avez joué "+str(comptJ)+" coups")
if(compt==41): #au dernier clic du jeu, c'est a dire au dernier pion placé
L2.config(text="Match nul") #si il n'y a pas de solution c'est un match nul
L4.config(text="Match nul")
L3.config(text="Vous n'avez pas gagné")
L5.config(text="Vous n'avez pas gagné")
#faudra modifier cette dernière boucle quand il y aura un detecteur des 4 pions alignés mais pour l'instant c'est bien comme ca
compt=compt+1 #on fait avancer le compteur global a chaque fin de def

fenetre=Tk()
fenetre.geometry("1000x600")
fenetre.title("Puissance 4")

compt=0 #c'est le compteur global
comptR=0 #c'est le compteur du joueur rouge
comptJ=0 #le compteur du joueur jaune
#idem pour le compteur jaune
couleur="grey" #la couleur de fond
police="Arial 16"

graph=Canvas(width=1000,height=600,bg=couleur,bd=0)
graph.place(x=-2,y=-2)
graph.create_line(700,0,700,672,fill="black",width=5) #les 2 lignes qui délimittent "l'espace joueur"
graph.create_line(700,300,1002,300,fill="black",width=5)
i=0 #je réinitialise i et j au cas ou comme ils sont utilisés ailleurs dans le programme
j=0
for i in range (7): #les 2 boucles pour dessiner le damier
graph.create_line(100*i,0,100*i,600,fill="black",width=2)
i=0
for i in range (6):
graph.create_line(2,100*i,703,100*i,fill="black",width=2)
i=0

L0=Label(text="Joueur Rouge :",font=police,bg=couleur,fg="red") #toutes les zones de texte
L0.place(x=800,y=20)
L1=Label(text="Joueur Jaune :",font=police,bg=couleur,fg="gold")
L1.place(x=800,y=320)
L2=Label(text="Vous avez 21 pions",font=police,bg=couleur)
L2.place(x=750,y=100)
L3=Label(text="",font=police,bg=couleur)
L3.place(x=750,y=200)
L4=Label(text="Vous avez 21 pions",font=police,bg=couleur)
L4.place(x=750,y=400)
L5=Label(text="",font=police,bg=couleur)
L5.place(x=750,y=500)

graph.bind("<Button-1>",pointeur) #et la fonction bind qui fait tout

fenetre.mainloop()

2 réponses

nidhogg-59 Messages postés 102 Date d'inscription mercredi 20 juin 2012 Statut Membre Dernière intervention 5 décembre 2015 27
22 févr. 2014 à 10:04
Bonjour!
Ce que tu peux faire, c'est créer un tableau, dans lequel il y aurait 6 tableaux de 7 cases (si j'ai bien compris ton damier fait 7casesX6cases) remplis de 0 (vides).
Lorsqu'un joueur joue, regarde si les cases du dessous sont occupées par un jeton(dans ton tableau) et met ton jeton dans la cases le plus basse non occupée:
ton tableau serait:
tableau=[    [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0]]

-tu sais que le joueur a cliqué sur la case x=3, y=0
-tu regarde si les cases tableau[0][3], tableau[1][3], tableau[2][3]...jusqu'à tomber sur une case qui comporte un 1. Tu as deux cas:
-tu trouve une case avec un 1 dedans: tu prends la case du dessus et tu met un 1 à l'intérieur
- tu ne trouve aucun 1: tu met in 1 en tableau[6][3].
Si tu choisis cette méthode, voilà un petit code pour faire ton tableau rapidement:
tableau=[[0]*6 for i in range(7)]


ps: Ton code aurait été mieux indenté, mais bon, c'est pas grave... (en haut de l'éditeur de commentcamarche, il y a 5 icônes, la dernière (la flèche) te permet de
choisir un langage. Tu sélectionne 'python' et tu écris ton code python entre les deux balises)

Sur ce, dis-moi s'il y a un truc que j'ai mal expliqué!
Bonne journée!
0