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

Programmation multimédia/Jeux Python Discussion :

projet "marioballe" S2


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut projet "marioballe" S2
    Bonjour,
    dans le cadre d'un projet de première année de prépa intégrée je dois créer un jeu en ligne de commande linux sans bibliothèque graphique ou autre.
    mon projet avance plutôt bien mais j'ai été confronté un "bug" assez curieux qui concerne les chaines unicodes:

    la fonction qui me pose problème est la suivante

    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
     
    def affiche(grid, x=175, y=22):# affiche  le fond à partir d'une liste
        global scroll
        st = ''
        for a in range(y):
            for i in range(x):
                try:# si les coordonnées x,y existent
                    if grid[a][i + scroll] == ' ':
                        st += '\033[0;107m '
                    elif grid[a][i+scroll] == 'x':
                        st += '\033[31m☠'   
                    elif grid[a][i+scroll] == '$':
                        st += "\033[33m💰"
                    elif grid[a][i+scroll] == 'a':
                        st += "\033[30m🔫"
                    elif grid[a][i+scroll] == '#':
                        st += "\033[30m#"
                except IndexError:# bout de liste: coordonnées inexistantes
                    pass
            st += '\n'
        sys.stdout.write('\033[0m')
        sys.stdout.write(st)
        sys.stdout.flush()
    ( &#9760 est ☠mais la balise code interprète directement mon caractère au lieu de l'afficher ce qui illustre bien le problème)


    le problème que j'ai eu est que n'étant pas sûr que copier coller des caractères directement dans on programme est une bonne idée (portabilité, voir plus haut...) j'ai donc essayé de remplacer

    st += '\033[31m☠'
    par
    st += u'\033[31m\u2620'

    mais a partir du moment ou je déclare une chaine comme Unicode (u"___") la fonction devient lente et mon programme clignote a vue d’œil
    comme je l'ai dit la fonction marche telle qu'elle est mais je serais curieux de savoir pourquoi le programme est autant ralenti.
    merci d'avance de vos réponses!

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    pour information voici une image du jeu dans son état actuel (ca pique les yeux je sais)
    Nom : Capture d'écran de 2018-04-13 22-16-38.png
Affichages : 101
Taille : 38,7 Ko
    (la balle est le personnage principal)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par lisiof Voir le message
    mais a partir du moment ou je déclare une chaine comme Unicode (u"___") la fonction devient lente et mon programme clignote a vue d’œil
    comme je l'ai dit la fonction marche telle qu'elle est mais je serais curieux de savoir pourquoi le programme est autant ralenti.
    Puisque vous utilisez encore Python2, la syntaxe u'....' est bien plus correcte pour représenter votre chaîne de caractère. Après, sys.stdtout.write transforme cela en "bytes" suivant l'encoding par défaut de sys.stdout, puis c'est le driver des terminaux qui gère le bébé.

    Vous devriez essayer de coder çà avec un autre langage pour voir/confirmer.

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

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    En effet après test, la différence est très conséquente en python 2 (u" " parfois 4 fois plus lent que sans déclarer qu'on est en unicode)
    Alors qu'en python 3 la différence est insignifiante.
    C'est dommage que python 2 nous soit imposé...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par lisiof Voir le message
    En effet après test, la différence est très conséquente en python 2 (u" " parfois 4 fois plus lent que sans déclarer qu'on est en unicode)
    Alors qu'en python 3 la différence est insignifiante.
    C'est dommage que python 2 nous soit imposé...
    Sur mon Ubuntu, il n'y a pas de différence notable entre Python2 et Python3.
    Soit je ne regarde pas ce qu'il faut soit le soucis n'est pas côté Python.

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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    voici le bout de code que j'ai testé en python 2 et 3 et qui me montre une différence entre les deux méthodes en python 2 (variable évidemment)
    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
     
    import time
    import sys
     
    t1 = time.time()
    for i in range(1000):
        sys.stdout.write(u"\u2620")
    t2 = time.time()
    for i in range(1000):
        sys.stdout.write("☠")
    t3 = time.time()
     
    print ("\n")
    print (t2-t1)
    print (t3-t2)
    (remplacer &#9760 par ☠)
    EDIT: je suis sous Elementary (base ubuntu 16.04)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Python2:
    0.000643014907837
    0.000308990478516

    Python3:
    0.0007076263427734375
    0.0004730224609375

    C'est deux fois plus long de traduire \u2620 mais çà dure pas des plombes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat /proc/version
    Linux version 3.13.0-24-generic (buildd@roseapple) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:08:14 UTC 2014
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    en effet, mais comme mon programme le fait 3800 fois a chaque rafraîchissement de l'écran la différence devient conséquente. Merci pour tes réponses qui m'ont pas mal éclairé et m'ont permis de savoir que je n'étais pas seul a avoir ce problème.
    (Je ne ferme pas encore le topic car je pense le réutiliser)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par lisiof Voir le message
    en effet, mais comme mon programme le fait 3800 fois a chaque rafraîchissement de l'écran la différence devient conséquente.
    Certes mais vous comprendrez que convertir de l'Unicode en UTF-8 avant de l'écrire prendra plus de temps qu'écrire des bytes UTF-8 directement.

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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    Bonjour
    voici la version finale du projet si ça intéresse quelqu'un (je l'ai déjà rendue)
    tous les commentaires sont bienvenus.
    marioballeV3.zip

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