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 :

Problème de damier. [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 9
    Par défaut Problème de damier.
    Bonjour à tous, je débute python, j'essaie actuellement de créer un damier.

    J'ai regardé plusieurs corrections, j'ai réussi à comprendre l'exercice.
    Cependant, je ne comprends pas pourquoi mon algorithme ne marche pas.

    Je dois faire un damier 10x10, en alternant les cases blanches d'une ligne à l'autre.
    Voici le code :
    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
    #Ecrire une petite application qui fait apparaitre un damier (dessin de cases
    #noires sur fond blanc) lorsqu'on clique sur un bouton ( 10x10)
     
     
    from tkinter import *
     
    #variable qui crée un rectangle :
    def rectangle(x1=0,y1=0,x2=20,y2=20) :
        can.create_rectangle(x1,y1,x2,y2,fill="blue")
     
    #Variable qui fait le damier :
    def serie_rectangle() :
        i=0
        x1,y1,x2,y2 = 0, 0, 20, 20
        while i<21 :
            if i<10 :
                if i%2 == 0 :
                    rectangle(x1,y1,x2,y2)
            i=i+1       #incrémentation des compteurs
            x1=x1+20
            x2=x2+20
            if i>=10 and i<20 :
                if i == 10 :    #retour à la ligne, nouvelle colonne
                    y1=y1+20    
                    y2=y2+20
                    x1=0
                    x2=20
                if i%2 !=0 :
                    rectangle(x1,y1,x2,y2)
                if i==20 and y2== 200 and x2==200 :
                    i=i+1       #fin de la boucle
                if i == 20 :
                    x1=0        #retour de la boucle a if i<10
                    x2=20
                    y1=y1+20
                    y2=y2+20
                    i=0
     
    #----Programme principal:-------
     
    fen=Tk()
     
    #----widgets--------
     
    can=Canvas(fen,bg="white",width=200,height=200)
    can.pack()
    bou1=Button(fen,text="Damier",command=serie_rectangle)
    bou1.pack(side=LEFT,padx=3,pady=3)
     
    fen.mainloop()
    Merci d'avance

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Ton code est bien trop complexe pour faire ce genre de chose, tu devrais essayer d'abord de faire une chose plus simple.
    Par exemple prendre 25 valeurs (1 à 25), et d'essayer de les répartir en 5 listes de 5 valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste = []
    for i in range(1, 26) :
        # Faire le code pour les répartir en 5 listes à l'aide du modulo
        # de façon à obtenir que liste soit [[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]]

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 9
    Par défaut
    Effectivement, j'ai trouvé beaucoup plus simple
    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
    from tkinter import *
     
    #Création du damier
    def damier() :
        y=0
        while y<10:
            if y%2==0:
                x=0
            else :
                x=1
            ligne_carre(x*20,y*20)
            y+=1
    #Creation d'une ligne
    def ligne_carre(x,y) :
        "Création d'une ligne de carrés"
        i=0
        while i<5 :
            can.create_rectangle(x,y,x+20,y+20,fill="navy")
            i+=1
            x+=40
     
    #----Fenetre principale----
    fen=Tk()
     
    #----Fenetres esclaves----
     
    can=Canvas(fen, width = 200, height = 200, bg = "white")
    can.pack(side=LEFT,padx=3,pady=3)
    bou1=Button(fen, text="Damier", command = damier )
    bou1.pack(side=RIGHT, padx=3,pady=3)
     
    fen.mainloop()
    Cependant, concernant mon premier algorithme, plus haut, je ne comprends pas pourquoi il ne retourne pas à if i<10 : ( ligne 16 ) une fois que je change la valeur de i ( ligne 37 ).
    Même si je n'utiliserai probablement plus jamais quelque chose d'aussi tiré par les cheveux, je voudrais savoir quelle est la raison de cet échec

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par LifeOfBrian Voir le message
    J'ai regardé plusieurs corrections, j'ai réussi à comprendre l'exercice.
    Cependant, je ne comprends pas pourquoi mon algorithme ne marche pas.
    L'algorithme est la chose que vous avez codé. Et je dirais que si l'algo. ne fonctionne pas, c'est pas la peine d'essayer de le coder...
    Pour alterner la couleur des cases, il suffit de remarquer qu'elle varie suivant les diagonales et se calcule pour la case (i, j) suivant le reste de i + j divisé par 2. Ce qu'on peut coder ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> for i in range(4):
    ...     for j in range(4):
    ...         print ('X' if (i + j) % 2 else 'O', end='')
    ...     print()
    ...
    OXOX
    XOXO
    OXOX
    XOXO
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Femme Profil pro
    Bordeaux
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bordeaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut
    Bonjour,
    Un petit exercice en ce 14 juillet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def serie_rectangle() :    
        x1,y1,x2,y2 = 0, 0, 20, 20
        lL=20
        for y in range(1,11):
         x1=(y%2==1)*20 # 1 ou 0 pour commencer par une case blanche ou bleue
         for x in range(1,6):
            rectangle(x1,y1,x1+lL,y1+lL)
            x1=x1+40
         y1=20*y
         print(y1)

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2017
    Messages : 9
    Par défaut
    il suffit de remarquer qu'elle varie suivant les diagonales et se calcule pour la case (i, j) suivant le reste de i + j divisé par 2.
    J'aime beaucoup.
    J'essaierai de me creuser un peu plus la tête la prochaine fois.

    Merci pour vos réponses.
    Cordialement

    edit : C'est effectivement beaucoup plus simple avec la boucle for.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme pour création de damier
    Par programmeurdu37 dans le forum Général Python
    Réponses: 16
    Dernier message: 24/02/2014, 20h37
  2. jeux - damier - problème de reseau en C++
    Par lionceau dans le forum C++
    Réponses: 5
    Dernier message: 20/12/2008, 17h05
  3. [MCD] Problème de modélisation d'un damier "spécial"
    Par billybob2 dans le forum Schéma
    Réponses: 3
    Dernier message: 08/10/2008, 14h28
  4. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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