Jeux memory en python

Signaler
Messages postés
11
Date d'inscription
mercredi 30 juillet 2008
Statut
Membre
Dernière intervention
17 avril 2014
-
lespinx
Messages postés
97
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
7 décembre 2018
-
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*


def carte():
aleax=50
aleay=100
couleur=["red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green",]
random.shuffle(couleur)
total, r=0, 0
#print(couleur)

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



fen=Tk()
can=Canvas(fen, width=300, height=410, bg='ivory')
can.grid(row=0)
bstop=Button(fen, text='Fin du jeu', command=fen.quit)

carte()
#print(carte)


fen.mainloop()
A voir également:

7 réponses

Messages postés
97
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
7 décembre 2018
46
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.
can.create_rectangle(total*35+20, 10+ligne*50, total*35+40, 50+ligne*50, fill=sel,tags = sel)

3- Ajouter la procédure -clic_gauche-
def clic_gauche(event):
#Pour infos : coordonnées du clic
print ("event.x =", event.x, "event.y =",event.y)

#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:
print(couleur[0])
else:
print("Mauvais clic")

--
Messages postés
97
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
7 décembre 2018
46
Bonsoir,

message.pack(side="top", fill=X)

La syntaxe exacte est:
message.pack(side=TOP, fill=X)

--
Messages postés
11
Date d'inscription
mercredi 30 juillet 2008
Statut
Membre
Dernière intervention
17 avril 2014

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*


def carte():
aleax=50
aleay=100
couleur=["red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green",]
save=couleur
random.shuffle(couleur)
colonne, r=0, 0
ligne=0
#print(couleur)

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))

del(couleur[0])
colonne=colonne+1
ligne=ligne+1
colonne=0


def clic_gauche(event):
#Pour infos : coordonnées du clic
print ("event.x =", event.x, "event.y =",event.y)

#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])

else:
print("Mauvais clic")


fen=Tk()
can=Canvas(fen, width=300, height=410, bg='ivory')
can.grid(row=0)
bstop=Button(fen, text='Fin du jeu', command=fen.quit)

carte()
can.bind("<Button-1>", clic_gauche)
#print(carte)


fen.mainloop()
Messages postés
97
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
7 décembre 2018
46
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

test = True

def carte():
aleax=50
aleay=100
couleur=["red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green",]
shuffle(couleur)
colonne, r=0, 0
ligne=0
#print(couleur)

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")

else:
print("Mauvais clic")


fen=Tk()
can=Canvas(fen, width=300, height=410, bg='ivory')
can.grid(row=0)
bstop=Button(fen, text='Fin du jeu', command=fen.quit)

carte()
can.bind("<Button-1>", clic_gauche)
#print(carte)


fen.mainloop()

--
Messages postés
11
Date d'inscription
mercredi 30 juillet 2008
Statut
Membre
Dernière intervention
17 avril 2014

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

test = True

def carte():
aleax=50
aleay=100
couleur=["red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green","red","red","blue","blue","yellow","yellow","green","green",]
shuffle(couleur)
colonne, r=0, 0
ligne=0
#print(couleur)

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")

else:
print("Mauvais clic")




fen=Tk()
can=Canvas(fen, width=300, height=410, bg='ivory')
can.grid(row=0)
bstop=Button(fen, text='Fin du jeu', command=fen.quit)

carte()
can.bind("<Button-1>", clic_gauche)
#print(carte)


fen.mainloop()
Messages postés
97
Date d'inscription
lundi 9 octobre 2006
Statut
Membre
Dernière intervention
7 décembre 2018
46
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.

Cordialement.
--
Messages postés
11
Date d'inscription
mercredi 30 juillet 2008
Statut
Membre
Dernière intervention
17 avril 2014

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 :
message = Label(fen, text="Notre fenêtre")
message.pack(side="top", fill=X)

La fênetre de jeux s'ouvre mais il n'affiche plus le jeux.