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 :

Projet de bataille navale


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut Projet de bataille navale
    Bonjour à tous,

    Dans le cadre de ma première année de Licence Informatique, je dois réaliser une bataille navale en python. J'ai bien avancé mais j'ai un problème qui subsiste : quand je place les bateaux de l'ordinateur aléatoirement, malgré une fonction test, je me retrouve avec des bateaux qui se chevauche. Je vous met les deux fonctions qui pause problème :

    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
     
    def place_o(): #Fonction qui choisit les coordonnées des bateaux de l'ordinateur
        global bateauxActifsOrdi
        global test
        for y in dico_bat.values():
            orien=randint(0,1) #orientation du bateau: 0=vertical, 1=horizontal
            if orien==0:
                a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                while test==False:
                    res=est_placable(orien,a,b,y)
                    test,a,b=res[0],res[1],res[2]
                for i in range (0,y):
                    bateauxActifsOrdi+=[[a+i,b]]
            else:
                a,b=randint(0,nbcase-1),randint(0,(nbcase-1)-y)
                while test==False:
                    res=est_placable(orien,a,b,y)
                    test,a,b=res[0],res[1],res[2]
                for i in range (0,y):
                    bateauxActifsOrdi+=[[a,b+i]]
     
    def afficheBat():
        for i in range(len(bateauxActifsOrdi)):
            a=bateauxActifsOrdi[i][0]
            b=bateauxActifsOrdi[i][1]
            can.create_rectangle(x1+case*b,y1+case*a,x1+case*(b+1),y1+case*(a+1),fill="red")
     
    def est_placable(z,x,y,taille): #Fonction qui teste si un bateau en recouvrira un autre
        global test
        test=False
        if z==0:
            for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
        else:
            for i in range (0,taille):
                if [x,y+i] in bateauxActifsOrdi:
                    x,y=randint(0,nbcase-1),randint(0,(nbcase-1)-taille)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    Si vous pouviez m'expliquer d'où vient le problème, et m'aiguillez sur une solution se serait parfait!
    Merci d'avance.

    Cordialement,
    Clemissile

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Le problème vient de cette construction dans la fonction "est_placable":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    Essayez de relire ces lignes en vous demandant comment elles peuvent bien faire le boulot que vous en attendez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    En relisant ces lignes je pense que le problème peut venir du "if" au niveau du [x+i,y] mais je ne vois pas comment le modifier pour obtenir le résultat escompté... Si le problème ne provient pas de là, je ne sais pas d'où cela peut provenir.
    Merci de votre réponse.

    Cordialement,
    Clemissile

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par clemissile Voir le message
    En relisant ces lignes je pense que le problème peut venir du "if" au niveau du [x+i,y] mais je ne vois pas comment le modifier pour obtenir le résultat escompté... Si le problème ne provient pas de là, je ne sais pas d'où cela peut provenir.
    Ah ben déjà, expliquez ce qu'est le résultat escompté car, à priori, cette fonction ne devrait retourner qu'un booléen.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Cette fonction doit tester si un bateau en recouvre un autre, si c'est le cas, elle doit retirer de nouvelles coordonnées et les re-tester, d'où le randint et l'appel de la fonction dans le if, et si le bateau n'en recouvre aucun on retourne True et les valeurs x,y qui ont changé ou non.

    Cordialement,
    Clemissile

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par clemissile Voir le message
    Cette fonction doit tester si un bateau en recouvre un autre, si c'est le cas, elle doit retirer de nouvelles coordonnées et les re-tester, d'où le randint et l'appel de la fonction dans le if, et si le bateau n'en recouvre aucun on retourne True et les valeurs x,y qui ont changé ou non.
    Vous lui donnez bien trop de responsabilités avant de vous assurer que sa fonction de base est assurée!
    Il faut essayez d'exécuter le code comme le ferait la machine en essayant des cas de figures.
    Exemple supposons que (1,2) ne soit pas dans bateauxActifsOrdi mais que (2, 2) le soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in range (0,taille):
                if [x+i,y] in bateauxActifsOrdi:
                    x,y=randint(0,(nbcase-1)-taille),randint(0,nbcase-1)
                    est_placable(z,x,y,taille)
                else:
                    test=True
                    return [test,x,y]
    la première itération passe dans le "else" et retournera [True, 1, 2] sans avoir fait quoi que ce soit pour le suivant.

    Ce n'est pas ce que vous voulez mais c'est néanmoins ce que vous avez écrit

    Pour le reste, essayez un peu de jouer à la machine pour voir...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    J'ai re-travaillé les fonctions à partir des conseils que vous m'avez donné (en gras et rouge les changements par rapport à la première fonction que j'ai donné) :

    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
    def place_o(): #Fonction qui choisit les coordonnées des bateaux de l'ordinateur
        global bateauxActifsJ2
        global test
        for y in dico_bat.values():
            orien=randint(0,1) #orientation du bateau: 0=vertical, 1=horizontal
            if orien==0:
                a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                while est_placable(orien,a,b,y)==False:
                    a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                    est_placable(orien,a,b,y)
                for i in range (0,y):
                    bateauxActifsJ2+=[[a+i,b]]
            else:
                a,b=randint(0,nbcase-1),randint(0,(nbcase-1)-y)
                while est_placable(orien,a,b,y)==False:
                    a,b=randint(0,nbcase-1),randint(0,(nbcase-1)-y) 
                    est_placable(orien,a,b,y)
                for i in range (0,y):
                    bateauxActifsJ2+=[[a,b+i]]
    
    def afficheBat():
        for i in range(len(bateauxActifsJ2)):
            a=bateauxActifsJ2[i][0]
            b=bateauxActifsJ2[i][1]
            can.create_rectangle(x1+case*b,y1+case*a,x1+case*(b+1),y1+case*(a+1),fill="red")
    
    def est_placable(z,x,y,taille):
        res=[]
        nb_in=0
        if z==0:
            for i in range (0,taille):
                res+=[[x+i,y]]
            for coord in res:
                if coord in bateauxActifsJ2:
                    nb_in+=1
            if nb_in!=0:
                return False
            return True
        else:
            for i in range (0,taille):
                res+=[[x,y+1]]
            for coord in res:
                if coord in bateauxActifsJ2:
                    nb_in+=1
            if nb_in!=0:
                return False
            return True
    Après avoir effectuer quelques tests, cela me semble correct. Pouvez-vous me dire ce que vous en pensez ou si vous voyez des erreurs de ma part?

    Cordialement,
    Clemissile

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Relisez encore votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           orien=randint(0,1) #orientation du bateau: 0=vertical, 1=horizontal
            if orien==0:
                a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                while est_placable(orien,a,b,y)==False:
                    a,b=randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                    est_placable(orien,a,b,y)
                for i in range (0,y):
                    bateauxActifsJ2+=[[a+i,b]]
    Intuitivement, le bateau est un ensemble de cases contiguës disposées suivant une orientation verticale ou horizontale.
    est_placable, vous dit si le bateau n'en chevauche pas un autre déjà existant...
    Ok mais pour retourner ce booléen, la fonction devra construire les cases correspondantes pour pouvoir les comparer.
    Si "est_placable", vous refaites le même boulot avant d'ajouter ces cases à la liste des cases occupées.

    => créer les cases du bateau de (orientation, x, y, taille) n'étant pas une fonction à part entière est une responsabilité qui n'appartient à personne.
    Il faut oser créer son mini-langage qui représentera les actions principales!

    Ca simplifie la fonction "place_o"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           orien=randint(0,1) #orientation du bateau: 0=vertical, 1=horizontal
           while True:
                    a, b = randint(0,(nbcase-1)-y),randint(0,nbcase-1) 
                    cases = create_cases(orien, a, b, y)
                    if est_placable(cases):
                             break
            bateauxActifsJ2 += cases
    Plus besoin de traiter orient = 0 et orient = 1 comme cas particuliers.
    Ce détail poussé dans "create_cases" permet de travailler avec une abstraction supérieure: une liste de cases.
    Et bien sur ca simplifie aussi "est_placable":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def est_placable(cases):
          for case in cases:
               if case in bateauxActifsJ2:
                      return False
           return True
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Merci de votre réponse, j'ai bien compris le principe de découper chaque action en une fonction spécifique donc j'ai modifié mon programme en conséquence, cela fonctionne parfaitement dorénavant!

    J'ai une autre question à poser, une fois les bateaux de l'utilisateur placés et ceux de l'ordi aussi, on autorise le jeu à démarrer. Cependant, je ne vois pas comment faire du tour par tour. J'ai pensé à utiliser un while gagne (on continue tant que l'un des joueurs n'a pas gagné), et une fonction tour(joueur) qui selon le joueur appelle d'autres fonctions qui permet de tirer une case sur la grille adverse. Pensez-vous que cela soit une bonne option ?

    Cordialement,
    Clemissile

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par clemissile Voir le message
    J'ai pensé à utiliser un while gagne (on continue tant que l'un des joueurs n'a pas gagné), et une fonction tour(joueur) qui selon le joueur appelle d'autres fonctions qui permet de tirer une case sur la grille adverse. Pensez-vous que cela soit une bonne option ?
    Dans la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def afficheBat():
        for i in range(len(bateauxActifsJ2)):
            a=bateauxActifsJ2[i][0]
            b=bateauxActifsJ2[i][1]
            can.create_rectangle(x1+case*b,y1+case*a,x1+case*(b+1),y1+case*(a+1),fill="red")
    il semble que vous utilisiez un GUI du genre Tkinter.

    Ce qui vous racontez: "utiliser un while gagne", une fonction "tour(joueur)" n'a pas trop de sens dans un contexte ou tout sera piloté par des événements qui appelleront des callbacks (le nom des fonctions appelées par l'interface graphique).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Effectivement j'utilise Tkinter. Comment pourrais-je procéder pour faire du tour par tour dans ce cas?

    Cordialement,
    Clemissile

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par clemissile Voir le message
    Effectivement j'utilise Tkinter. Comment pourrais-je procéder pour faire du tour par tour dans ce cas?
    De toutes façons, (*) l'événement clavier/souris ne pourra que refléter "utilisateur joue".
    Soit il a détruit la flotte ennemie et la partie est finie, soit il attend que l'ordinateur ait joué son coup.
    Si sa flotte n'est pas détruite on recommence en (*) i.e on permet à l'utilisateur de jouer le coup suivant.

    Dans tous les cas, il faut interdire à l'utilisateur de jouer deux coups de suite, détecter si la partie est terminée (ou pas) et désigner le gagnant.

    "interdire à l'utilisateur de..." s'appelle masquer l'événement: çà ne réagit pas tant que...
    Comment faire çà avec tkinter, c'est le sujet de votre exercice et çà dépend beaucoup de l'interface utilisateur que vous avez défini.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Le problème c'est que, dès que je me balade sur le net pour voir comment font certains programmeurs pour faire du tour par tour, je ne comprends pas leurs programmes. Partout dans le programme il y a self. et sur tout mon semestre ou j'ai travaillé sur Python, on a jamais programmer de cette façon. Je ne comprends pas les 3/4 des lignes de code du programme...
    On a jamais non plus programmer de petits programmes nécessitant du tour par tour avec Tkinter, donc je sais pas par où commencer...

    Coridalement,
    Clemissile

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par clemissile Voir le message
    On a jamais non plus programmer de petits programmes nécessitant du tour par tour avec Tkinter, donc je sais pas par où commencer.
    Ben commencez par un jeu débile mais qui aura l'avantage d'être plus simple à réaliser tout en gardant la même difficulté.
    Je vous proposerai bien un jeu ou l'ordinateur propose une couleur parmi 3.
    L'utilisateur clique sur le bouton de la couleur correspondante.
    Le jeu se termine lorsque l'utilisateur à trouvé la bonne couleur 3 fois de suite (ou tout autre condition de fin).

    Pour corser le truc, l'ordinateur propose la couleur suivante après un délai d'une seconde *et* les boutons sur lesquels clique l'utilisateur sont inactifs avant que la nouvelle couleur soit présentée.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Je vais essayer de programmer ça, merci pour l'idée! Je vous tiens au courant si j'ai un soucis.

    Cordialement,
    Clemissile

  16. #16
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Je me suis penché sur le jeu que vous m'avez proposé. J'ai plusieurs soucis :

    - Est-ce possible de récupérer la valeur text d'un bouton? Car pour le moment, j'ai crée une fonction par bouton pour savoir si c'est la couleur 1, 2 ou 3 qui est été choisie par l'utilisateur. Voilà ce que j'ai fais pour ça (il n'y a pas tous mon code, juste ce qui pose problème) :

    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
     
    couleurs=["bleu","rouge","vert"]
    pts=0
     
    def clic0():
        global pts
        if couleurs[0]==Prop_Coul.get():
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Bonne réponse")
            pts+=1
        else:
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Mauvaise réponse")
     
    def clic1():
        global pts
        if couleurs[1]==Prop_Coul.get():
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Bonne réponse")
            pts+=1
        else:
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Mauvaise réponse")
     
    def clic2():
        global pts
        if couleurs[2]==Prop_Coul.get():
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Bonne réponse")
            pts+=1
        else:
            Prop_Coul.delete(0,END)
            Prop_Coul.insert(END,"Mauvaise réponse")
     
    B0=Button(fenetre,text=couleurs[0],font=("helvetica",15,"bold"),command=clic0)
    B1=Button(fenetre,text=couleurs[1],font=("helvetica",15,"bold"),command=clic1)
    B2=Button(fenetre,text=couleurs[2],font=("helvetica",15,"bold"),command=clic2)
    - Une fois la réponse de l'utilisateur donnée, je devrais appeler ma fonction jeu() qui affiche une nouvelle couleur. Cependant, si je fais ça, on ne verra pas si la réponse est bonne au mauvaise. J'ai donc essayé d'inserer time.sleep(1) avant l'appel de jeu(), mais cela n'a rien changer. Comment faire donc, pour attendre avant l'appel de ma fonction?

    Cordialement,
    Clemissile

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par clemissile Voir le message
    - Est-ce possible de récupérer la valeur text d'un bouton? Car pour le moment, j'ai crée une fonction par bouton pour savoir si c'est la couleur 1, 2 ou 3 qui est été choisie par l'utilisateur. Voilà ce que j'ai fais pour ça (il n'y a pas tous mon code, juste ce qui pose problème)
    button['text'].

    Citation Envoyé par clemissile Voir le message
    - Une fois la réponse de l'utilisateur donnée, je devrais appeler ma fonction jeu() qui affiche une nouvelle couleur. Cependant, si je fais ça, on ne verra pas si la réponse est bonne au mauvaise. J'ai donc essayé d'inserer time.sleep(1) avant l'appel de jeu(), mais cela n'a rien changer. Comment faire donc, pour attendre avant l'appel de ma fonction?
    La réponse de l'utilisateur devrait désactiver les "buttons" via button['state'] = 'disabled'.
    Un GUI graphique exécute des callbacks (vos fonctions entre autre).
    La réactivité de l'interface suppose que le temps d’exécution de ces callbacks soit le plus court possible.
    Impossible d'utiliser time.sleep!
    Par contre la machine a exécuter des callbacks permet de déclencher un callback après un délai donné via ".after" comme fenetre.after(ms, callback).
    "yaka" fabriquer une fonction genre enable_buttons qui effectue un button['state'] = 'normal' sur l'ensemble des buttons.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Citation Envoyé par wiztricks Voir le message
    button['text'].
    Quand j'utilise ceci avec mes boutons, j'obtiens comme erreur : _tkinter.TclError: invalid command name ".48937808"

    Citation Envoyé par wiztricks Voir le message
    Par contre la machine a exécuter des callbacks permet de déclencher un callback après un délai donné via ".after" comme fenetre.after(ms, callback).
    "yaka" fabriquer une fonction genre enable_buttons qui effectue un button['state'] = 'normal' sur l'ensemble des buttons.
    J'ai mis en place ceci avec ".after", ça marche parfaitement maintenant! Je vais essayer de raisonner de même pour mon projet de bataille navale, merci!

    Cordialement,
    Clemissile

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par clemissile Voir le message
    Quand j'utilise ceci avec mes boutons, j'obtiens comme erreur : _tkinter.TclError: invalid command name ".48937808"
    Il faudrait poster un peu de code pour montrer comment vous vous y prenez.

    C'est pas si compliqué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> from tkinter import *
    >>> btn = Button(text='foo')
    >>> btn['text']
    'foo'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    Membre à l'essai Avatar de clemissile
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 33
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Je continue à bosser sur ma bataille navale, et j'ai un nouveau soucis. Lorsque l'on tire une case sur la grille adverse, si la case a déjà été tirée on pouvait retirer dessus. J'ai donc essayer de modifier ça (en ajoutant des listes contenants la position des cases déjà tirées). Le problème vient avec la fonction concernant l'utilisateur : si la case est déjà tirée il faut rappeler la fonction pour en choisir une autre, or je ne sais pas comment faire étant que c'est une callback. Voici le code pour ma fonction, j'ai mis en rouge d'où vient le problème selon moi :

    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
    def tir_j(event): #Fonction qui gère le clic sur la grille adverse
        global casesTireesJ1
        i,j=correspond_g2(event.x,event.y)
        if [i,j] not in casesTireesJ1: #On vérifie que la case n'a pas déjà été tirée
            casesTireesJ1+=[[i,j]]
            if [i,j] in bateauxActifsJ2:
                bateauxActifsJ2.remove([i,j])
                Tour.delete("0.0",END)
                Tour.insert(END,"Touché !")
                if i in range(nbcase) and j in range (nbcase):
                    can.create_rectangle(x1+case*j,y1+case*i,x1+case*(j+1),y1+case*(i+1),fill="green")
            else:
                Tour.delete("0.0",END)
                Tour.insert(END,"Raté !")
                if i in range(nbcase) and j in range (nbcase):
                    can.create_rectangle(x1+case*j,y1+case*i,x1+case*(j+1),y1+case*(i+1),fill="dark blue")
        else:
            Tour.delete("0.0",END)
            Tour.insert(END,"Case déjà tirée")
            can.bind("<Button-1>",tir_j)
        fenetre.after(1000,jeu1)
    Comment pourrais-je faire pour rappeller la fonction tir_j étant donné que c'est une callback? (car avec le code que j'ai, il me dit bien que la case a déjà été tirée mais passe directement dans la fonction jeu1 sans que je puisse choisir une nouvelle case).
    Merci d'avance.

    Cordialement,
    Clemissile

Discussions similaires

  1. projet de bataille navale
    Par tropicthunder dans le forum Général Python
    Réponses: 1
    Dernier message: 22/04/2015, 16h26
  2. Bataille navale projet
    Par lorli911 dans le forum Général Python
    Réponses: 2
    Dernier message: 01/04/2015, 15h44
  3. bataille navale, un projet bateau (haha)
    Par Dendrite dans le forum Débuter
    Réponses: 11
    Dernier message: 26/01/2010, 16h18
  4. Projet de bataille navale
    Par hichamtimberlake dans le forum C
    Réponses: 1
    Dernier message: 23/05/2009, 13h22
  5. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22

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