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 :

Programmation jeu de la vie Python


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut Programmation jeu de la vie Python
    Bonjour, actuellement en classe de terminale S nous nous sommes engagées dans la programmation d'un jeu de la vie. Nous avons réussi à générer un monde aléatoire, cependant, nous peinons à programmer la configuration des mondes suivants. Pour calculer le nombre de voisins, nous avons mis en place un programme qui marche dans une dimension 3x3, mais ce programme ne marche pas dans un monde plus important tel que 5x5. Voici notre programme, nous aimerions avoir de l'aide au plus vite car la date butoir de notre oral arrive à grand pas. Merci d'avance. Bénédicte et Cécile.

    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
    import PIL
    from PIL import Image
    imgal=Image.open('mondealeatoire.pgm') #image du monde aléatoire que nous avons programmé précédemment 
    imgun = Image.new("L" , (5,5))
    list=[]
    nbVoisinsNoirs=0
     
    for y in range(5):
        for x in range(5):
            imgun.putpixel((x,y),255)
    x=1
    y=1
     
    centre=imgal.getpixel((x,y))
    #Parcours tous les pixels et donne leurs couleurs
    for a in range(x-1,x+2) :
        for b in range(y-1,y+2) :
            print(a,b,imgal.getpixel((a,b)))
            if imgal.getpixel((a,b))==0:
                list.append(1)
            print(list)
     
            somme=sum(list)
            print(somme)
     
            if imgal.getpixel((x,y))==0:
                nbVoisinsNoirs=somme-1
            else:
                nbVoisinsNoirs=somme
            print(nbVoisinsNoirs)
     
            if nbVoisinsNoirs==3:
                imgun.putpixel((x,y),0)
            else:
                 imgun.putpixel((x,y),255)
     
            x=1+x
            y=1+y
            for c in range(x-1,x+2) :
                for d in range(y-1,y+2) :
                    print(c,d,imgal.getpixel((c,d)))
                    if imgal.getpixel((c,d))==0:
                        list.append(1)
                    print(list)
                    somme=sum(list)
                    print(somme)
                    if imgal.getpixel((x,y))==0:
                        nbVoisinsNoirs=somme-1
                    else:
                        nbVoisinsNoirs=somme
                    print(nbVoisinsNoirs)
                    if nbVoisinsNoirs==2 or nbVoisinsNoirs==3:
                        imgun.putpixel((x,y),0)
                    else:
                         imgun.putpixel((x,y),255)
     
    imgun.save('monde1.pgm')
    print('terminé')
    lorsque l'on met en route le programme python nous dit " image index out of range" ou "synthax error"

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Le message semble dire que l'image est plus petite que ce que le code traite comme valeurs. En d'autres mots, tu essayes d'accéder au pixel (10, 10) dans une image de 9 x 9 pixels par exemple.

    Pour savoir à quel endroit cela se passe, il est nécessaire de copier ici le traceback (message) d'erreur complet.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Le message semble dire que l'image est plus petite que ce que le code traite comme valeurs. En d'autres mots, tu essayes d'accéder au pixel (10, 10) dans une image de 9 x 9 pixels par exemple.

    Pour savoir à quel endroit cela se passe, il est nécessaire de copier ici le traceback (message) d'erreur complet.
    Merci beaucoup VinsS, j'ai réussi à régler le problème de dimension, mais aujourd'hui, je me retrouve dans une nouvelle impasse.

    Voici les règles du jeu de la vie :
    - si un pixel noir est entouré de 2 ou 3 pixels noirs, il reste reste noir, sinon il meurt et devient blanc.
    - si un pixel blanc est entouré de 3 pixels noirs, il devient noir, sinon il reste blanc.

    Prenons pour exemple le pixel de coordonnées (1,1) dans un monde 5x5. J'ai réussi à calculer son nombre de voisins et à générer un nouveau monde où ce pixel devient noir ou blanc en fonction des règles citées précédemment. Cependant, je n'arrive pas à faire de boucle pour que chaque pixel soit traité indépendamment. Je ne sais vraiment pas comment alors je vous remercie par avance de votre aide.

    Bénédicte

    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
    # Import de l'image qui va générer le moinde aléatoire
     
    from PIL import Image # Le programme se rend dans l'espace image de l'ordinateur
    imgdebut = Image.open('AlbertNB.pgm') # Nous ouvrons l'image Albert.pgm
     
    imgfin = Image.new("L" , (5,5)) # Nous donnons de nouvelles dimensions à l'image (ici 20*20)
    C=[0,255] # On confère à la variable C une liste possédant les chiffre 0 et 255.
     
    # Programmation du monde aléatoire
     
    import random
     
    for y in range(5): # y=ligne
        for x in range(5): # x=colonne
            imgfin.putpixel((x,y), random.choice(C)) # Nous assimilons à chaque pixel la valeur 0 ou 255 qui correspondant réciproquement au noir et au blanc
     
     
    imgfin.save('mondealeatoire.pgm') # Nous enregistrons le monde aléatoire dans un fichier que nous nommons mondealéatoire.pgm
    print('Terminé. Vous pouvez ouvrir le fichier "mondealeatoire.pgm" pour voir le résultat.') # Nous affichons ce monde
     
    # création des mondes n+1
    imgal=Image.open('mondealeatoire.pgm')
    imgun = Image.new("L" , (5,5))
    list=[]
    nbVoisinsNoirs=0
     
    for y in range(5):
        for x in range(5):
            imgun.putpixel((x,y),255)
    x=1
    y=1
     
    centre=imgal.getpixel((x,y))
     
    for a in range(x-1,x+2) :
        for b in range(y-1,y+2) :
            print(a,b,imgal.getpixel((a,b)))
     
            if imgal.getpixel((a,b))==0:
                list.append(1)
            print(list)
     
            somme=sum(list)
            print(somme)
     
            if centre==0 and nbVoisinsNoirs!=0 :
                nbVoisinsNoirs=somme-1
            else:
                nbVoisinsNoirs=somme
            print(nbVoisinsNoirs)
     
            if nbVoisinsNoirs==3:
                imgun.putpixel((x,y),0)
            else:
                imgun.putpixel((x,y),255)
     
    imgun.save('monde1.pgm')
    print('terminé')

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ton code vérifie toujours le même pixel il me semble.

    Remplace ta boucle par 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
     
    offset = ((-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1))
     
    for y in range(5):
        for x in range(5):
            centre = imgal.getpixel((x, y))
            nbVoisinsNoirs = 0
            for off in offset:
                try:
                    if not imgal.getpixel((x+off[0], y+off[1])):
                        nbVoisinsNoirs += 1
                except IndexError:
                    pass
     
            if nbVoisinsNoirs == 3 and centre == 255:
                imgun.putpixel((x, y), 0)
     
            elif not nbVoisinsNoirs in [2, 3] and not centre:
                imgun.putpixel((x, y), 255)

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ton code vérifie toujours le même pixel il me semble.

    Remplace ta boucle par 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
     
    offset = ((-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1))
     
    for y in range(5):
        for x in range(5):
            centre = imgal.getpixel((x, y))
            nbVoisinsNoirs = 0
            for off in offset:
                try:
                    if not imgal.getpixel((x+off[0], y+off[1])):
                        nbVoisinsNoirs += 1
                except IndexError:
                    pass
     
            if nbVoisinsNoirs == 3 and centre == 255:
                imgun.putpixel((x, y), 0)
     
            elif not nbVoisinsNoirs in [2, 3] and not centre:
                imgun.putpixel((x, y), 255)
    VinsS, je vous remercie énormément pour votre réponse car nous avons testé le programme que vous nous aviez envoyé et il marche bel et bien. Nous voudrions simplement plus d'informations à propos des fonctions utilisées. Nous voudrions par exemple en savoir plus sur la fonction 'try' et sur le 'except Index Error'. Nous vous remercions encore une fois de plus. Bénédicte et Cécile.

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par Benecile Voir le message
    VinsS, je vous remercie énormément pour votre réponse car nous avons testé le programme que vous nous aviez envoyé et il marche bel et bien. Nous voudrions simplement plus d'informations à propos des fonctions utilisées. Nous voudrions par exemple en savoir plus sur la fonction 'try' et sur le 'except Index Error'. Nous vous remercions encore une fois de plus. Bénédicte et Cécile.
    De quoi vous aiguiller :
    http://wcours.gel.ulaval.ca/2011/a/G...entErreurs.pdf

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Un bloc try except finally sert à exécuter du code que l'on sait susceptible de provoquer une erreur. L'erreur est attrapée au vol, en quelque sorte, par le except ce qui permet d'exécuter alors un plan B.

    Dans ton cas, on risque d'avoir des coordonnées de pixel soit négatives (-1) soit supérieures à la taille de l'image, dans ces cas l'erreur serait IndexError

    Démo:
    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
     
    >>> def try_(word, pos):
    ...     try:
    ...             return word[pos]
    ...     except IndexError:
    ...             return "L'index est trop grand !"
    ... 
    >>> s = "Python"
    >>> s[2]
    't'
    >>> s[6]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: string index out of range
    >>> try_(s, 2)
    't'
    >>> try_(s, 6)
    "L'index est trop grand !"
    >>>
    Plus de détails ici:

    http://python.developpez.com/cours/a...=page_11#L11-J

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Merci pour ces précisions. D'après les informations que vous avez donné, je comprend que cette fonction try est indispensable pour les pixels qui longent le damier. Rectifiez moi si je me trompe, mais lorsque que vous utiliser la fonction offset=((-1,0)) par exemple, off[0]=-1 et off[1]=0. Cette fonction permet de déterminer les coordonnées des voisins en fonction du pixel central de coordonnées (0,0). Ai-je bien compris ? Bénédicte.

  9. #9
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben ouais, offset c'est le décalage par rapport au pixel concerné.

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ben ouais, offset c'est le décalage par rapport au pixel concerné.
    D'accord, merci beaucoup pour votre aide. Nous allons passer notre soutenance orale jeudi et vendredi de la semaine prochaine et nous essayerons de vous tenir au courant des notes que l'on aura au bac. Nous sommes très reconnaissantes.
    Bénédicte et Cécile

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Merci beaucoup pour ce lien

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 7
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ton code vérifie toujours le même pixel il me semble.

    Remplace ta boucle par 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
    offset = ((-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1))
     
    for y in range(5):
        for x in range(5):
            centre = imgal.getpixel((x, y))
            nbVoisinsNoirs = 0
            for off in offset:
                try:
                    if not imgal.getpixel((x+off[0], y+off[1])):
                        nbVoisinsNoirs += 1
                except IndexError:
                    pass
    
            if nbVoisinsNoirs == 3 and centre == 255:
                imgun.putpixel((x, y), 0)
    
            elif not nbVoisinsNoirs in [2, 3] and not centre:
                imgun.putpixel((x, y), 255)
    Excusez moi de vous déranger une nouvelle fois, mais j'aimerais savoir pourquoi avez-vous mis le not après le if. Je sais que si on l'enlève le programme ne marche plus mais je n'arrive pas à expliquer sa présence.
    Bénédicte.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Benecile Voir le message
    Excusez moi de vous déranger une nouvelle fois, mais j'aimerais savoir pourquoi avez-vous mis le not après le if. Je sais que si on l'enlève le programme ne marche plus mais je n'arrive pas à expliquer sa présence.
    Bonjour

    Ca me semble évident: au lieu de tester si imgal.getpixel() renvoie vrai, il teste si ça renvoie faux (je présume qu'une absence de pixel est considérée comme pixel noir)...
    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]

Discussions similaires

  1. Programmation du jeu de la vie
    Par TiteFleur014 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/11/2014, 21h49
  2. programmation jeu de la vie
    Par darkontes dans le forum Caml
    Réponses: 6
    Dernier message: 13/03/2010, 18h20
  3. programmation d'un jeu de poker en python
    Par mnspc dans le forum Général Python
    Réponses: 4
    Dernier message: 10/04/2008, 21h33
  4. Programme c jeu de la vie
    Par gaet67 dans le forum C#
    Réponses: 1
    Dernier message: 14/05/2007, 07h39
  5. probleme pour un jeu de dames en python
    Par doudou152 dans le forum Général Python
    Réponses: 7
    Dernier message: 22/04/2005, 14h53

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