Besoin d'aide pour une fonction

Nitnekk Messages postés 3 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 26 avril 2010 - 21 avril 2010 à 23:43
Nitnekk Messages postés 3 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 26 avril 2010 - 26 avril 2010 à 15:33
Bonjour à tous je suis étudiant et j'apprends depuis janvier le langage python.
Je dois actuellement réaliser un jeu de mémory ou chaque carte est une lettre. J'ai presque terminé, mais j'ai des problèmes avec la dernière fonction.
Voici l'énoncé:
Créez une fonction action(ligne,colonne)pour retourner une carte. On distinguera s'il s'agit de la première ou deuxième carte du tour. Lorsque l'on retourne la deuxième carte, les deux cartes restent à découvert si elles sont identiques.

Le sujet complet est disponible ici.

Après plusieurs essais, voila ma meilleure tentative (apparemment l'indentation ne marche pas sa ne va pas faciliter le travail ):

carte=0
lettre1=""

def action(ligne,colonne):
global carte
global lettre1
if carte==0: #Autrement dit je retourne la première carte
for lig in range (nombreCases):
for col in range (nombreCases):
if decouvert[lig][col]==False:
canvas.delete (y0 +c*(lig+.5),x0+c*(col+.5))
canvas.delete (y0 +c*(lig+.5),x0+c*(col+.5)) #Je cache les deux cartes précedemment tirées si elles ne sont pas identiques
canvas.create_text (y0 +c*(ligne+.5),x0+c*(colonne+.5),text=matriceLettres[ligne][colonne]) #J'affiche la carte
carte=1
lettre1=matriceLettres[ligne][colonne] #je mémorise la valeur de la carte
else: #je tire la deuxième carte
carte=0
canvas.create_text (y0 +c*(ligne+.5),x0+c*(colonne+.5),text=matriceLettres[ligne][colonne])
lettre2=matriceLettres[ligne][colonne]
if lettre1==lettre2: #Si les deux cartes sont les mêmes
decouvert[ligne][colonne]=True #sa c'étais dans la question 2. Cela indique que la carte est trouvée et qu'il faut la laisser affichée.
if fini():
termine.config(text="La partie est finie") #Sa sa indique que si toutes les cartes on la valeur True, la partie est finie


Mon problème c'est qu'avec cette fonction, seule la deuxième carte prends la valeur True, je ne voit pas comment je peux le faire pour la première. C'est un peu la même chose au début:
for lig in range (nombreCases):
for col in range (nombreCases):
if decouvert[lig][col]==False:
canvas.delete (y0 +c*(lig+.5),x0+c*(col+.5))
canvas.delete (y0 +c*(lig+.5),x0+c*(col+.5))

Il faudrait que je mémorise le lig et le col des 2 cartes précédentes.


Je ne sais pas si vous allez réussir à me suivre avec ce seul bout de code. Je peux si vous le souhaitez écrire tout mon programme.
En esperant avoir été clair et avoir des réponses, merci d'avance.

4 réponses

Rafikiki Messages postés 2 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 26 avril 2010
26 avril 2010 à 10:36
Bonjour, désolé pour la lenteur de ma réponse mais des problèmes internet mon empêcher de retourner sur mon compte principal ... Donc je pense que tu pourrais résoudre ce problème via une autre fonction que tu appelles, pour cela j'aurais besoin de pouvoir accéder à l'intégralité de ton code si cela était possible ( j'ai cru comprendre dans ton lien, que cela était plutôt urgent, j'essaierais de jeter un coup d'œil dessus dès que tu m'auras envoyer l'intégralité de ton code.

( PS: Le 3ème "logo" dans la barre en partant de la fin permet d'insérer du code python.)
0
Nitnekk Messages postés 3 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 26 avril 2010
26 avril 2010 à 11:30
Merci de ta réponse mais effectivement c'est pour demain. J'ai réussi à m'en sortir. Le jeu en lui même fonctionne très bien mais le code est vraiment moche. Je peux te le montrer si tu veux.
0
Rafikiki Messages postés 2 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 26 avril 2010
26 avril 2010 à 12:07
Je veux bien si tu veux je pourrais essayer de l'embellir un petit peu, on ne sait jamais ^^.
0
Nitnekk Messages postés 3 Date d'inscription mercredi 21 avril 2010 Statut Membre Dernière intervention 26 avril 2010
26 avril 2010 à 15:33
Voila c'est assez long, et la fonction action est vraiment très très moche...
# ----------------- Modules nécessaire ---------------------------------------------------------------------------------------------

from Tkinter import *
from random import *


# ----------------- Variables Globales ---------------------------------------------------------------------------------------------

nombreCases=6 #nombre de cases par ligne
x0,y0=10,10  #coordonnées du début de la grille
c=80 #longueur et largeur d'une case
matriceLettres=[["" for x in range (nombreCases)]for x in range (nombreCases)] #matrice vide destinée à accueillir les lettres
decouvert=[[False for x in range (nombreCases)]for x in range (nombreCases)] #matrice destinée à afficher les lettres trouvées
carte=0 #Nombre de cartes tirées. Si 0 je tire la première, si 1 je tire la deuxième
lettre1="" #Va prendre la valeur de la première lettre pour la comparer à la deuxième



#------------------Fonctions -------------------------------------------------------------------------------------------------------

#------------------Question 1: Cette fonction remplit aléatoirement la matrice matriceLettres avec les lettres disponible-----------
def remplissage_matrice():
    global matriceLettres
    global nombreCases
    lettres=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R"]
    dicoLettres={"A":2,"B":2,"C":2,"D":2,"E":2,"F":2,"G":2,"H":2,"I":2,"J":2,"K":2,"L":2,"M":2,"N":2,"O":2,"P":2,"Q":2,"R":2}
    for ligne in range (nombreCases):
        for colonne in range (nombreCases):
            matriceLettres[ligne][colonne]=choice(dicoLettres.keys()) #Pour chaque case je choisit une lettre au hasard
            dicoLettres[matriceLettres[ligne][colonne]]-=1 #Je supprime une fois cette lettre du dictionnaire
            if dicoLettres[matriceLettres[ligne][colonne]]==0: #Si la lettre a été utilisée deux fois, je la supprime
                del dicoLettres[matriceLettres[ligne][colonne]]
    return matriceLettres

#-------------------Question 2: On repère la fin de la partie----------------------------------------------------------------------
def fini():
    for ligne in range (nombreCases):
        for colonne in range (nombreCases):
            if decouvert[ligne][colonne]==False: #S'il reste une case False, la partie n'est pas finie
                return False
    return True

#-------------------Question 4: On affiche les lettres trouvées (ayant la valeur True)---------------------------------------------
def dessin_grille():
    for ligne in range (nombreCases):
        for colonne in range (nombreCases):
            if decouvert[ligne][colonne]==True: # Pour chaque case découvert, j'affiche la lettre dans le canvas
                canvas.create_text (y0 +c*(ligne+.5),x0+c*(colonne+.5),text=matriceLettres[ligne][colonne])

#-------------------Question 5: On crée la grille et on associe une lettre par case. (Bouton Recommencer)--------------------------
def init():
    global lettre1
    lettre1="" #On commencera forcément par tirer la première carte
    canvas.delete(ALL) #J'efface tout ce qui était affiché dans le canvas
    termine.config(text="Bonne Partie") #J'affiche le texte bonne partir
    for ligne in range (nombreCases):
        for colonne in range (nombreCases): #J'indique qu'aucune case n'est trouvée
            decouvert[ligne][colonne]=False 
    for i in range(nombreCases+1): #Je crée les lignes
        canvas.create_line(x0+c*i, y0,x0+c*i,y0 + nombreCases*c)
        canvas.create_line(x0, y0+c*i,x0+nombreCases*c ,y0+c*i)
    remplissage_matrice() #J'utilise cette fonction pour associer à chaque case une lettre

#-------------------Question 5: On retourne une carte, une autre et on les compare------------------------------------------------
def action(ligne,colonne):
    global carte
    global lettre1
    if decouvert[ligne][colonne]==False: #Si je clique sur une carte non affichée
        if carte==0: # Premier cas, je tire la première carte
            carte=1 #Au prochain coup je tirerais la deuxième
            
            #Je veux effacer les deux cartes précédentes si elles sont différentes, la méthode est certainement perfectible
            canvas.delete(ALL) #Je commence par tous supprimer
            for i in range(nombreCases+1): #Je retrace les lignes
                canvas.create_line(x0+c*i, y0,x0+c*i,y0 + nombreCases*c)
                canvas.create_line(x0, y0+c*i,x0+nombreCases*c ,y0+c*i)
            dessin_grille() #J'affiche les lettres qui étaient déja trouvée (valeur True)
        
            decouvert[ligne][colonne]=True #J'affiche la première lettre
            dessin_grille()
            lettre1=matriceLettres[ligne][colonne] #Je la mémorise
        else: # Deuxième cas, je tire la deuxième carte
            carte=0 #Au prochain coup je tirerais la première et recommencerais un tour
            canvas.create_text (y0 +c*(ligne+.5),x0+c*(colonne+.5),text=matriceLettres[ligne][colonne]) #J'affiche la deuxième lettre
            lettre2=matriceLettres[ligne][colonne] #Je la mémorise
            if lettre1!=lettre2:
                for lig in range (nombreCases):
                    for col in range (nombreCases): #Je recherce donc quelle case avait la lettre1
                        if matriceLettres[lig][col]==lettre1:
                            decouvert[lig][col]=False #Et je la laisse découvert
            else: #Si les deux lettres sont identiques:
                decouvert[ligne][colonne]=True #La deuxième carte doit donc rester découverte (True)
                if fini(): #Je regarde si la partie est terminée
                    termine.config(text="La partie est finie") #Si oui je change le texte
    
#-------------------Question 5: On remmene le clic a une case ---------------------------------------------------------------------
def correspond(x,y):
    return (x-x0)/c,(y-y0)/c

#-------------------Question 5: On repère la case du clic et on appelle action(ligne,colonne)--------------------------------------
def retourner(event):
    pos=correspond(event.x,event.y)
    ligne=pos[0]
    colonne=pos[1]
    if ligne in range(nombreCases) and colonne in range (nombreCases):
        action(ligne,colonne)
    

#-------------------Fonction quitter ----------------------------------------------------------------------------------------------
def quitter():
    memory.quit()
    memory.destroy()
    

#-------------------Fenetre Tkinter -----------------------------------------------------------------------------------------------    
memory=Tk()

#-------------------Création des widgets-------------------------------------------------------------------------------------------
titre=Label(memory, text="Jeu du memory") #le titre
termine=Label(memory, text="Bonne Partie") #l'encouragement qui se transforme en félicitation
canvas=Canvas(memory, width=500, height=500) #le canvas
boutonQuitter=Button(memory, text="Quitter", command=quitter) #le bouton quitter
boutonRecommencer=Button(memory, text="Recommencer une partie", command=init) #le bouton recommencer

#-------------------Placement des widgets------------------------------------------------------------------------------------------
titre.grid(row=0, column=0)
canvas.grid(row=1, column=0)
boutonQuitter.grid(row=2, column=0)
boutonRecommencer.grid(row=1, column=1)
termine.grid(row=2, column=1)

canvas.bind("",retourner)

memory.mainloop() #Je ferme le tout
0
Rejoignez-nous