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

Tkinter Python Discussion :

Pb du demineur


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Pb du demineur
    Bonjour à tous je vais essayer d'être le plus clair possible.

    Je dois programmer le problème du démineur en python avec l'interface graphique Tkinter et je rencontre quelques (beaucoup) de difficulté.

    Pour l'instant, j'ai reussi à afficher l'interface mais je n'arrive pas à implémenter les bombes.

    Je vous mets mon programme premier niveau pour que vous ayez une idée de mes problèmes.

    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
    def cb_level1():
      size=(5,5)
     
      for n in range(25):
        c = divmod(n, size[1])
        root[c] = Button(root[2], font=fnt, width=3, height=1,
                         command=lambda cell=c: cb_cell(cell))
        root[c].grid(column=c[0], row=c[1], sticky=N+E+W+S)
      for n in range(size[0]): root[2].columnconfigure(n, weight=1)
      for n in range(size[1]): root[2].rowconfigure(n, weight=1)
      # ----------------------------------------------------------------------------
      root[0].title("Mine"); root[0].update_idletasks()
      root[0].minsize(root[0].winfo_width(), root[0].winfo_height())
      root[0].resizable(1,1); root[0].protocol("WM_DELETE_WINDOW", root[0].quit)
      root[0].mainloop(); root[0].destroy()
    Merci de vos réponse

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Quitte à donner un code, donne le complet, et d'autre part essayes de poser une question précise.

    Ou bloques tu ?
    Quelle ligne de code te pose problème ?
    Quel principe de base te pose problème ?

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Désolé d'avoir été si impreci.

    Je mets donc le code entier

    from Tkinter import *
    import tkMessageBox
    from random import randrange
    # ------------------------------------------------------------------------------
    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
     def cb_level1():
     
      size = (5,5)
      nb_mine = 5
      generate(size,nb_mine) 
    # ------------------------------------------------------------------------------
    def cb_level2():
      size = (10,10)
      nb_mine = 10
      generate(size,nb_mine)
    # ------------------------------------------------------------------------------
    def cb_level3():
      size = (20,20)
      nb_mine = 20
      generate(size,nb_mine)
    # ------------------------------------------------------------------------------
    def generate(size, nb_mine):
     
          # ----------------------------------------------------------------------------
     
      for n in range(size[0]*size[1]):
        c = divmod(n, size[1])
        root[c] = Button(root[2], font=fnt, width=3, height=1,command=lambda cell=c: cb_cell(cell))
        root[c].grid(column=c[0], row=c[1], sticky=N+E+W+S)
      for n in range(size[0]): root[2].columnconfigure(n, weight=1)
      for n in range(size[1]): root[2].rowconfigure(n, weight=1)
      # ----------------------------------------------------------------------------
      root[0].title("Mine"); root[0].update_idletasks()
      root[0].minsize(root[0].winfo_width(), root[0].winfo_height())
      root[0].resizable(1,1); root[0].protocol("WM_DELETE_WINDOW", root[0].quit)
      root[0].mainloop(); root[0].destroy()
     
      for n in range(size[0]*size[1]):
        cell = divmod(n,size[1]);
        root[cell]['text'] = ''
      if size == (5,5):
          nb_mine = 5;
      if size == (10,10):
          nb_mine = 20;
      if size == (20,20):
          nb_mine = 30;
    # ------------------------------------------------------------------------------
    def cb_reset():
      """callback function for the "RESET" button"""
      global goal , goal2
      goal = (randrange(size[0]), randrange(size[1]))
      goal2 = (randrange(size[0]), randrange(size[1]))
      for n in range(size[0]*size[1]):
        cell = divmod(n,size[1]);
        root[cell]['text'] = ''
    # ------------------------------------------------------------------------------
    def cb_help():
      """callback function for the "HELP" button"""
      msg = """Indicate mines putting flags around"""
      tkMessageBox.showinfo("HELP", message=msg)
    # ------------------------------------------------------------------------------
    def cb_cell(cell):
      """callback function for each cell of the board"""
      """if nb_mine(cell) == 0: # mine has been found => image explosion"""
      for n in range(size[0]*size[1]):
        cell = divmod(n, size[1]);
        root[cell]['text'] = nb_mine(cell)
    # ------------------------------------------------------------------------------
    def nb_mine(cell):
      """change color of 'cell' according to distance from goal"""
     
      dist = abs(goal[0]-cell[0]) + abs(goal[1]-cell[1])
      dist2 = abs(goal2[0]-cell[0]) + abs(goal2[1]-cell[1])
      return dist, dist2
    # ------------------------------------------------------------------------------
    def main():
      """main program of the "mine" module"""
      global root, fnt
      """,size, goal, goal2"""
      """images = [PhotoImage(file='smiley1.gif')]"""
      fnt= "Arial 12"
      root = {0: Tk()}
      """goal,goal2 = (randrange(size[0]), randrange(size[1])),(randrange(size[0]), randrange(size[1]))"""
      # ----------------------------------------------------------------------------
      root[1] = Frame(root[0])
      root[1].pack(side=TOP, fill=BOTH, padx=2, pady=2)
      root[11] = Button(root[1],font=fnt, width=9, text='RESET', command=cb_reset) 
      root[11].pack(side=LEFT, fill=BOTH,padx=5, pady=5)
      root[121] = Button(root[1],font=fnt, width=8, text='LEVEL 1', command=cb_level1)
      root[121].pack(side=LEFT, fill=BOTH,padx=5, pady=5)
      root[122] = Button(root[1],font=fnt, width=8, text='LEVEL 2', command=cb_level2)
      root[122].pack(side=LEFT, fill=BOTH,padx=5, pady=5)
      root[123] = Button(root[1],font=fnt, width=8, text='LEVEL 3', command=cb_level3)
      root[123].pack(side=LEFT, fill=BOTH,padx=5, pady=5)
      root[13] = Button(root[1],font=fnt, width=9, text='HELP', command=cb_help)
      root[13].pack(side=LEFT, fill=BOTH,padx=5, pady=5)
      root[2] = Frame(root[0])
      root[2].pack(side=TOP, fill=BOTH, expand=YES, padx=2, pady=2)
    # ------------------------------------------------------------------------------
    if __name__ == "__main__":
      main()
    # ==============================================================================
    Je debute mon projet donc rien n'est encore abouti, mais pour l'instant je n'arrive pas à mettre les mines dans la grille. J'arrive à en mettre une mais pas à faire une boucle. Est ce que je dois faire une liste?
    Je viens de m'apercevoir que j'ai un autre problème.

    Quand on execute le programme, on nous demande de choisir le niveau, et suivant le niveau,il y a une grille différente .L'interface pour choisir les niveau reste pendant le jeu et donc si on peut changer de niveau pendant la partie. Le problème c'est que j'arrive à monter de niveau(passer du 1 au 2) mais lorsque l'on descend la grille reste sur le niveau le plus élevé.

    J'espere avoir été assez clair, merci beaucoup de vos réponses.

  4. #4
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Je ne sais pas vraiment quoi dire !!

    J'ai l'impression que tu as fais un copier/coller de code mais que tu ne sais pas ce que veux dire chaque instruction.

    Rien de méchant là dedans, c'est une impression.

    Essaye de commencer par le début, de ne pas utiliser de varaible globale, mais des classes et des instances de classe.

    Concernant ton tableau de cases, utilises plutôt un "tableau" à deux dimensions plutôt que de tout stocker directement dans root. Dans ce tableau tu pourras stocker le fais qu'une case contient une mine ou pas et d'autre part indiquer que cette mine doit être affiché ou pas.

    Je reviens à la charge, essaye de comprendre les fondamentaux et de découper ton problème en classe simple

  5. #5
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Tiens voici un début en mode texte pour t'orienter. (faut croire que j'ai que ça à faire, pondre des démineurs pour aider !! )

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from random import randint
     
    class UneCase():
        def __init__(self, mine, visible):
            self.mine = mine
            self.visible = visible
     
        def get_status(self, debug=False):
            if self.visible or debug:
                if self.mine:
                    return 'X'
                else:
                    return ' '
            else:
                return '_'
     
        def clique(self):
            if self.mine:
                print 'boum'
                return True
     
            if self.visible:
                print 'déjà cliqué'
            else:
                self.visible = True
            return False            
     
    class UneGrille():
        def __init__(self, rows, cols, nbr_mine, debug=False):
            self.rows = rows
            self.cols = cols
            self.grille={}
            self.debug = debug
            for r in xrange(rows):
                self.grille[r] = {}
                for c in xrange(cols):
                    self.grille[r][c] = UneCase(False, False)
     
            for i in xrange(nbr_mine):
                while True:
                    r = randint(0, self.rows-1)
                    c = randint(0, self.cols-1)
                    if not self.grille[r][c].mine:
                        self.grille[r][c].mine = True
                        break
     
        def show(self):
            for r in xrange(self.rows):
                l = ''
                for c in xrange(self.cols):
                    l = l + self.grille[r][c].get_status(self.debug)
                print l
     
        def clique(self, row, col):
            if row>=self.rows or col>=self.cols:
                print 'num de ligne ou de colonne trop grand'
            else:
                boum = self.grille[row][col].clique()
                self.show()
                return boum
     
    #en mode debug
    #g = UneGrille(10, 10, 10, True)
    #en mode normal
    g = UneGrille(10, 10, 10)
    g.show()
    while True:
        s = raw_input('Quelle case : ')
        if s:
            try:
                row, col = [int(v) for v in s.split(',')]
                if g.clique(row-1, col-1):
                    print 'partie fini'
                    break
            except:
                print 'entre incorrecte : <ligne>,<colonne>'
        else:
            break
    Ca affiche un tableau, avec '_' quand pas cliqué, ' ' quand cliqué et 'X' quand il y a une mine. Dans l'état actuel le 'X' ne s'affiche que si tu passes debug = True.

    Tu rentres la case que tu veux 'cliquer' sous forme <ligne>,<colonne>, ex : 5, 6.

    J'espère que ça te donneras les bases pour t'aider à résoudre ton problème.

    P.S.:Il est pas testé à fond et sûrement perfectible, mais c'est une base de réflexion.

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci bcp pour ta reponse, je vais l'etudier ce soir....
    Et dans mon code, y'avait des parties d'exo qu'on avait fait (et c'est vrai que je comprenais pas tout

    Merci encore, je te tiens au courant de mes problème.


  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Désolé de t'embéter encore, mais mon projet c'est de fiare le démineur avec l'interface graphique thinker.
    Et je sais pas du tout si c'est possible d'utiliser des tableau avec sa, si tu pourrais éclairer ma lanterne?

    Merci beaucoup pr ton petit programme, c'est sympa d'avoir passé du temps à aidé quelqu'un que tu ne connais pas.

    Merci

  8. #8
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    N'étant pas un pro de tkinter, je ne saurais vraiment te dire comment faire. Mais que ce soit faisable, ça ne fais aucun doute.

    Mon petit programme gère un tableau de case qui contienne le statut de ces même cases, il suffit d'afficher le statut dans une fenêtre tkinter à la place de le faire en mode texte.

    Mais à priori c'est un exercice que tu dois réaliser et le but d'un exercice c'est de le faire soi même !!!

    Essayes de voir du coté des tutoriaux de tkinter comment gérer cela. Dans celui là http://python.developpez.com/cours/TutoSwinnen/ par exemple, tu as d'après ce que j'ai vu rapidement, un exemple de calculatrice, et une calculatrice au niveau présentation, ca ressemble beaucoup à un démineur. Peut être que ca pourra te donner des idées.

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci...je regarderais sa ...demain

    bonne nuit et encore merci

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Je crois que le module Canvas te sera d'une grande utilité. Je pense que tu peux oublier l'usage des boutons.

    Essaye de te baser sur un programme Démineur déjà créé, celui de windows © pour ne pas le citer...

    Bon courage.

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Nouveaux problème.....

    on aimerai savoir quelle est la fonction attribuer a root[cell] qui bloque la cellule, parce qu'on aimerait faire une incremation que si on n'a pas déjà cliqué sur la cellule..

Discussions similaires

  1. probleme jeux demineur
    Par ali alameh dans le forum C
    Réponses: 8
    Dernier message: 26/06/2013, 10h11
  2. Demineur erreur de segmentation.
    Par -ezano- dans le forum C
    Réponses: 13
    Dernier message: 16/12/2009, 20h15
  3. Comception demineur en c++
    Par Mehdi Feki dans le forum C++
    Réponses: 7
    Dernier message: 25/03/2005, 10h37
  4. [LG]Démineur pascal...
    Par youngeikichi dans le forum Langage
    Réponses: 10
    Dernier message: 29/01/2005, 18h16

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