you360
Messages postés11Date d'inscriptionmercredi 30 juillet 2008StatutMembreDernière intervention17 avril 2014
-
Modifié par you360 le 20/03/2014 à 15:43
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 2022
-
18 avril 2014 à 21:29
Bonjour,
Nous sommes en Terminal S spécialité ISN et nous devons finir notre projet de jeux memory en python pour fin avril.
Donc nous avons pas mal progréssé dans notre programme cependant nous ne savons pas comment faire pour detecter les couleurs cliqués par l'utilisateur, pouvez vous nous aidez.
Voici un aperçu de notre programme :
from tkinter import* from random import* import random from math import*
while couleur!=[]: sel=couleur[0] "création du terrain de base" c=0 ligne=0 while ligne<8: while total<8: sel=couleur[0] can.create_rectangle(total*35+20, 10+ligne*50, total*35+40, 50+ligne*50, fill=sel)#à chaque fin de ligne on rajoute +1 pour aller à la ligne suivante jusqu'à atteidnre 8 lignes del(couleur[0]) total=total+1 ligne=ligne+1 total=0
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 21 mars 2014 à 00:14
Bonsoir,
Il y a deux choses à faire:
1- Détecter ou a eu lieu le clic de souris (Voir Event et Binding)
2- Mémoriser la couleur au moment de chaque create_rectangle
Ce n'est pas très compliqué:
1- Activer la détection d'un évenement
#Active la détection de l'évenement <clic gauche> dans les rectangles du canvas can.bind("<Button-1>", clic_gauche)
A mettre ligne 48 après la création du canvas (clic_gauche étant la procédure qui traitera l'évènement )
2- Mémoriser la couleur
Lors de la création de chaque rectangle, il est possible de lui adjoindre un tag ou étiquette avec un libellé libre, en l'occurrence on mémorisera la couleur.
Je vous remercie lespinx pour votre aide précieuse nous avons progressé un petit peu mais on bloque pour pouvoir "retourner les cartes" ou remettre des rectangles gris lorsque les cartes ne sont pas de la même couleur.
Nous avons reussi a mettre les coordonées des rectangles gris comme etant un tags, voici la synthaxe : ligne.colonne
J'ai lu des articles qui parle de background en tags mais je n'ai pas réussi à les utiliser. Si jamais on reussi a les utilisés on pourrai supprimer les paires de carte sous les carte grise en comparant les tags background"
Voici notre progression :
from tkinter import* from random import* import random from math import*
while couleur!=[]: sel=couleur[0] "création du terrain de base" c=0 ligne=0 while ligne<8: while colonne<8: sel=couleur[0] can.create_rectangle(colonne*35+20, 10+ligne*50, colonne*35+40, 50+ligne*50, fill=sel,tags = sel)#à chaque fin de ligne on rajoute +1 pour aller à la ligne suivante jusqu'à atteidnre 8 lignes can.create_rectangle(colonne*35+20, 10+ligne*50, colonne*35+40, 50+ligne*50, fill="dark grey", tags=ligne+(colonne/10))
#Lecture du tag courant (a l'endroit du clic) couleur = can.gettags("current")
#Si on a pas cliqué dans un rectangle -couleur- est vide if couleur: #can.create_rectangle(total*35+20, 10+ligne*50, total*35+40, 50+ligne*50, fill=sel,tags = sel) print(couleur[0]) print(couleur) #if couleur= can.delete(couleur[0])
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 29 mars 2014 à 00:33
Bonsoir,
Pour modifier la couleur d'un canvas on utilise l'instruction:
can.itemconfigure("current", fill="dark grey")
Voici une proposition:
1er clic ==> affiche la couleur à découvrir
2ème clic ==> affiche la couleur découverte (pendant 1 seconde)
Si les 2 couleurs correspondent les 2 rectangles sont effacés.
Sinon la couleur découverte par le 2ème clic est remise à la couleur initiale.
# -*- coding: ISO-8859-15 -*- from tkinter import* from random import shuffle import time
while couleur!=[]: sel=couleur[0] #création du terrain de base" c=0 ligne=0 while ligne<8: while colonne<8: sel=couleur[0] can.create_rectangle(colonne*35+20, 10+ligne*50, colonne*35+40, 50+ligne*50, fill="dark grey", tags=(ligne+(colonne/10), sel)) del(couleur[0]) colonne=colonne+1 ligne=ligne+1 colonne=0
def clic_gauche(event): global test, couleur_clic_1, coord_clic_1
#Lecture du tag courant (a l'endroit du clic) tag = can.gettags("current")
#Si on a pas cliqué dans un rectangle -tag- est vide if tag: print(tag)
#On révele la couleur cachée can.itemconfigure("current", fill=tag[1]) can.update() #Force le rafraichissement de l'écran
#Si 1er clic if test: couleur_clic_1 = tag[1] #On mémorise la couleur coord_clic_1= tag[0] #On mémorise les coordonnées test = False #Ce n'est plus le 1er clic return #On quitte la fonction
#Si 2ème clic if not test:
#Comparaison des 2 couleurs if couleur_clic_1 == tag[1]: print("Gagné",couleur_clic_1, tag[1])
#Suppression des 2 rectangles gagnants can.delete("current") can.delete(coord_clic_1)
#Re-initialisation 1er clic test = True
else: print("Perdu",couleur_clic_1, tag[1]) #Temporisation de l'affichage en secondes time.sleep(1) #On masque la couleur perdante can.itemconfigure("current", fill="dark grey")
Bonjour,
Merci de votre aide précieuse, nous avons progressé et nous avons modifié un peu le programme pour éviter les double clic sur la même carte qui retirait la carte.
Notre problème est que nous avons pas de fin au jeux, j'ai fait des recherche et il me semble que cela peut être possible avec une variable fin_jeu=false mais je ne sais pas comment ni ou la placé.
voici notre progression :
from tkinter import* from random import* import random from math import* import time
while couleur!=[]: sel=couleur[0] #création du terrain de base" c=0 ligne=0 while ligne<8: while colonne<8: sel=couleur[0] can.create_rectangle(colonne*35+20, 10+ligne*50, colonne*35+40, 50+ligne*50, fill="dark grey", tags=(ligne+(colonne/10), sel)) del(couleur[0]) colonne=colonne+1 ligne=ligne+1 colonne=0
def clic_gauche(event): global test, couleur_clic_1, coord_clic_1
#Lecture du tag courant (a l'endroit du clic) tag = can.gettags("current")
#Si on a pas cliqué dans un rectangle -tag- est vide if tag: print(tag)
#On révele la couleur cachée can.itemconfigure("current", fill=tag[1]) can.update() #Force le rafraichissement de l'écran
#Si 1er clic if test: couleur_clic_1 = tag[1] #On mémorise la couleur coord_clic_1= tag[0] #On mémorise les coordonnées test = False #Ce n'est plus le 1er clic return #On quitte la fonction
#Si 2ème clic if not test:
#Comparaison des 2 tag #if coord_clic_1 == tag[0]: #print("mauvais clic")
#Comparaison des 2 couleurs if couleur_clic_1 == tag[1] and coord_clic_1 != tag[0]: print("Gagné",couleur_clic_1, tag[1])
#Suppression des 2 rectangles gagnants time.sleep(0.5) #can.delete(couleur[0]) can.delete("current") can.delete(coord_clic_1)
#Re-initialisation 1er clic test = True
else: print("Perdu",couleur_clic_1, tag[1]) #can.gettags(tag[1]) == tag[1] #Temporisation de l'affichage en secondes test=True time.sleep(0.5) #On masque la couleur perdante can.itemconfigure("current", fill="dark grey") can.itemconfigure(coord_clic_1, fill="dark grey")
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 13 avril 2014 à 11:08
Bonjour,
Fin de jeu : Dans le pavé "#Suppression des 2 rectangles gagnants" il suffit de décrémenter 2 cases du nombre de cases restantes.
Au début Nb_cases_restantes = lignes x colonnes
Si Nb_cases_restantes > 2 ==> fin du jeu
Nb_cases_restantes = 0 le nombre de couleurs appairées était pair
Nb_cases_restantes = 1 le nombre de couleurs appairées était impair, dans ce cas il reste une case.
Nb_cases_restantes devra être déclarée comme une variable globale dans la procédure principale pour être vue dans les procédures appelées .
Le bouton 'Fin du jeu' n'apparait pas : il manque la méthode .pack appliquée au bouton.
Attention Tkinter n'aime pas le mélange des méthodes .grid et .pack, dans votre cas l'utilisation de la méthode .grid n'est pas justifiée.
Procédure def carte(): A quoi servent les variables aleax et aleay?
Inutile de dupliquer les couleurs dans la liste "couleur" == > couleur = ["red","blue","yellow","green","red"] est suffisant.
Inutile de supprimer une couleur (ligne 27) à chaque création de rectangle, il suffit d'insérer "shuffle(couleur)" avant chaque création de rectangle et la couleur sera aléatoire.
La procédure "def carte()" peut être optimisée en utilisant plutôt l'instruction "for" au lieu de "while"
Cette procédure peut s'écrire en 5 lignes maximum.
you360
Messages postés11Date d'inscriptionmercredi 30 juillet 2008StatutMembreDernière intervention17 avril 2014 17 avril 2014 à 15:49
Merci beaucoup de votre aide encore une fois, nous allons nous occuper de l'optimisation du code surement la semaine prochaine ainsi que pour la fin du jeu.
Notre problème est que lorsque on essaye de creer du texte sur la fenêtre pour afficher le nombre de clic :