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 :

Lire plusieurs caractères en même temps


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Lire plusieurs caractères en même temps
    Bonjour à tous,
    Je suis entrain de coder un jeu Rpg 2D du style Pokémon.
    Mes maps ressemblent à ceci mais en beaucoup plus grand:

    1, 1, 1, 1,
    1, 0, 0, 1,
    1, 0, 0, 1,
    1, 1, 1, 1,

    Mon problème est que je manque cruellement de caractères pour tous les éléments de mon jeu. J'aimerais donc réécrire mon fichier map comme ceci:

    0001, 0001, 0001, 0001,
    0001, 0000, 0000, 0001,
    0001, 0000, 0000, 0001,
    0001, 0001, 0001, 0001,

    Mais le problème est qu'il me faudrait pouvoir lire les quatre caractères en même temps, car si je prends cet élément par exemple: 0001, pyhton va lire "0" puis "0", "0", et enfin "1". Mon but serait de le faire lire d'un coup: "0001".

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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 897
    Points : 7 257
    Points
    7 257
    Par défaut
    Bonjour,

    Pouvez-vous nous donner votre code permettant de lire le fichier map?

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 479
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    S'il s'agit de lire d'un seul coup "0001", c'est facile puisque c'est du binaire:

    on passe de "0001" à un nombre entier par:

    print int("0001",2)
    1

    on passe du nombre entier 1 à "0001" par:

    print str(bin(1))[2:].zfill(4)
    0001

    Et c'est généralisable, bien qu'un peu plus compliqué: on peut considérer que "0001, 0001, 0001, 0001" est un nombre entier de 16 bits, et il est donc possible d'établir les 2 fonctions de conversion. Dans ce cas, la lecture de la ligne nécessitera seulement 4 octets, qui pourront être convertis (et vice et versa) en 4 fois 4 positions binaires.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Ce n'est pas plutôt ceci:
    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
    >>> f = open('map', 'w')
    >>> f.write('00010000')
    8
    >>> f.close()
    >>> f = open('map', 'r')
    >>> f.read(4)
    '0001'
    >>> f.read(4)
    '0000'
    >>> f.close()
    >>> f = open('map', 'r')
    >>> val = f.read()
    >>> index = 0
    >>> while index < len(val):
    ...     print(val[index:index+4])
    ...     index += 4
    ... 
    0001
    0000
    ?

    @+

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Citation Envoyé par sarlunx Voir le message
    Mon problème est que je manque cruellement de caractères pour tous les éléments de mon jeu.
    Hmm… J’en déduirais que vous n’utilisez pas que des 0 et des 1, mais l’ensemble des caractères ASCII (étendus)*? Si ces 200 signes (environs) ne vous suffisent pas, vous pouvez vous pencher sur unicode (traité en natif par python), ça sera plus simple que d’avoir recours à des groupes de signes, non*?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    print str(bin(1))[2:].zfill(4)
    0001
    Salut

    Normalement str() n'est pas nécessaire puisque la fonction bin() renvoie déjà une chaine...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print bin(1)[2:].zfill(4)
    0001...

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 479
    Points : 9 278
    Points
    9 278
    Billets dans le blog
    6
    Par défaut
    Bonjour Sve@r,

    Merci! Je le sais mais je l'oublie souvent...

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    En fait je ne vois pas l’intérêt, et surtout pour zfill, puisque le po parle de 4 caractères, pas de binaire. S'il a besoin d'une chaîne "0000" c'est pour pouvoir stocker plus d'informations par rapport à "0" ou "1".
    C'est du moins ce que j'en ai (déduit) compris.

    Il vas sans doute falloir attendre une réponse de sarlunx.

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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 897
    Points : 7 257
    Points
    7 257
    Par défaut
    Mon problème est que je manque cruellement de caractères pour tous les éléments de mon jeu. J'aimerais donc réécrire mon fichier map comme ceci:
    Quelqu'un peut-il répondre à cette question?

    Pourquoi ne pas simplement rajouter des colonnes et encore mieux des nombres sans virgules et sans espaces, qui seraient traitées plus tard?

    Bref je n'ai pas réussi à comprendre ce que le PO a prévu de faire... avec cette stratégie des 3 nombres supplémentaires sur la même colonne.

  10. #10
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    @Fred: le PO a mentionné que ses maps étaient bien plus grande, son soucis semble (si je ne me trompe) se situer au nombre d'éléments/valeurs représentables je pense qu'il a du voulu représenter ses items en "binaire". Dans le cas de retrait des virgules et des espaces, je pense que le PO aurait beaucoup de mal à dessiner ses maps à la "main"(s'il procède bien de cette manière) dans un éditeur de texte. Bref, personne mieux que lui ne saurait éclaircir l'affaire.
    Pour ma part, je pense que des <int> ou des <long> feraient très bien l'affaire.
    C'est vrai que la virgule en fin de ligne semble causer un effet de bord, qui semble inutile(amha).
    Donc en gros, avec les entiers, ca donnerait...
    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
    import csv
    import StringIO
     
    fichier = StringIO.StringIO("""1, 1042, 232323, 424444444444,
    1212, 23234, 5235, 1341234134,
    323, 23, 23, 42222222222222222,
    23, 2, 1, 3""")
     
     
    def get_map(fileO):
        """get an read-opened file and return an integer/long map"""
        reader = csv.reader(fileO)
        res = []
        for lst in reader:
            res.append([int(i) for i in lst if i])
        return res
     
    print get_map(fichier)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Pourquoi ne pas simplement rajouter des colonnes et encore mieux des nombres sans virgules et sans espaces, qui seraient traitées plus tard?
    Bah, tant qu'à faire (et surtout vu le langage utilisé) autant éviter ces astuces typiques du programmeur C (mais pas forcément nécessaires ici) et partir sur un vrai objet apte à gérer sa map quoi.

    Citation Envoyé par fred1599 Voir le message
    Bref je n'ai pas réussi à comprendre ce que le PO a prévu de faire... avec cette stratégie des 3 nombres supplémentaires sur la même colonne.
    C'est vrai que ce serait bien s'il précisait un peu la façon dont il réfléchit...

  12. #12
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    bonjour,

    pour ma part, je pense que sarlunx veut en fait gérer plusieurs couches logiques dans ses cartes. Par exemple :

    a201 -> pourrait être la structure pour :
    - 'a' = caractère représentant un type de tuile
    - '2' = caractère représentant les collisions
    - '0' = caractère représentant les objets sur la carte
    - '1' = caractère représentant les sortie possibles sur la carte
    et tout ceci pour la position logique 0,0 dans sa map 2D

    Il pourrait donc lire ligne par ligne avec un readline, puis traiter ensuite ses bloc de données pour les stocker dans ses structures de de données prévues à cette effet.

    Du coup, je ne voit pas vraiment le problème pour ce type d'opération avec python ?
    Les fonctions split et autres peuvent charger tout cela en mémoire et ensuite chaque cellule peut être traitée au besoin.

    Salutations.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Excusez ma réponse si tardive, j'ai eu des soucis de connexion.
    Je vais peut être réexpliquer mon problème.
    Pour l'instant, les éléments de ma map sont composé d'un seul caractère:

    1, 2, 3,
    a, b, c,
    ?, !, =,

    Le problème avec ces caractères c'est que cela devient (très) vite bordelique et le nombre de caractère n'est pas assez suffisant.
    Il me faudrait donc remplacer ces caractères par une chaîne (de si possible 4 décimales):

    0001, 0002, 0003,
    0004, 0005, 0006,
    0007, 0008, 0009,

    Ainsi, j'ai accès rien qu'avec des nombres à 10'000 possibilités. De plus, je pourrais mieux classer mes éléments dans mes fichiers et de cette manière coder mon jeu plus sereinement.

    Ma fonction qui lit les fichier map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def generer(self):
            #Permet de générer le niveau en fonction du fichier map.
            with open(self.fichier, "r") as fichier:
                structure_niveau = []
                for ligne in fichier:
                    ligne_niveau = []
                    for sprite in ligne:
                        #On ignore les "\n", les virgules et le espaces
                        if sprite != "\n" and sprite != "," and sprite != " ":
                            ligne_niveau.append(sprite)
                    #On ajoute la ligne à la ligne du niveau
                    structure_niveau.append(ligne_niveau)
                #On sauvegarde cette structure
                self.structure = structure_niveau
    Il me faudrait donc modifier ma fonction pour qu'elle lise les strings par chaîne de 4 caractères (ex: 0001) et ne pas lire caractère par caractère.
    Comme ça, si je lui propose "0001", la fonction va lire directement les 4 caractère ensemble (0001), et ne pas lire caractère par caractère: "0", "0", "0", "1".

  14. #14
    Membre habitué Avatar de bringer
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Points : 137
    Points
    137
    Par défaut
    bonjour sarlunx,

    pourquoi n'utilises tu pas la fonction getline() pour charger la ligne de ta map en mémoire dans une string, puis découper cette ligne avec la fonction split(), qui rangera tout cela dans une jolie liste ?

    Ensuite, en parcourant la liste, tu pourras au besoin convertir chaque string de 4 caractères en nombre int.

    Aujourd'hui, ta fonction stocke une ligne lue complète dans une liste, à quoi bon ? Tu as besoin de lire chaque code de case, pas une ligne entière.

    salutations

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 334
    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 334
    Points : 36 855
    Points
    36 855
    Par défaut
    Salut,
    Je n'ai probablement pas tout compris mais
    Citation Envoyé par sarlunx Voir le message
    Il me faudrait donc modifier ma fonction pour qu'elle lise les strings par chaîne de 4 caractères (ex: 0001) et ne pas lire caractère par caractère.
    Je n'ai probablement pas tout compris mais le gros défaut est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               for ligne in fichier:
                    ligne_niveau = []
                    for sprite in ligne:
    "for sprite in ligne" va transformer la ligne en liste de caractères.
    Si vos symboles sont effectivement séparés par des ',' comme dans "0001, 0002, 0003,", il suffit peut être de découper la ligne suivant ces ','.

    Du coup on obtient un découpage par mots qui sont composés de 4 caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> line = "0001, 0002, 0003,"
    >>> for sprite in line.split(','): 
    ...         print (sprite.strip())
    ...
    0001
    0002
    0003
    L'idée restant de lire ligne par ligne puis d'utiliser les "," pour séparer les symboles qu'elle contient.

    Si votre ligne était "000100020003", le découpage par paquet de 4 pourrait être fait avec des slices:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> line = "000100020003"
    >>> print ([ line[i:i+4] for i in range(len(line)//4)])
    ['0001', '0010', '0100']
    Une autre sujet/question pourrait être d'écrire ces fichiers en binaire i.e. avec des "entiers" plutôt qu'avec la représentation d'entiers sous forme de texte.

    - W

Discussions similaires

  1. [pep/8] Lecture de plusieurs caractères en même temps
    Par Roud9 dans le forum Assembleur
    Réponses: 0
    Dernier message: 05/02/2015, 17h22
  2. Rendre visible / invisible plusieurs éléments en même temps
    Par Bluespike62 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/01/2006, 17h43
  3. laisser cochés plusieurs TRadioButton en même temps.
    Par heider dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/12/2005, 14h15
  4. lecture de plusieurs port en même temps
    Par manaboko dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 15h26
  5. Réponses: 9
    Dernier message: 17/04/2004, 16h32

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