IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Création du jeu Voltorb Flip sous Python


Sujet :

Python

  1. #21
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Voici mon message d'erreur après avoir téléchargé PIL :

    "File "C:\Python27\lib\site-packages\PIL\Image.py", line 1988, in open
    fp = builtins.open(fp, "rb")
    IOError: [Errno 2] No such file or directory: 'Carre_rouge.save.jpg'

    Il me semble que c'est parce que "path" n'arrive pas à trouver l'image "Carre_rouge.save.jpg" que j'ai pourtant téléchargé et conservé tel quel (je n'ai pas renommer l'image)

  2. #22
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Ce fichier se trouve-t-il dans le même répertoire que l'emplacement de ton code?

    EDIT:

    Entre parenthèse, le code est fonctionnel, il est testé, si problème il y a ce n'est pas dans le code

    Si je ne teste pas, je préviens toujours...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #23
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Lorsque je supprime ces deux lignes :

    carre = draw("Carre_rouge.save.jpg") # retourne l'instance photoimage
    construct(canvas, 50, 20, 0, cases, carre) # construction des carres

    Je n'ai pas de message d'erreur et une fenêtre Tkinter s'ouvre (même si évidemment, vu qu'on a supprimé les deux lignes concernant l'affichage du carré rouge, il n'y a aucun dessin qui se forme).

    Sinon, j'ai enregistré mon projet Geany sur le dossier Python 27, mon image "Carre_rouge.save.jpg" s'y trouve aussi.

    Cependant, avant, je n'avais pas c/c l'intégralité de mon message d'erreur, le voici :

    Traceback (most recent call last):
    File "essai3.py", line 81, in <module>
    carre = draw("Carre_rouge.save.jpg") # retourne l'instance photoimage
    File "essai3.py", line 36, in draw
    image = Image.open(path)
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 1988, in open
    fp = builtins.open(fp, "rb")
    IOError: [Errno 2] No such file or directory: 'Carre_rouge.save.jpg'
    Appuyez sur une touche pour continuer...
    Je me suis rendu sur "C:\Python27\lib\site-packages\PIL\Image.py" Le fichier Image.py que j'ai ouvert avec Geany montre un code d'environ 2000 lignes. Peut-être que la ligne de mon code où il y a inscrit "image = Image.open(path)" ouvre ce fichier "Image.py" au lieu d'ouvrir "Carre_rouge.save.jpg" ?
    Du coup, j'ai voulu modifier cette ligne : "image = Image.open(path)" et j'ai mis à la place de "Image" le nom ""Carre_rouge.save". Cela n'a malheureusement pas réglé le problème.

  4. #24
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Mais l'erreur est explicite, il ne trouve pas le fichier, il faut dans ce cas indiquer l'emplacement correct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    draw("C:\\Python27\\Carre_rouge.save.jpg") # peut-être...
    Ou quelque chose du genre, je ne suis pas chez toi pour savoir où se trouve exactement ton fichier.

    Sinon plus simple garde tel quel mon code et modifie la fonction draw(pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def draw(path):
        "path est l'endroit où se trouve ton dessin"
        import os
        path = os.path.join(os.getcwd(), path)
        try:
            image = Image.open(path)
        except:
            print("l'image doit se trouver dans {}".format(os.getcwd())
        photo = ImageTk.PhotoImage(image)
        return photo
    Si il dit qu'il ne retrouve pas le fichier, il t'indiqueras où doit se trouver ton fichier "Carre_rouge.save.jpg"

    Dis moi ce qu'il te retourne...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #25
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Excusez-moi, l'erreur était toute bête.

    J'avais dans mon code "carre = draw("Carre_rouge.save.jpg")"

    En fait, ce n'était pas ".save" qu'il fallait mettre, mais "_save".

    J'ai maintenant mon tableau qui affiche mes 25 cases rouges et la fonction "click" marche à merveille. Il faut maintenant que lorsque je clique sur une case rouge, cela me retourne une valeur (0, 1, 2 ou 3) Je vais voir ce que je peux faire et je posterai ce soir ce qu'il en est.

  6. #26
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Ok ça roule donc, pour le texte, on va continuer, je pense que tu n'es plus trop dans le même trip que moi, ça sera sans doute difficile, n'est en moins, tu peux analyser un peu ma manière de faire.

    Dans notre cas, il faudrait ajouter les valeurs 0, 1, 2, 3 avant les cases rouges, et superposer les cases rouges sur ces nombres.

    Même fonctionnement que la fonction construct, je crée une fonction construct_value, quasiment équivalente, mais dessinant du texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def construct_value(can, size, begin, y_begin, case):
        DISTANCE = 5
        y = y_begin
        for line in case:
            y += (size + DISTANCE)
            x = begin
            for n in line:
                canvas.create_text(x, y, text=n)
                x += (size + DISTANCE)
    Le code en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    from random import randint
    from PIL import Image, ImageTk
    from tkinter import Canvas, Tk, NW
     
     
     
    # Constantes
    ROW = 5
    COLUMN = 5
    INIT = -1
     
    def create(row, column, k):
        return [[k for i in range(column)] for j in range(row)]
     
    def add(value, nbr, case, k=-1):
        counter = 0
        while counter < nbr:
            row, column = randint(0, 4), randint(0, 4)
            if case[row][column] == k:
                case[row][column] = value
                counter += 1
        return case
     
    def reckon(line, val=None):
        '''
        Exemple d'utilisation
        reckon(line, 0) -> compte le nombre de 0 dans une ligne
        reckon(line) -> calcule la somme d'une ligne
        '''
        if val is None: # Si on ne recherche pas un nombre en particulier
            counter = sum(line) # on calcule la somme des valeurs de la ligne
        else:
            counter = line.count(val)
        return counter # Dans tous les cas on retourne la variable counter
     
    def draw(path):
        "path est l'endroit où se trouve ton dessin"
        image = Image.open(path)
        photo = ImageTk.PhotoImage(image)
        return photo
     
    def construct(can, size, begin, y_begin, case, picture):
        '''
        can -> le canvas
        size -> taille du carré
        begin -> valeur de x où commence la ligne
        y_begin -> valeur de y où commence la ligne
        case -> tableau de situation des objets
        picture -> instance de PhotoImage
        '''
        DISTANCE = 5 # distance entre chaque carré
        y = y_begin
        for line in case:
            y += (size + DISTANCE)
            x = begin
            for n in line:
                canvas.create_image(x, y, image=picture)
                x += (size + DISTANCE)
     
    def construct_value(can, size, begin, y_begin, case):
        DISTANCE = 5
        y = y_begin
        for line in case:
            y += (size + DISTANCE)
            x = begin
            for n in line:
                canvas.create_text(x, y, text=n)
                x += (size + DISTANCE)
     
    def click(event):
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
     
     
     
    # création d'un tableau à 2 dimensions composé de -1
    cases = create(ROW, COLUMN, INIT)
     
    # Ajout du nombre 0, 1, 2, 3 (value), 3 fois (nbr), k vaut -1 par défaut
    cases = add(0, 6, cases)
    cases = add(1, 4, cases)
    cases = add(2, 5, cases)
    cases = add(3, 5, cases)
     
     
    root = Tk()
     
    canvas = Canvas(root, width = 640, height = 480) # Création du canvas
    canvas.pack()
     
    construct_value(canvas, 50, 20, 0, cases)
    carre = draw("Carre_rouge.save.jpg") # retourne l'instance photoimage
    construct(canvas, 50, 20, 0, cases, carre) # construction des carrés
     
    canvas.bind("<Button-1>", click) # Exécution de la fonction click lors de l'appui sur le bouton gauche
     
    root.mainloop()
    Il ne reste plus que le score à gérer

    Ne t'inquiètes pas si tu es un peu largué, il faut que tu lises les doc relatives à certains mots clé dans le code, analyser et poser des questions éventuellement par la suite, après réflexions.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #27
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Dans notre cas, il faudrait ajouter les valeurs 0, 1, 2, 3 avant les cases rouges, et superposer les cases rouges sur ces nombres.
    Oui, c'était ce qui m'est venu à l'esprit, de manière à ce que lorsque l'on clique sur un carré rouge, celui-ci s'efface pour laisser place au dessin qui est derrière.

    def construct_value(can, size, begin, y_begin, case):
    DISTANCE = 5
    y = y_begin
    for line in case:
    y += (size + DISTANCE)
    x = begin
    for n in line:
    canvas.create_text(x, y, text=n)
    x += (size + DISTANCE)
    J'aurai effectivement besoin de commentaires sur ces lignes. Cela me permettra par la même occasion de comprendre comment sont afficher les carrés rouges.

  8. #28
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    J'aurai effectivement besoin de commentaires sur ces lignes. Cela me permettra par la même occasion de comprendre comment sont afficher les carrés rouges.
    Ah bah les mêmes commentaires que la fonction construct

    Sauf qu'au lieu d'utiliser un item image, c'est un item text prenant soit une valeur de -1, 0, 1, 2, 3

    J'ai déjà fais les scores, mais je te laisse digérer un peu
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #29
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup.
    J'aimerais juste revenir sur ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def reckon(line, val=None):
    if val is None: # Si on ne recherche pas un nombre en particulier
            counter = sum(line) # on calcule la somme des valeurs de la ligne
        else:
            counter = line.count(val)
        return counter # Dans tous les cas on retourne la variable counter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    print ("Somme des valeurs dans chaque ligne :") 
    for line in cases:
        print(reckon(line))
     
    print ("Nombre de mines dans chaque ligne :") 
    for line in cases:
        print(reckon(line, MINE))
     
    print ("Somme des valeurs dans chaque colonne :")    
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])
        print(reckon(line))    
     
    print ("Nombre de mines dans chaque colonne :")   
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])
        print(reckon(line, MINE))
    Je sais maintenant comment créer des tableaux sur TKinter, mais maintenant, comment ajouter du texte sur TKinter ? (Jusque là, vous avez superposé deux tableaux, l'un définit avec item image et l'autre avec item text)

    Supposons que je veux que mes codes ci-dessus soient représenté sur TKinter. Il faudra que je procéde d'une toute autre manière que précédemment.

    Ce qui nous a permis de créer la fonction construct_value, c'est le fait que l'on avait précisé auparavant ceci :"case[row][column] = value". N'est-ce pas ?

  10. #30
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Je sais maintenant comment créer des tableaux sur TKinter, mais maintenant, comment ajouter du texte sur TKinter ?
    Alors oui bonne question, en effet on va écrire sur notre widget Canvas.

    Ce widget c'est comme un tableau blanc où tu dessines, écris ce que tu veux, tout ce que tu écris est stocké dans une liste d'items. Un item est un entier.

    Supposons que je veux que mes codes ci-dessus soient représenté sur TKinter. Il faudra que je procéde d'une toute autre manière que précédemment.
    Oui, en effet, avec la méthode create_text.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = canvas.create_text(x, y, text="c'est un exemple")
    où x et y sont les coordonnées où tu placeras ton texte.

    c étant l'item dont je parlais plus haut.

    Ce qui nous a permis de créer la fonction construct_value, c'est le fait que l'on avait précisé auparavant ceci :"case[row][column] = value". N'est-ce pas ?
    Tout à fait...

    Ça implique il est vrai de certaines habitudes avec Tkinter pour maîtriser des méthodes évitant de tout se taper à la main, mais une connaissance minimale en python.

    Je continue avec mes scores pour compléter ce que j'ai dis précédemment.

    Tout se passe lors du click, des choses se passent, on va donc travailler dans la fonction click.

    Lors du click, on efface la case rouge, on récupère la valeur du dessous et on l'additionne à notre score.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def click(event):
        global score
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
        item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
        val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
        score += val
        canvas.itemconfig(c, text="score : {}".format(score))
    J'ai créé une fonction pour déterminer le score maxi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def calculate(case):
        "Calcul du score maxi"
        score_max = 0
        for line in case:
            for n in line:
                if n > 0:
                    score_max += n
        return score_max
    et au total ça nous donne cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    from random import randint
    from PIL import Image, ImageTk
    from tkinter import Canvas, Tk, NW, LEFT
     
     
     
    # Constantes
    ROW = 5
    COLUMN = 5
    INIT = -1
     
    def create(row, column, k):
        return [[k for i in range(column)] for j in range(row)]
     
    def add(value, nbr, case, k=-1):
        counter = 0
        while counter < nbr:
            row, column = randint(0, 4), randint(0, 4)
            if case[row][column] == k:
                case[row][column] = value
                counter += 1
        return case
     
    def reckon(line, val=None):
        '''
        Exemple d'utilisation
        reckon(line, 0) -> compte le nombre de 0 dans une ligne
        reckon(line) -> calcule la somme d'une ligne
        '''
        if val is None: # Si on ne recherche pas un nombre en particulier
            counter = sum(line) # on calcule la somme des valeurs de la ligne
        else:
            counter = line.count(val)
        return counter # Dans tous les cas on retourne la variable counter
     
    def draw(path):
        "path est l'endroit où se trouve ton dessin"
        image = Image.open(path)
        photo = ImageTk.PhotoImage(image)
        return photo
     
    def construct(can, size, begin, y_begin, case, picture):
        '''
        can -> le canvas
        size -> taille du carré
        begin -> valeur de x où commence la ligne
        y_begin -> valeur de y où commence la ligne
        case -> tableau de situation des objets
        picture -> instance de PhotoImage
        '''
        DISTANCE = 5 # distance entre chaque carré
        y = y_begin
        for line in case:
            y += (size + DISTANCE)
            x = begin
            for n in line:
                canvas.create_image(x, y, image=picture)
                x += (size + DISTANCE)
     
    def construct_value(can, size, begin, y_begin, case):
        DISTANCE = 5
        y = y_begin
        for line in case:
            y += (size + DISTANCE)
            x = begin
            for n in line:
                canvas.create_text(x, y, text=n)
                x += (size + DISTANCE)
     
    def click(event):
        global score
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
        item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
        val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
        score += val
        canvas.itemconfig(c, text="score : {}".format(score))
     
    def calculate(case):
        "Calcul du score maxi"
        score_max = 0
        for line in case:
            for n in line:
                if n > 0:
                    score_max += n
        return score_max
     
     
    # création d'un tableau à 2 dimensions composé de -1
    cases = create(ROW, COLUMN, INIT)
     
    # Ajout du nombre 0, 1, 2, 3 (value), 3 fois (nbr), k vaut -1 par défaut
    cases = add(0, 6, cases)
    cases = add(1, 4, cases)
    cases = add(2, 5, cases)
    cases = add(3, 5, cases)
     
    root = Tk()
     
    score = 0
     
    canvas = Canvas(root, width = 640, height = 480) # Création du canvas
    canvas.pack()
     
    construct_value(canvas, 50, 20, 0, cases)
    carre = draw("Carre_rouge.save.jpg") # retourne l'instance photoimage
    construct(canvas, 50, 20, 0, cases, carre) # construction des carrés
     
    c = canvas.create_text(350, 20, justify=LEFT, text="score : {}".format(score))
    canvas.create_text(350, 40, justify=LEFT, text="score maximum : {}".format(calculate(cases)))
     
    canvas.bind("<Button-1>", click) # Exécution de la fonction click lors de l'appui sur le bouton gauche
     
    root.mainloop()
    Bonne lecture...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #31
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Merci infiniment pour votre aide, sincèrement.

    Par contre, j'aurai besoin juste d'une dernière information.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = canvas.create_text(x, y, text="c'est un exemple")
    J'ai compris comment cela marchait, mais en fait ce n'est pas vraiment un texte que je veux rajouter sur TKinter mais plutôt le code que j'ai présenté dans mon précédent post.

    En fait, l'intérêt de ce code est de donner au joueur les indices nécessaire qui lui permettra de trouver tous les 2 et 3 en évitant de tomber sur un 0. (Sans ces indices, le jeu ne se baserait que sur du hasard)
    Excusez-moi de vous demander une énième chose, vraiment. Vous aviez déjà été suffisamment patient jusqu'à maintenant et je me sens mal d'appeler encore à l'aide. Ce sera la dernière fois.

  12. #32
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    J'ai compris comment cela marchait, mais en fait ce n'est pas vraiment un texte que je veux rajouter sur TKinter mais plutôt le code que j'ai présenté dans mon précédent post.
    Un code? Il n'y aurait pas un mal dit quelque-part?

    Je ne comprend pas ce que tu veux dire, si tu peux me donner un exemple de ce que tu souhaites placer dans ton canvas, ça permettrait d'avancer dans le bon sens...

    En fait, l'intérêt de ce code est de donner au joueur les indices nécessaire qui lui permettra de trouver tous les 2 et 3 en évitant de tomber sur un 0. (Sans ces indices, le jeu ne se baserait que sur du hasard)
    Tout à fait, ça serait du hasard, mais de quel indice parles-tu?

    Excusez-moi de vous demander une énième chose, vraiment. Vous aviez déjà été suffisamment patient jusqu'à maintenant et je me sens mal d'appeler encore à l'aide. Ce sera la dernière fois.
    Finalement, le plus important, n'est pas le temps passé, si ça vaut le coup, de mon côté je travaille sur Tkinter, ça fait un bye que je n'avais pas relu sa doc entièrement et du tiens, tu vois quelle démarche suivre et comment travailler par étape dans un projet.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  13. #33
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def reckon(line, val=None):
    if val is None: # Si on ne recherche pas un nombre en particulier
            counter = sum(line) # on calcule la somme des valeurs de la ligne
        else:
            counter = line.count(val)
        return counter # Dans tous les cas on retourne la variable counter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    print ("Somme des valeurs dans chaque ligne :") 
    for line in cases:
        print(reckon(line))
     
    print ("Nombre de mines dans chaque ligne :") 
    for line in cases:
        print(reckon(line, MINE))
     
    print ("Somme des valeurs dans chaque colonne :")    
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])
        print(reckon(line))    
     
    print ("Nombre de mines dans chaque colonne :")   
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])
        print(reckon(line, MINE))
    Ce code représente les indices que j'aimerais rajouter sur TKinter.
    Nous sommes d'accord sur le fait que ce code permet d'indiquer sur cmd quatre type de valeurs :
    _ Une valeur qui indique la somme des points cachés sur chaque ligne du tableau;
    _ Une valeur qui indique le nombre de 0 (donc de mines) présents sur chaque ligne;
    _ Une valeur qui indique la somme des points cachés sur chaque colonne du tableau;
    _ Une valeur qui indique le nombre de 0 (donc de mines) présents sur chaque colonne;

    Ces quatre types de valeurs sont mes fameux "indices" qui seront affichés sur ma fenêtre TKinter et qui permettra au joueur de deviner les éventuels position de mes 0, 1, 2, 3 dissimulés derrière les carrés rouge.
    De cette manière, le jeu ne se basera pas que sur le hasard et invite le joueur à se creuser un peu les méninges.

  14. #34
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Ok, je te laisse avancer seul maintenant.

    Pour écrire sur un canvas, tu as besoin de la méthode create_text.

    Pour utiliser create_text, tu as besoin d'indiquer le texte mais aussi les coordonnées (x et y) où placer le texte.

    Si tu places tes textes l'un en dessous de l'autre, tu peux utiliser une boucle for.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x, y = 300, 40 # sur chaque somme, on revient à x = 300
    for line in cases:
        somme = reckon(line)
        canvas.create_text(x, y, text="la somme vaut : {}".format(somme))
        y += 40 # on descend de 40 pour la ligne suivante
    La seule différence avec l'utilisation de print, c'est que là tu dois prendre en compte les coordonnées permettant le placement de ton texte sur ton canvas.

    Bonne continuation...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  15. #35
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Voici les coordonnées que j'ai placé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    x, y = 300, 45 # sur chaque somme, on revient a x = 300
    for line in cases:
        somme = reckon(line)
        canvas.create_text(x, y, text="{}".format(somme))
        y += 55 # on descend de 55 pour la ligne suivante
     
    x, y = 300, 65 
    for line in cases:
        Nb_Mines = reckon(line, 0)
        canvas.create_text(x, y, text="{}".format(Nb_Mines))
        y += 55 # on descend de 55 pour la ligne suivante
     
    x, y = 20, 320 # sur chaque somme, on revient a y = 320
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])	
        somme = reckon(line)
        canvas.create_text(x, y, text="{}".format(somme))
        x += 55 # on decale de 55 pour la colonne suivante
     
    x, y = 20, 340 
    for i in range(COLUMN):
        line = []
        for j in range(ROW):
            line.append(cases[j][i])	
        Nb_Mines = reckon(line, 0)
        canvas.create_text(x, y, text="{}".format(Nb_Mines))
        x += 55 # on decale de 55 pour la colonne suivante
    Impec' ! Ca marche du tonnerre !

    Je reviens une dernière fois sur ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def click(event):
        global score
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
        item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
        val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
        score += val
        canvas.itemconfig(c, text="score : {}".format(score))
    A la ligne 7, "score" n'est pas défini et un message d'erreur surgit.
    De même, à la ligne 8, "c" n'est pas reconnu par Python, c'est bizarre vu que "c" ça devrait être reconnu comme "canvas" non ?
    Dois-je télécharger quelque chose pour que ces lignes fonctionnent ?

    Enfin, les deux lignes ci-dessous m'indiquent que le score résulte de l'addition des valeurs. Si je veux que le score résulte de la multiplication des valeurs, je n'ai qu'à changer le "+" en "x" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    score += val
    score_max += n

  16. #36
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    A la ligne 7, "score" n'est pas défini et un message d'erreur surgit.
    Dans ton programme principal, il faut initialiser score

    Ne mettant pas tout le code, difficile de confirmer ce que je dis, mais on s'en doute...

    Mais en as-tu besoin, c'était pour additionner les valeurs cliquées...

    De même, à la ligne 8, "c" n'est pas reconnu par Python, c'est bizarre vu que "c" ça devrait être reconnu comme "canvas" non ?
    Regarde ce que représente c dans mon code précédent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = canvas.create_text(350, 20, justify=LEFT, text="score : {}".format(score))
    C'était pour afficher le score total, tu n'en as certainement pas besoin dont virer la ligne de code ci-dessus, ainsi que celle ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canvas.itemconfig(c, text="score : {}".format(score))
    Enfin, les deux lignes ci-dessous m'indiquent que le score résulte de l'addition des valeurs. Si je veux que le score résulte de la multiplication des valeurs, je n'ai qu'à changer le "+" en "x" ?
    Oui
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  17. #37
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Je n'aurai pas du dire "c'est la dernière fois"...

    J'ai transformé le "+=" en "*=". J'ai fait en sorte qu'en début de partie, le jeu commence avec un score initial de 1. En effet, si le score commençait à 0 alors que le score s'exprime par la multiplication des valeurs, mon score resterait inchangé et toujours nul.
    Après ces quelques légères modifications, score_max qui avait été défini s'est automatiquement modifié et affiche sur la fenetre TKinter 72 (normal).
    Bon, j'ai aussi poffiné le code à ma façon histoire que le jeu soit bien présentable.
    J'ai voulu aussi rajouter du texte avec canvas create_text cependant ce que je souhaite faire apparaitre n'apparait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if score == 0:
    	canvas.create_text(400, 300, text="Vous avez perdu")
     
    if score == 72:
    	canvas.create_text(400, 300, text="Vous avez gagnez")
    "score" avait pourtant été défini dernièrement, alors pourquoi cela ne marche pas ?
    Dois-je définir des fonctions nouvelles pour marquer les conditions d'arrêt du jeu ?

  18. #38
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Difficile de donner des explications sans le code en entier, vos simples lignes ne présentent pas d'erreurs, mais dans votre code c'est sans doute le cas
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  19. #39
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2013
    Messages : 22
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def click(event):
        global score
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
        item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
        val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
        score += val
            if score == 0:
    	    canvas.create_text(400, 300, text="Vous avez perdu")
     
            if score == 72:
    	    canvas.create_text(400, 300, text="Vous avez gagnez")
        canvas.itemconfig(c, text="score : {}".format(score))
    J'ai tout simplement rajouté ces lignes à la définition de click. (Même si quelque part je sais que ce n'est pas ça qu'il faut faire, disons tout simplement que je ne sais pas comment procéder)

  20. #40
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Tu as des erreurs d'indentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def click(event):
        global score
        item = canvas.find_closest(event.x, event.y) # recherche l'item en fonction des coordonnées du click
        canvas.delete(item) # suppression de l'item
        item = canvas.find_closest(event.x, event.y) # on récupère la valeur en dessous de la case rouge
        val = int(canvas.itemcget(item, 'text')) # on la transforme en entier
        score += val
        if score == 0:
            canvas.create_text(400, 300, text="Vous avez perdu")
        if score == 72:
            canvas.create_text(400, 300, text="Vous avez gagnez")
    par contre montre moi tout le code
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Création d'un jeu de test sous MVS
    Par Ullysse dans le forum z/OS
    Réponses: 2
    Dernier message: 23/04/2014, 20h56
  2. création d'un fichier xml sous python
    Par hajara dans le forum Tkinter
    Réponses: 0
    Dernier message: 06/06/2012, 20h03
  3. Jeu saccadé: Timer ? Thread? sous python.
    Par pagugu dans le forum Programmation multimédia/Jeux
    Réponses: 6
    Dernier message: 18/04/2010, 17h50
  4. Existe-t-il un rad sous python?
    Par sloshy dans le forum EDI/RAD
    Réponses: 6
    Dernier message: 03/10/2005, 10h26
  5. probleme pour un jeu de dames en python
    Par doudou152 dans le forum Général Python
    Réponses: 7
    Dernier message: 22/04/2005, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo