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 :

Une boucle sans fin ?


Sujet :

Python

  1. #1
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut Une boucle sans fin ?
    Bonjour ,

    Un petit probl�me de boucle qui ne finit pas....et j'ignore pourquoi.

    Je ne vais pas vous mettre tout le code, juste les def qui sont concern�es (pour info, c'est l'histoire d'un robot symbolis� par un "X" qui doit appara�tre al�atoirement sur ma carte, qui est dans un fichier txt et que je charge dans ma variable self.labyrinthe) :
    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
    def robot(self) :
            """Place le robot sur la carte, de manière aléatoire"""
            if len(self.labyrinthe) > 1 :
                limit_maxi = len(self.labyrinthe)-1
                x_aleat = randint(1,limit_maxi)
                y_aleat = randint(1,limit_maxi)
                position_aleat = self.labyrinthe[x_aleat][y_aleat]
     
                while "X" not in self.labyrinthe :
                    if position_aleat == " " :
                        position_aleat = "X"
                    else :
                        x_aleat = randint(1,limit_maxi)
                        y_aleat = randint(1,limit_maxi)
     
     
        def chargement(self) :
            """Récupère la carte choisie par l'utilisateur, et la transfère dans
    une liste des lignes de la carte"""
            with open(self.path +'/'+ self.nom,'r') as fichier :
                self.labyrinthe = []
                while 1 :
                    ligne = fichier.readline()
                    if ligne == '' :
                        break
                    else :
                        ligne = list(ligne)                                 
                    self.labyrinthe.append(ligne)
     
            # j'ajoute le robot :
            self.robot()
     
     
        def generation_aleatoire(self) :
            """Génère automatiquement des cartes aléatoires, sans garantir que le
    labyrinthe sera 'faisable'"""
            elts_laby = [' ','O','.',' ']
            self.labyrinthe = []
     
            # création de 15 listes de symboles aléatoires   
            for _ in range(15):
                line = []
                for _ in range(15):
                    line.append(choice(elts_laby))
                self.labyrinthe.append(line)
     
            for ligne in self.labyrinthe :
                ligne.append('\n')
     
            # ensuite remplacement des symboles entourant le labyrinthe par
            # des 'o' pour qu'il soit "fermé"
            self.labyrinthe[0] = ['O']*15
            self.labyrinthe[0].append('\n')
     
            self.labyrinthe[14] = ['O']*15
            self.labyrinthe[14].append('\n')
     
            i = 0
            while i <= 14 :
                self.labyrinthe[i][14] = 'O'
                self.labyrinthe[i][0] = 'O'
                i += 1
     
            # + la sortie + le robot : 
            self.labyrinthe[12][14] = 'U'
            self.robot()
    Faites pas gaffe si c'est moche, c'est un code qui a quelques...jours au moins (peut-�tre m�me quelques semaines)

    Le probl�me c'est que je ne sais pas o� est le truc qui cloche, celui qui boucle � l�infini. Je suppose que c'est dans mon self.robot() mais je suis m�me pas s�re, et si oui je me demande bien pourquoi.

    Vos id�es (et votre patience pour comprendre le code ) sont les bienvenus

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

    Citation Envoy� par RowanMayfair Voir le message
    Je suppose que c'est dans mon self.robot() mais je suis m�me pas s�re, et si oui je me demande bien pourquoi.
    Chaque fois que vous �crivez une boucle while, vous devez vous poser la question de savoir � quelle condition �� va bien pouvoir se terminer.

    Et quand vous lisez:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
                while "X" not in self.labyrinthe :
                    if position_aleat == " " :
                        position_aleat = "X"
                    else :
                        x_aleat = randint(1,limit_maxi)
                        y_aleat = randint(1,limit_maxi)
    il est clair �� ne sort que si "X" not in self.labyrinthe devient vraie.
    Pour ��, il faudrait que l'objet self.labyrinthe soit mis � jour � l'int�rieur de la boucle...

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

  3. #3
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    je ne sais pas comment mettre � jour l'objet � l'int�rieur de ma boucle.
    Enfin d�j� je sais o� est le probl�me, c'est d�j� �a.
    Donc si on part sur un truc plus simple (pour m'�viter d'ex�cuter mon programme toutes les 2 minutes ), le probl�me est l� en effet :
    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
    liste = [[1,2,5],[5,9,4],[4,5,3]]
     
     
     
    while 1 :
        for ligne in liste :
            if liste[1][0] == 5 :
                liste[1][0] = 10
                print(liste)
                break
            elif liste[1][0] == 10 :
                print(liste)
                break
            else :
                print("GRRRRRRRR")
                print(liste)
    M�me en mettant des break partout, �a ne fonctionne pas
    J'en ait r�v� cette nuit de cette histoire

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

    Citation Envoy� par RowanMayfair Voir le message
    je ne sais pas comment mettre � jour l'objet � l'int�rieur de ma boucle.
    Si vous ne comprenez plus le code que vous avez �crit, il faut revenir au pourquoi vous l'avez �crit.

    Je ne sais pas trop quelle �tait votre intention de d�part mais quand je lis "Place le robot sur la carte, de mani�re al�atoire"... J'imagine (peut �tre � tord) qu'on va chercher une case (i, j) libre pour y placer un 'X' repr�sentant le robot.

    Donc les it�rations devraient se faire sur le tirage al�atoire de (i, j) et la condition de sortie de la boucle pourrait �tre case(i, j) libre pour sortir de la boucle et placer le 'X' dans cette case.

    Puis�tant "rigoureux", je me poserai la question de savoir s'il y a assez de cases libres pour qu'on puisse en trouver une rapidement de cette fa�on l�: plus de case libre, �� va encore boucler.

    Pour �viter ��, il faut "borner" le nombre de tirages (essayer au plus N fois ou sortir en erreur) ou trouver les indices de toutes les cases libres (histoire de savoir qu'il en existe) et en choisir une au hasard.

    Tout �� pour dire qu'il faut un peu r�fl�chir � ce qu'on veut faire avant de coder et anticiper un peu les cons�quences de ses choix dans des cas particuliers. Puis si �� ne fonctionne pas, il faut r�fl�chir encore car si ce n'est pas une faute de frappe, c'est qu'on est pass� � c�t� de... i.e. faire travailler son cerveau avant de coder.

    Citation Envoy� par RowanMayfair Voir le message
    M�me en mettant des break partout, �a ne fonctionne pas
    J'en ait r�v� cette nuit de cette histoire
    Si l'intention est de remplacer la valeur de la case (1, 0) par 10 si elle vaut 5... je ne vois pas l'int�r�t de faire une boucle "for" en encore moins de l'encapsuler dans un "while True".

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 851
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par d�faut
    Bonjour

    Citation Envoy� par RowanMayfair Voir le message
    Donc si on part sur un truc plus simple (pour m'�viter d'ex�cuter mon programme toutes les 2 minutes ), le probl�me est l� en effet :
    D'autant plus que d'�crire for ligne in liste puis faire tout un traitement qui n'utilise absolument pas la variable "ligne" revient un petit peu � la m�me remarque � propos du while(condition) avec tout un traitement qui ne modifie jamais ladite condition...

    Citation Envoy� par RowanMayfair Voir le message
    M�me en mettant des break partout, �a ne fonctionne pas
    Ben l� encore c'est presque pareil: une boucle o� tous les diff�rents traitements internes finissent tous par un break n'a alors aucune raison d'exister.

    Citation Envoy� par RowanMayfair Voir le message
    je ne sais pas comment mettre � jour l'objet � l'int�rieur de ma boucle.
    A mon avis, �a devrait fortement ressembler � un truc du genre self.labyrinthe[x_aleat][y_aleat]="X". La vraie question c'est surtout "pourquoi faire une boucle". On veut placer un "X" on le place point. On n'�crit pas tant que "X" non placé parce qu'�tant plac� � la premi�re it�ration, la boucle ne bouclera plus.
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Normalement, il y a toujours des cases libres. En tout cas dans les cartes d�j� enregistr�es, et celles qui se cr�ent al�atoirement ce serait bien extraordinaire s'il n'y avait pas d'espaces (elles sont cr��es � partir d'une liste dont la moiti� des �l�ments sont des espaces). Mais je devrait quand m�me pr�voir le cas.

    Bref je vais donc essayer de faire l'inverse en effet, je n'y avait pas pens� : parcourir le labyrinthe, en cr�ant des listes avec les indices des endroits o� se trouvent les espaces. Je vais tenter comme �a, ce sera en effet d�j� un peu moins lourd.

    Edit : pour vous donner une id�e, voici une carte g�n�r�e al�atoirement :
    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
    OOOOOOOOOOOOOOO
    O..O O OO  O.OO
    O   ..OO .O OOO
    O  ..OO O    OO
    O... OO.OO  . O
    OO. ..O  O. OOO
    O .. .. O.   .O
    O O.    O.   .O
    O .  ..   . ..O
    O  . OO .O . OO
    O   O . OO  . O
    O    OO.  O OOO
    O O    .      U
    O     OO  O.O.O
    OOOOOOOOOOOOOOO

  7. #7
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Une question : est-ce qu'il est possible d'utiliser random.choice (ou une autre m�thode du module random) sur les cl�s d'un dictionnaire ?

    Parce que, par exemple, ce lien me dit que oui : https://www.science-emergence.com/Ar...e-sous-python/
    Mais mon Python � moi, il s'obstine � me dire que non, parce que, je le cite :
    TypeError: 'dict_keys' object is not subscriptable
    Qui a raison ?
    Le lien que j'ai trouv� semble plut�t r�cent (2017) mais est-ce vraiment du Python 3 ? (c'est p�nible �a....les gens pr�cisent rarement )

  8. #8
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    je vous mets ma solution (qui fonctionne !!! ) :
    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
    libre = {}
     
            for ligne in self.labyrinthe :
                for idx,elt in enumerate(ligne) :
                    if elt == ' ' :
                        cle = self.labyrinthe.index(ligne)
                        libre.setdefault(cle,[]).append(idx)
     
            x = randrange(1,len(libre)-1)
     
            while x not in libre.keys() :
                x = randrange(1,len(libre)-1)
     
            y = choice(libre[x])
     
            self.labyrinthe[x][y] = "X"
    donc finalement j'ai stock� mes espaces libres dans un dictionnaire. J'ai pas vraiment trouv� mieux. Mais du coup faire de l'al�atoire sur les cl�s dudit dictionnaire, c'est pas si simple. Enfin dans ce cas, �a n�cessite une boucle pour v�rifier si le nombre tir� au hasard par randrange est bien une cl�, c'est � dire l'indice d'une ligne qui contient un/des espaces.

    Bref.
    Si vous voulez critiquer, que vous pensez qu'il y avait mieux, plus efficace, plus court, toussa.....n'h�sitez pas

    Edit : le setdefault(), j'ai pas oubli� il est imprim� dans mon petit cerveau

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 851
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par RowanMayfair Voir le message
    Qui a raison ?
    Le lien que j'ai trouv� semble plut�t r�cent (2017) mais est-ce vraiment du Python 3 ? (c'est p�nible �a....les gens pr�cisent rarement )
    Ta doc est probablement du Python2. Et � l'�poque P2, dict.keys() retournait une liste qui �tait alors utilisable dans random.choice() (pr�cis�ment parce qu'une liste est indi�able et que c'est la base du choix).

    Aujourd'hui, dict.keys() de P3 retourne un type appel� "dict_keys()" qui est "tout comme une liste" sauf que ce n'est pas indi�able (pas possible de demander par exemple dict.keys()[3]) donc non, tu ne peux plus passer dict.keys()random.choice() (tout comme tu ne peux pas lui passer un ensemble, un g�n�rateur ou autres trucs exotiques non indi�ables).

    Toutefois rien ne t'interdit de transformer un "dict_keys" en truc indi�able (comme une liste ou un tuple) puis de passer ce truc � random.choice() => random.choice(tuple(dict.keys()))...

    Citation Envoy� par RowanMayfair Voir le message
    Si vous voulez critiquer, que vous pensez qu'il y avait mieux, plus efficace, plus court, toussa.....n'h�sitez pas
    Ben d�j� juste question "groupement" j'aurais �crit
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
            x = randrange(1,len(libre)-1)
            while x not in libre.keys() :
                x = randrange(1,len(libre)-1)
    sans ligne vide (j'ai l'habitude d'�crire ensemble les trucs qui forment un "tout" logique"). Donc l'initialisation, le test et la r�initialisation si le test ne convient pas forment pour moi un "tout" qui est "trouver un espace libre".

    Mais comme en plus je n'aime pas r�p�ter deux fois des instructions qui ne font qu'une action, moi j'aurais alors �crit �a de cette fa�on
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
            while True:
                x = randrange(1,len(libre)-1)
                if x in libre.keys() : break
    Pour le reste il faudrait mieux regarder...
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    on a post� en m�me temps

    mais oui c'est beau avec un tuple.
    donc finalement �a donne �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    libre = {}
     
            for ligne in self.labyrinthe :
                for idx,elt in enumerate(ligne) :
                    if elt == ' ' :
                        cle = self.labyrinthe.index(ligne)
                        libre.setdefault(cle,[]).append(idx)
     
            x = choice(tuple(libre.keys()))
     
            y = choice(libre[x])
     
            self.labyrinthe[x][y] = "X"

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

    Citation Envoy� par RowanMayfair Voir le message
    Si vous voulez critiquer, que vous pensez qu'il y avait mieux, plus efficace, plus court, toussa.....n'h�sitez pas
    Je ne comprends par trop l'int�r�t de passer par un dictionnaire et une liste pour stocker la liste des index des cases vides.
    Plus simplement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    length = len(self.labyrinthe)
    cases_vides = []
    for i in range(length) 
          for j in range(length) 
               if self.labyrinthe[i][j] == ' ':
                   cases_vides.append((i, j))
    puis on choisi un (i, j):
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    i, j = random.choice(cases_vides)
    et on le rend occup�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    self.labyrinthe[i][j] = 'X'
    note: et on a pris la peine de s'assurer que random.choice d'une liste vide plante.

    Apr�s si on est a peu pr�s s�r que le tableau est rempli � moiti� de cases vides, on peut essayer un nombre de fois "petit":
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    length = len(self.labyrinthe)
    for _ in range(length):
        i, j = random.randint(1, length), random.randint(1, length)
        if self.labyrinthe[i][j] == '  ':
             break
    else:
        raise Exception('fatal, pas de case vides')
    self.labyrinthe[i][j] = 'X'
    histoire de r�viser un peu la construction for...else... bien utile parfois.

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

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 851
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par wiztricks Voir le message
    Je ne comprends par trop l'int�r�t de passer par un dictionnaire
    A mon avis, il voulait absolument placer un setdefault()

    Citation Envoy� par wiztricks Voir le message
    Plus simplement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    length = len(self.labyrinthe)
    cases_vides = []
    for i in range(length) 
          for j in range(length) 
               if self.labyrinthe[i][j] == ' ':
                   cases_vides.append((i, j))
    Et si on veut r�viser un peu les listes en intension: cases_vides=tuple((i, j) for i in range(length) for j in range(length) if self.labyrinthe[i][j] == ' ').

    On peut alors passer l'�tape "cases_vides=" et �crire directement (i, j)=random.choice(tuple((i, j) for i in range(length) for j in range(length) if self.labyrinthe[i][j] == ' ')) (j'ai aussi essay� de passer l'�tape "(i, j)=" mais je n'y suis pas arriv� )

    Citation Envoy� par RowanMayfair Voir le message
    Si vous voulez critiquer, que vous pensez qu'il y avait mieux, plus efficace, plus court, toussa.....n'h�sitez pas
    Ben tu pourrais ne plus te caler sur "ce qui s'affiche" mais sur "ce qui est g�r� en interne".
    Explications: tu utilises des �l�ments d'affichage ("X", cases vides) pour g�rer tes actions (une case vide c'est une case qui contient " "). Mais ce sont justement des �l�ments d'affichage, pas des �l�ments de calculs. Et si demain tu veux remplacer "X" par "x" parce que �a fait plus joli ?
    Tu pourrais utiliser des bool�ens (True/False) pour g�rer tes cases vides/remplies ce qui serait plus rapide (il est plus rapide de tester un bool�en qu'une chaine). Ou alors des nombres (0=vide, 1=robot, 2=joueur, etc).
    Ca te permettrait alors de rendre ton jeu plus modulable (offrir au joueur la possibilit� de choisir la forme de ses pions) sans rien changer aux calculs. Et toi, tu adaptes juste les valeurs internes aux pions du joueur lors de l'affichage �cran.

    C'est une fa�on de faire qui se rapproche de la notion de MVC (Mod�le, Vue, Controleur).
    Ca permet de dissocier dans de gros projets tout ce qui est datas (mod�le), saisie/affichage (vue) et calculs (Contr�leur). Ainsi on peut passer assez facilement d'une vue X � une vue Y (on change la librairie graphique) sans toucher aux calculs. De m�me on peut stocker les donn�es dans des fichiers aujourd'hui et dans une bdd demain sans toucher au reste.
    Bref c'est un bon exercice...
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 776
    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 776
    Par d�faut
    Citation Envoy� par Sve@r Voir le message
    Ben tu pourrais ne plus te caler sur "ce qui s'affiche" mais sur "ce qui est g�r� en interne".
    Explications: tu utilises des �l�ments d'affichage ("X", cases vides) pour g�rer tes actions (une case vide c'est une case qui contient " "). Mais ce sont justement des �l�ments d'affichage, pas des �l�ments de calculs.
    Le PO a post� a quoi ressemble un fichier labyrinthe dans cette r�ponse.
    L'utilisateur peut visualiser le labyrinthe avec more ou cat et le modifier avec un simple �diteur. Et si cette chose l� est une exigence fonctionnelle, coder ces informations en 1234 ou encore la compresser ne permettra plus cela.

    Citation Envoy� par Sve@r Voir le message
    Ca te permettrait alors de rendre ton jeu plus modulable (offrir au joueur la possibilit� de choisir la forme de ses pions) sans rien changer aux calculs. Et toi, tu adaptes juste les valeurs internes aux pions du joueur lors de l'affichage �cran.
    Que le pion soit cod� X ou 4 dans le fichier n'emp�che pas de l'afficher comme on veut.

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

  14. #14
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Citation Envoy� par wiztricks Voir le message
    Salut,



    Je ne comprends par trop l'int�r�t de passer par un dictionnaire et une liste pour stocker la liste des index des cases vides.
    Plus simplement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    length = len(self.labyrinthe)
    cases_vides = []
    for i in range(length) 
          for j in range(length) 
               if self.labyrinthe[i][j] == ' ':
                   cases_vides.append((i, j))
    (...)
    - W
    Oui mais l�, dans la liste cases_vides, j'ai.....des ' '. Alors que je cherche les index de ces cases. Le n� de ligne associ� � mon n� de case.
    Et je n'ai pas trouv� comment obtenir �a avec des listes dans des listes. Parce que je connais la m�thode liste.index(), mais �a me renvoie uniquement le 1er index trouv� sur la ligne, pas tous les index. Bref, c'est peut-�tre possible, mais je ne sais pas comment.
    Alors que je sais qu'avec un dictionnaire, je peux stocker en cl� l'index de la ligne, et en valeurs les index de toutes les cases vides sur cette ligne.

    Citation Envoy� par Sve@r
    A mon avis, il voulait absolument placer un setdefault()
    En fait, c'est elle.
    Je sais. Une femme (plus toute jeune en +), qui a la pr�tention de vouloir utiliser son cerveau, c'est stup�fiant .
    Je vais prendre 5 minutes pour aller trouver et mettre un avatar qui �vitera les confusions.

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

    Citation Envoy� par RowanMayfair Voir le message
    Oui mais l�, dans la liste cases_vides, j'ai.....des ' '. Alors que je cherche les index de ces cases. Le n� de ligne associ� � mon n� de case.
    Si cases_vides d�marre � liste vide et qu'on y ajoute des tuples (i, j), impossible d'y retrouver des ' ' et ce juste � cause de cases_vides.append((i, j))...

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

  16. #16
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Ah mais oui
    En effet, j'ai pas pens� � cette solution pourtant simple...je vais tester �a, dans une liste il est plus facile d'utiliser random.

  17. #17
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Citation Envoy� par wiztricks Voir le message
    Salut,



    Si cases_vides d�marre � liste vide et qu'on y ajoute des tuples (i, j), impossible d'y retrouver des ' ' et ce juste � cause de cases_vides.append((i, j))...

    - W
    ah ah
    en le faisant je me souviens que j'avais essay�, un peu d�sesp�r�ment, de faire comme �a au d�part.
    Mais j'avais fait un truc du genre cases_vides.append(i,j)
    donc, fatalement, Python m'a envoy� boul�e avec ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    TypeError: append() takes exactly one argument (2 given)
    Du coup j'ai fait un dictionnaire.
    Alors qu'il suffisait, en effet, de mettre 2 parenth�ses autour de (i,j) pour qu'il accepte de le prendre comme un seul argument

    Je me coucherai encore moins b�te ce soir

    Merci

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 851
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par wiztricks Voir le message
    Le PO a post� a quoi ressemble un fichier labyrinthe dans cette r�ponse.
    L'utilisateur peut visualiser le labyrinthe avec more ou cat et le modifier avec un simple �diteur. Et si cette chose l� est une exigence fonctionnelle, coder ces informations en 1234 ou encore la compresser ne permettra plus cela.
    Le MVC peut s'appliquer aussi bien pour des donn�es sortantes que des donn�es entrantes. Aujourd'hui son fichier c'est "OOOOOOOOO" pour les murs mais peut-�tre que le truc pourrait s'adapter � un fichier qui contiendrait "-----------". Et en interne ce serait toujours cod� de la m�me fa�on.
    Et puis c'est un programme qui a quand-m�me un arri�re go�t de TP �a. Et c'est bien justement les TP. Ca permet de s'entrainer � des technologies pas forc�ment n�cessaires ici mais qui pourraient l'�tre plus tard. J'ai quand-m�me pr�cis� "c'est un bon exercice" dans mon post...

    Citation Envoy� par wiztricks Voir le message
    Que le pion soit cod� X ou 4 dans le fichier n'emp�che pas de l'afficher comme on veut.
    Oui. Mais je ne parlais pas du pion cod� dans le fichier mais cod� en interne (dans la partie "Controleur" donc). J'ai pas fait de tests avec timeit() mais intuitivement, et vu comment j'imagine ce que donnera la traduction Python en code machine, j'ai l'impression que comparer un truc avec int(4) sera plus rapide que le comparer avec str("X")...

    Citation Envoy� par RowanMayfair Voir le message
    Alors qu'il suffisait, en effet, de mettre 2 parenth�ses autour de (i,j) pour qu'il accepte de le prendre comme un seul argument
    En fait c'est d� � la fa�on qu'a Python d'identifier un tuple.
    A la base, un tuple c'est plusieurs items ("plusieurs" pouvant tout de m�me aller jusqu'� 0) s�par�s par une virgule => ex tp=1, 2, 3. Il faut bien noter que c'est la virgule qui fait le tuple et non les parenth�ses (m�me si l'affichage d'un tuple se fait avec des parenth�ses). Ainsi tp=1, sera un tuple avec un seul �l�ment tandis que tp=(1) sera un simple int. Mais tp=() sera un tuple vide (vas t'y retrouver avec �a !!!)

    Le souci se pose quand on veut passer un tuple � une fonction. Si on lui passe le tuple dans sa plus simple expression (ex fct(1, 2, 3) on tombe dans l'�criture classique d'un appel de fonction avec 3 arguments. Et si la fonction n'est pr�vue que pour en recevoir qu'un seul, Python ne s'y retrouve plus et l�ve une exception.
    Donc il conviendra d'encadrer le tuple de parenth�ses pour bien signifier "un truc". Et comme la fonction a aussi des parenth�ses, on se retrouve avec un doubl� => fct((1, 2, 3)).

    Donc quand on manipule des tuples, parfois les parenth�ses ne sont pas n�cessaires, parfois elles le sont. Pour ma part j'ai donc fait le choix de toujours les mettre => tp=(1, 2, 3).

    A noter que ce souci se pose aussi avec les listes mais d'un autre point de vue. Une liste c'est un truc entre crochets. Ainsi tp=(1) sera un simple int mais li=[1] sera une liste. Donc l� c'est un peu pareil, la virgule est parfois obligatoire (tp=(1,)) et parfois ne l'est pas (li=[1]). J'ai donc l� aussi fait le choix de toujours la mettre => tp=(1,); li[1,]. Ce qui me permet si n�cessaire de reprendre assez facilement un code si j'ai utilis� une liste l� o� un simple tuple aurait suffit (et inversement).
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Membre �clair� Avatar de RowanMayfair
    Femme Profil pro
    D�veloppeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : D�veloppeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par d�faut
    Oh merci pour toutes ces explications ! en effet, j'avais cru m'apercevoir que selon les circonstances, on est pas oblig�s de r�diger un tuple de la m�me fa�on. Et c'est pas �vident parfois !

    Et, en effet il s'agit d'un TP.
    Je l'ai fait il y a quelques semaines, � ce moment l� j'avais d�j� �t� un petit peu plus loin que ce qui �tait demand� puisque j'offre la possibilit� � l'utilisateur de g�n�rer une carte al�atoire. Histoire que le joueur ait un peu de vari�t� sans avoir � s'emb�ter de cr�er lui-m�me un labyrinthe.

    Or l� c'est un autre TP, ou il faut am�liorer le 1er.
    Et les am�liorations demand�es sont d�j� tr�s compliqu�es (l� j'ai fait le plus facile ), je ne suis d�j� pas certaine de r�ussir � aller au bout cette fois.
    Donc l� tout de suite, je vais me contenter d'essayer de fournir ce qui est demand�. Ensuite....on verra.

    Edit : en plus je d�bute (vraiment) donc l� les temps "machine"...euh...c'est pas encore mon probl�me

Discussions similaires

  1. R�ponses: 4
    Dernier message: 02/11/2009, 16h22
  2. [D�butant]Boucle sans fin : Wend non reconnu
    Par SebHoule dans le forum IHM
    R�ponses: 5
    Dernier message: 12/06/2006, 16h49
  3. C : utilisation de getopt - il boucle sans fin...
    Par moussmouss dans le forum C
    R�ponses: 14
    Dernier message: 21/12/2005, 11h35
  4. Boucle sans fin : danger pour le serveur ?
    Par R�miz dans le forum Langage
    R�ponses: 4
    Dernier message: 09/12/2005, 16h52
  5. [SQL SERVER 2000] Fonction utilisateur : boucle sans fin
    Par galinijay dans le forum MS SQL Server
    R�ponses: 3
    Dernier message: 30/09/2005, 16h03

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