Programmation du jeu de la vie
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Programmation du jeu de la vie



  1. #1
    Dralick

    Programmation du jeu de la vie


    ------

    Bonjour, bonjour à tous!

    Je suis nouveau sur le forum donc excuse moi d'avance si je me suis trompé de section...
    Voila mon problème, je suis en cours de création de l'algorithme du jeu de la vie (pour ceux qui veulent des info : https://fr.wikipedia.org/wiki/Jeu_de_la_vie),
    Je le fais en Javascript et sur un site de développement un peu chiant... mais en gros j'ai réussi à faire un tableau avec des cellule morte au départ (des 0) et remplacé par un nombre de cellule vivante initiale saisie par l'utilisateur et mis aléatoirement dans le tableau (des 1 qui remplace les 0).

    Premier problème: le programme met aléatoirement des 1, le problème c'est que parfois il remplace un 1 déjà présent par un autre 1 est compte l'étape (du moins je pense que c'est ça) ce qui fait que quand j'ai, par exemple, un tableau de 25 cases et que l'utilisateur demande 25 cellules vivantes au départ, je peux me retrouvé avec que 20 cellules vivantes au lieu de 25.

    De plus je n'arrive pas à programmer les boucles de génération donc je voulais savoir si vous pouviez m'aider à avancer!
    Voila voila je met en pièce jointe le début d'algorithme que j'ai fait.
    Nouveau document texte.txt

    Merci d'avance de lire mon post et de m'aider.
    (P.S.: je suis désolé si il y a des fautes, je fais de mon mieux, mais je suis fâché avec le français... il ne veut pas de moi...)

    -----

  2. #2
    Jack
    Modérateur

    Re : Programmation du jeu de la vie

    pourquoi mettre ton code en fichier joint? Je te recommande de lire les consignes de ce forum avant de poster: http://forums.futura-sciences.com/pr...ves-forum.html

    Code:
    // Version 2 : On crée un tableau de 5 cases dont chaque case contient un tableau de 8 cases//             La case (i,j) du tableau 2D est donc stockée dans la case [i][j] du tableau
    EffacerEcran();
    
    
    var x, y;
    L = Saisie("SVP, saisir une longeur (ex:35...)");
    l = Saisie("SVP,saisir une largeur (ex:10...)");
    var T2 = Tableau(L);
    for (x = 0; x < L; x = x + 1) {
      T2[x] = Tableau(l);
    }
    
    
    for (x = 0; x < L; x = x + 1) {
      for (y = 0; y < l; y = y + 1) {
        T2[x][y] = 0;
      }
    }
    
    
    
    
    
    
    var r, nb;
    r = 0;
    nb = Saisie("SVP,saisir le nombre de cellule initiale (ex:100...)");
    
    
    if (nb > l * L){
      
     Ecrire("le nombre de cellule initiale est plus grand que la taille du tableau, veuillez modifier");
    
    
    }else if (nb == l * L){
      
      Ecrire("le nombre de cellule initiale est égal à la taille du tableau, ce n'est pas le plus judicieux");
    
    
    while (r < nb) {
      T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] = 1;
      r = r + 1;
    }
    AfficherTableau(T2);
    
    
    }else{
      
     while (r < nb) {
      T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] = 1;
      r = r + 1;
    }
    AfficherTableau(T2);
    }

  3. #3
    Lyfa-sama

    Re : Programmation du jeu de la vie

    Bonjour Dralick,

    Donc concrètement ce que tu voudrais, c'est que lors de l'initialisation il ne remplace que des cellules 0 à 1 ?

    Sinon qu'entends-tu par
    boucles de génération
    Lyfa.

  4. #4
    Dralick

    Re : Programmation du jeu de la vie

    J'avais mis l'algorithme en fichier joint car je me suis dit que le mettre à directement de le post serait lourd et long.
    Mais au temps pour moi je retiens pour les prochaines fois.

    à l’initialisation oui je veux qu'il remplace que des cellule 0 par des 1 est que cela corresponde au nombre saisie par l'utilisateur et après faire des boucles de génération qui est la vraie utilité de l'algorithme

    Quand je parle de boucle de génération c'est faire des tours et à chaque tour faire en sorte que :
    • si il y a un 0 entouré d'au moins 4 cellule vivante le 0 devient 1
    • si il y a un 1 entouré d'au moins 4 cellule morte le 1 devient 0
    • si il y a un 1 entouré d'au moins 4 cellule vivante le 1 reste 1
    • si il y a un 0 entouré d'au moins 4 cellule morte le 0 reste 0
    et après affiché le tableau (ou un nouveau tableau

    je pense qu'il faut utilisé des if mais je n'y arrive pas j'ai fait plusieurs essais mais à chaque fois je n'ai aucun changement.

    Merci d'avoir répondu aussi vite!

    Dralick.
    Dernière modification par Dralick ; 17/04/2016 à 18h27.

  5. A voir en vidéo sur Futura
  6. #5
    Lyfa-sama

    Re : Programmation du jeu de la vie

    As-tu tenté quelque chose de similaire?

    Code:
    while (r < nb) {
      if(T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] == 1){
         T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] = 1;
         r = r + 1;
      }
    }
    Sinon, est-ce que c'est toi qui as codé ceci ou tu l'a extrait d'une source autre?

    EDIT: tu dois être sûr de ton coup: dans le doute de ne connaître pas complètement le système, il et préférable d'ajouter une condition de sortie, histoire d'éviter une boucle infinie!
    Dernière modification par Lyfa-sama ; 17/04/2016 à 18h52.

  7. #6
    Lyfa-sama

    Re : Programmation du jeu de la vie

    Ce message pour corriger la faute que j'ai faite ci-dessus:

    Code:
    for(; r < nb; r++) {
      if(T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] == 1){
         T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] = 1;
      }
    }
    En effet dans certains cas , ce précédent code aurait causé une boucle infinie...
    Dernière modification par Lyfa-sama ; 17/04/2016 à 18h59.

  8. #7
    Dralick

    Re : Programmation du jeu de la vie

    Alors pour le premier que vous avez proposé oui j'ai essayer et oui cela fait une boucle infinie (je suppose que c'est parce qu'il compare pas le résultat mais ce qu'on a écrit donc forcément que c'est identique).

    Oui oui "c'est moi qui l'ou fait", ça ma pris pas mal de temps ^^ et pour la fonction random j'ai chercher sur internet est je l'ai manipulé dans tout les sens jusqu’à ce que ça marche, donc il peut y avoir des erreurs.
    Pour les boucles infinies ne vous faites pas de soucis j'en ai fais plein et le site permet de sortir avec juste un retour.

    L'autre proposition que vous avez fait ne marche pas non plus, cela sort juste un tableau avec que des 0.
    D'ailleurs je ne sais pas à quoi sert le r++ pouvais vous me dire?
    De plus vous n'avez pas mis une étape ou r prend r+1 donc r est toujours inférieur à nb non?

    Si vous voulez je peux vous donner le site ou je lance l'algorithme?

  9. #8
    Lyfa-sama

    Re : Programmation du jeu de la vie

    Petit oubli de ma part, il faut affecter 0 et non 1 bien sûr!
    Le "++" est un opérateur d'incrémentation, plus précisément de post-incrémentation. C'est l'équivalent de
    Code PHP:
    $i $i 1

  10. #9
    Chanur

    Re : Programmation du jeu de la vie

    Citation Envoyé par Lyfa-sama Voir le message
    Ce message pour corriger la faute que j'ai faite ci-dessus:

    Code:
    for(; r < nb; r++) {
      if(T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] == 1){
         T2[(x - 1) - Math.floor(Math.random() * L)][(y - 1) - Math.floor(Math.random() * l)] = 1;
      }
    }
    En effet dans certains cas , ce précédent code aurait causé une boucle infinie...
    Je je comprends pas ce code.
    Si une cellule aléatoire est à 1, il met à 1 une autre cellule aléatoire, c'est ça ?
    Quel intérêt ?

    Et pourquoi x et y ? D'après le début du code il valent L et l (après la boucle qui remplit T2 de 0). Ce serait plus clair d'utiliser directement L et l, non?

    Moi j'aurais juste écrit :
    Code:
    r = 0
    while (r < nb)
      {
      x = Math.floor(Math.random() * L;
      y = Math.floor(Math.random() * l;
      if (T2[x][y] == 0)
         {
         T2[x][y] = 1;
         r++;
         }
      }
    }
    étant entendu que nb est suffisamment petit devant L*l pour que ça ne prenne pas trop de temps.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  11. #10
    Dralick

    Re : Programmation du jeu de la vie

    Bonjour!

    Lyma-Sama, excuse moi mais je n'ai pas compris ou il faut affecter 0 et pas 1 car si je modifie la fin de ce que tu as écrit des case aléatoire cela me donne toujours que 0 ou cela donne des 1 mais ne remplis pas le tableau.

    Chanur, j'ai remis x et y car pour moi c'était plus simple à comprendre mais c'est vrai que l'on peut changé par L et l, c'est juste moi qui comprend mieux avec x et y.
    alors ce que tu as écrit, je t'avoue que j'ai essayer et cela n'a pas marché, juste déjà je comprend pas pourquoi à la fin tu as trois } alors que tu as que deux {
    et j'avais déjà essayer ce que tu as écrit mais cela ne marche pas....

    Mais ce problème que le nombre de 1 n'est pas respecter n'est pas très important pour le bon fonctionnement, c'est un petit plus on va dire.

    En revanche j'ai vraiment besoin d'aide pour faire les cycles de générations que j'ai expliqué au dessus.
    L'un de vous à une idée pour les réalisé? Je vous avoue que j'ai beau tourner le problème dans tout les sens je ne trouve pas...
    Merci en tout cas de votre aide!

    P.S.: Voila le site ou je réalise le programme si vous voulez essayer vos idées avant de les proposer :
    https://dl.dropboxusercontent.com/u/...ml?dropbox=off
    Je vous conseil d'avance de modifier L et l pour qu'il prennent directement 5 et de modifier nb pour qu'il prenne directement 25
    Dernière modification par Dralick ; 19/04/2016 à 13h23.

  12. #11
    Lyfa-sama

    Re : Programmation du jeu de la vie

    Donc, pour la partie qui te pose problème, il s'agit bien de la construction de tes cases en fonction des conditions du jeu?
    Si c'est le cas, pour chaque itération de case il faut que tu vérifies si tes cases voisines remplissent toutes les conditions pour qu'elle soit à 1 sinon tu mets 0.

    Tu bloques à quel niveau?

  13. #12
    Dralick

    Re : Programmation du jeu de la vie

    Oui tout à fait, la partie qui me pose le plus de problème c'est la partie de génération avec les conditions écrit au dessus!

    Oui, c'est ce que j'ai pensé, il faut vérifier à la case [x,y] si c'est un 0 ou un 1.
    Puis vérifier dans les cases :
    • [x-1;y-1] --> (haut gauche) si c'est un 1 ou un 0
    • [x;y-1] --> (haut milieu) si c'est un 1 ou un 0
    • [x+1;y-1] --> (haut droite) si c'est un 1 ou un 0
    • [x-1;y] --> (coté gauche) si c'est un 1 ou un 0
    • [x+1;y] --> (coté droit) si c'est un 1 ou un 0
    • [x-1;y+1] --> (bas gauche) si c'est un 1 ou un 0
    • [x;y+1] --> (bas milieu) si c'est un 1 ou un 0
    • [x+1;y+1] --> (bat droite) si c'est un 1 ou un 0

    tous ça en considérant que toute ces cases sont les cases adjacente de la case [x,y] et que je ne me suis pas trompé sur les coordonnées...

    Je bloque au début...
    J'ai essayer sur un petit tableau avec les conditions écrit au dessus et même en regardant juste la case au dessus de la case observée mais cela m'a toujours donnais un tableau identique au tableau initial, donc sans aucune modification...
    Là encore je vois pas comment faire les conditions j'ai mis avec des si et des sinon si mais cela ne modifie par et je suis pas sur te savoir comment on dit que la machine doit regarder le contenue d'une case.

  14. #13
    Chanur

    Re : Programmation du jeu de la vie

    Citation Envoyé par Dralick Voir le message
    Chanur, j'ai remis x et y car pour moi c'était plus simple à comprendre mais c'est vrai que l'on peut changé par L et l, c'est juste moi qui comprend mieux avec x et y.
    En fait, je pense que tu devrais plutôt utiliser des noms de variable qui aient un sens, comme "largeur" et "hauteur". Ce serait plus lisible.

    Citation Envoyé par Dralick Voir le message
    alors ce que tu as écrit, je t'avoue que j'ai essayer et cela n'a pas marché,
    Ca donne quoi ?
    (Je dois préciser que je ne connais pas Javascript, mais que j'ai déjà écrit un jeu de la vie en C. Donc j'ai pu me tromper sur la syntaxe.)

    Citation Envoyé par Dralick Voir le message
    juste déjà je comprend pas pourquoi à la fin tu as trois } alors que tu as que deux {
    C'est parce que j'ai fait un copié-collé de ton code en prenant une ligne de trop.
    Désolé.

    Citation Envoyé par Dralick Voir le message
    Mais ce problème que le nombre de 1 n'est pas respecter n'est pas très important pour le bon fonctionnement, c'est un petit plus on va dire.
    Oui, c'est vrai.

    Citation Envoyé par Dralick Voir le message
    En revanche j'ai vraiment besoin d'aide pour faire les cycles de générations que j'ai expliqué au dessus.
    L'un de vous à une idée pour les réalisé? Je vous avoue que j'ai beau tourner le problème dans tout les sens je ne trouve pas...
    La liste des conditions que tu donnes est bonne, il suffit de balayer les cases de ton tableau et pour chaque case de tester une par une les cases voisines. Pour chaque voisine à 1, tu incrémente un compteur.
    Ensuite suivant que la case courante est à 0 ou à 1 et suivant la valeur du compteur, tu décides s'il faut mettre la case à 0 ou à 1

    mais attention, il faut mettre le résultat dans un autre tableau, sinon tu va modifier des cases avant de les avoir testées, et il faut faire attention à ne pas dépasser les bords en testant les voisines

    Citation Envoyé par Dralick Voir le message
    Merci en tout cas de votre aide!
    Dernière modification par Chanur ; 19/04/2016 à 22h25.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  15. #14
    Dralick

    Re : Programmation du jeu de la vie

    Bonjour Chamur,

    Oui c'est vrai, au départ j'ai écrit L & l pour longueur et largeur, mais si vous voulez le changer vous pouvez si vous cela vous arrange ^^

    Cela donne une boucle infinie, enfin d'abord cela me dit qu'il y a des erreurs de syntaxe et en corrigeant cela fait une boucle infinie.
    Tu as déjà fait un jeu de la vie?? trop fort!!

    Pour la ligne de code en trop il y a pas de problème!

    Justement premier problème je n'arrive pas (et je ne sais pas comment) balayer les cases de mon tableau, je n'arrive pas à l'écrire... mais sinon oui c'est ce que je voudrais faire.
    Pourquoi incrémenter un compteur?

    car moi j'avais pensé à du coup parcourir le tableau et pour chaque case voir si c'est un 1 ou un 0 puis après voir chaque case autour tout ça avec que des if et des else.

    ah oui je n'avais pas pensé à ça! mettre dans un autre tableau!!

    Cela ne vous dérange pas de me passer votre algorithme en C, je vous rassure c'est juste pour observer et voir le code, je ne veux pas le copier hein, cela ne m’intéresse pas!
    Mais pour avoir un modèle, une référence

Discussions similaires

  1. quelle est la difference entre programmation procedurale et la programmation orientee objet
    Par invite430abc62 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 27/01/2016, 12h34
  2. Programmation sur DSP
    Par hardflyer dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 20/10/2012, 10h13
  3. Programmation
    Par ScopeFater dans le forum Mathématiques du collège et du lycée
    Réponses: 3
    Dernier message: 23/01/2012, 12h26
  4. Programmation d'un LCD
    Par Jehudiel dans le forum Électronique
    Réponses: 7
    Dernier message: 05/05/2010, 10h32
  5. programmation
    Par invite1f9136b7 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 29/05/2009, 17h16