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 :

Jeu de la vie, probleme de lenteur


Sujet :

Programmation multimédia/Jeux Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut Jeu de la vie, probleme de lenteur
    Bonjour, je suis débutante en python et plus spécialement avec le module Tkinter et j'ai entreprit le projet de réaliser un jeu de la vie, si vous ne connaissez pas c'est un automate cellulaire très simple. J'ai réussi et mon programme marche mais je le trouve très lent, de plus il est de plus en plus lent au fur et à mesure de la simulation, en fin de simulation quand je clic pour commencer une nouvelle étape cela prend presque 5s. Je me demandais si vous aviez des solutions ou au moins une piste pour améliorer la rapidite, merci. Voici mon programme:
    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
    67
    68
    69
    70
    71
    from tkinter import *
    grille = [[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36]
    grille2 = [[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36,[0]*36]
    fenetre = Tk()
    toile = Canvas(fenetre, width=560, height=560, bg = "white")
     
     
    for i in range(10,551,15):
        toile.create_line(i,10,i,550)
        toile.create_line(10, i, 550, i)
     
     
    def dessiner(grille):
        for i in range(36):
            for j in range(36):
                if grille[j][i] == 1:
                    toile.create_rectangle(10+15*i, 10+15*j,10+15*i+15, 10+15*j+15, fill = "black")
                if grille[j][i] == 0:
                    toile.create_rectangle(10 + 15 * i, 10 + 15 * j, 10 + 15 * i + 15, 10 + 15 * j + 15, fill="white")
     
     
    def init(evt):
        a , b = -1,-1
        for i in range(10, 551, 15):
            a +=1
            if i <= evt.x <= i +14.5:
                for d in range(10, 551, 15):
                    b += 1
                    if d<=evt.y<= d + 14.5:
                        toile.create_rectangle(10 + 15 * a, 10 + 15 * b, 10 + 15 * a + 15, 10 + 15 * b + 15, fill="black")
                        grille[b][a]=1
     
     
    def count():
        for i in range(1,35):
            for j in range(1,35):
                c = 0
                for k in range(-1, 2, 1):
                    if grille[j+k][i-1] == 1:
                        c += 1
                    if grille[j + k][i] == 1:
                        c += 1
                    if grille[j+k][i+1] == 1:
                        c += 1
                if grille[j][i] == 1:
                    c = c-1
                grille2[j][i] = c
     
     
    def etape(evt):
        count()
        for i in range(1,35):
            for j in range(1,35):
                if grille2[j][i] < 2:
                    grille[j][i] = 0
                elif grille2[j][i] > 3:
                    grille[j][i] = 0
                elif grille2[j][i] == 3:
                    grille[j][i] = 1
        dessiner(grille)
     
     
    def lie():
        toile.bind("<Button-1>", etape)
     
     
    toile.bind("<Button-1>", init)
    button = Button(fenetre ,text='OK', command = lie, bg = "white")
    button.pack()
    toile.pack()
    fenetre.mainloop()
    Ps : désole j'ai donné le nom des variables un peu au hasrd c'est peut etre complique a comprendre.

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

    Citation Envoyé par Aciee Voir le message
    J'ai réussi et mon programme marche mais je le trouve très lent, de plus il est de plus en plus lent au fur et à mesure de la simulation, en fin de simulation quand je clic pour commencer une nouvelle étape cela prend presque 5s.

    Pour améliorer la rapidité, il faut réduire le nombre d'instructions exécutées (ce qu'on appelle optimiser) ou la taille du problème.

    Réduire la taille du problème est facile: il suffit de réduire le nombre de cases i.e. plutôt qu'avoir un tableau de 36 x 36, un tableau 18 x 18, c'est 4 fois moins d'instructions et çà devrait être 4 fois plus rapide.
    Dommage que vous ayez codé cette taille du problème en dur, il aurait été facile d'en changer juste pour voir.

    Sinon, réduire le nombre d'instructions, c'est éviter de refaire ce qu'il n'est pas utile.

    Par exemple entre l'étape N et l'étape N+1, inutile de recréer toutes les cases, mettre à jour la couleur de celles qui changent suffit.
    Encore faut-il construire cette liste. De même, faire 35x35x3 = 3672 itérations dans count (alors que seules les cases qui sont à 1 vous intéressent) et recommencer avec 35x35=1225 itérations dans etape..

    Pour les ralentissements, c'est plus facile: à chaque itération, vous ajoutez 35x35 carrés au Canvas. A la fin, çà fait beaucoup d'objets qui ne servent à rien mais çà fait ramer de plus en plus.

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

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Par défaut
    merci beaucoup pour votre aide, j'ai changé mon programme pour qu'il ne fasse la mise a jour que des cases différentes de celles de l'étape précédente et il n'y a plus aucun problème.

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

Discussions similaires

  1. [Conception] Jeu de la vie
    Par deuscapser dans le forum Général Java
    Réponses: 16
    Dernier message: 09/03/2006, 12h47
  2. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 20h06
  3. [Perf]Probleme de lenteur connexion
    Par mermoz dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/11/2005, 17h53
  4. [interbase 6]probleme de lenteur
    Par macadam314 dans le forum InterBase
    Réponses: 2
    Dernier message: 27/06/2005, 09h48
  5. [Sybase]probleme de lenteur
    Par MASSAKA dans le forum Sybase
    Réponses: 3
    Dernier message: 19/03/2003, 22h58

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