Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //18 décembre 2019
  2. //Julie Guertin (20120742) et Valérie Panaite(20161679)
  3. //Devoir 2 : Le jeu de la vie
  4.  
  5.  
  6. //Ce programme est une implantation du Jeu de la vie
  7. //de John Horton Conway.
  8.  
  9.  
  10. //La fonction carré dessine une cellule de la grille
  11.  
  12. var carre = function (largeur) {
  13.  
  14.     for (var i = 1; i <= 4; i++) {
  15.  
  16.         fd(largeur);
  17.         rt(90);
  18.     }
  19. };
  20.  
  21. //La fonction positionner permet de placer la tortue
  22.  
  23. var positionner = function (x, y) {
  24.  
  25.     pu(); rt(90); fd(x); lt(90); fd(y); pd();
  26. };
  27.  
  28. //La fonction grille dessine une grille dont la distance entre le début d'un carré
  29. //et d'un autre = pas, la largeur de chaque carré = largeur. nx représente le nombre
  30. //de carrés sur x et ny, le nombre de carrés sur y.
  31.  
  32.  
  33. var grille = function (nx, ny, pas, largeur) {
  34.  
  35.     for (var x = 0; x < nx; x++) {
  36.  
  37.         for (var y = 0; y < ny; y++) {
  38.  
  39.             positionner(x*pas, y*pas);
  40.             carre(largeur);
  41.             positionner(-x*pas, -y*pas);
  42.         }
  43.     }
  44. };
  45.  
  46. //La fonction afficherTableau dessine la grille et colorie
  47. //les cellules vivantes selon les données du tableau
  48.  
  49. var afficherTableau = function(){
  50.     cs();
  51.     positionner(-90, -100); //permet de placer la tortue
  52.     grille(dimensionTableau, dimensionTableau, 10, 10); //permet de dessiner la grille
  53.    
  54.     for(var i = 0; i < dimensionTableau; i++) // Pour chacune des cellules de la grille
  55.     {
  56.         for(var j = 0; j < dimensionTableau; j++)
  57.         {
  58.             if (tableau[i][j] == 1) //si la cellule est vivante dans le tableau
  59.             {
  60.                 colorierCase(i, j); //on colorie la cellule
  61.             }
  62.         }
  63.     }
  64.      
  65. };
  66.  
  67. //La fonction colorierCase permet de colorier les cases correspondant
  68. //aux cellules vivantes dans la grille affichée
  69.  
  70. var colorierCase = function(x, y){
  71.      
  72.     setpw(10); //largeur du trait
  73.     setpc(1,0,1); //couleur du trait
  74.  
  75.     pu(); rt(90);  fd(5 + x*10);    //colorie une case
  76.     lt(90); fd(y*10); pd(); fd(10);
  77.  
  78.     positionner(-(5 + x*10),-(y*10 + 10)); //repositionne la tortue
  79. };
  80.  
  81. // La fonction creerMatice permet de créer un tableau
  82. //dans lequel on stocke l'état des cellules.
  83. //Au départ, les cellules sont toutes à 0.
  84.  
  85. var creerMatrice = function (nbRangees, nbColonnes) {
  86.     var resultat = Array(nbRangees);
  87.  
  88.     for (var i = 0; i < nbRangees; i++) {
  89.  
  90.         resultat[i] = Array(nbColonnes);
  91.  
  92.         for (var j = 0; j < nbColonnes; j++){
  93.  
  94.             resultat[i][j]=0;
  95.         }
  96.     }
  97.     return resultat;
  98. };
  99.  
  100. //La fonction CellulesDépart demande à l'utilisateur de rentrer le % de cellules
  101. //vivantes initiales voulu.
  102.  
  103. var CellulesDépart = function () {
  104.  
  105.     var pourcentage = + prompt("Quel est le pourcentage de cellules vivantes au départ?");
  106.  
  107.     while(pourcentage >= 100 || pourcentage <= 0) { //si ce n'est pas un chiffre de 1 à 99 inclus
  108.  
  109.         pourcentage = +prompt ("Veuillez entrer un pourcentage valide."); //demande un nouveau chiffre
  110.  
  111.     }
  112.     return pourcentage; //retourne un pourcentage valide
  113. };
  114.  
  115. //La fonction etatInitial assigne aléatoirement l'état vivant à certaines cellules
  116. //du tableau dépendant du pourcentage entré.
  117.  
  118. var etatInitial = function () {
  119.  
  120.     var cellulesVivantes = (CellulesDépart()/100) * Math.pow(dimensionTableau,2); //donne le nombre de cellules vivantes
  121.  
  122.     for (var i = 1; i <= cellulesVivantes; i++) {
  123.  
  124.         var x = (Math.floor(dimensionTableau * Math.random())); //donne un chiffre de 0 à 20
  125.         var y = (Math.floor(dimensionTableau * Math.random())); //donne un chiffre de 0 à 20
  126.    
  127.         if(tableau[x][y] == 0) //si cellule est à 0 (morte)
  128.         {
  129.             tableau[x][y] = 1; //elle prend la valeur 1(vivante)
  130.         }
  131.         else{       //si la cellule est déjà à 1 (vivante)
  132.             i--;    //décrémenter la variable i et obtenir les coordonnées
  133.         }           //d'une nouvelle cellule aléatoirement
  134.     }
  135. };
  136.  
  137.  
  138. //La fonction compterVoisinsVivants permet de compter le nombre
  139. //de voisins vivants pour chacune des cellules du tableau
  140.  
  141. var compterVoisinsVivants = function(x, y){
  142.  
  143.     var x_min = x-1;
  144.     if(x == 0) x_min = x;   //détecter si à la limite du tableau
  145.     var x_max = x+1;
  146.     if(x == (dimensionTableau -1)) x_max = x;  //détecter si à la limite du tableau
  147.      
  148.     var y_min = y-1;
  149.     if(y == 0) y_min = y; //détecter si à la limite du tableau
  150.     var y_max = y+1;
  151.     if(y == (dimensionTableau -1)) y_max = y; //détecter si à la limite du tableau
  152.      
  153.     var resultat = 0;
  154.      
  155.     for(var i = x_min; i <= x_max; i++){
  156.  
  157.         for(var j = y_min; j <= y_max; j++){
  158.  
  159.             if (i == x && j == y){ // exclure la cellule pour laquelle on compte les voisins
  160.                 resultat += 0;
  161.             }
  162.             else{
  163.                 resultat += tableau[i][j]; //faire la somme des voisins viants
  164.             }
  165.         }
  166.     }
  167.      
  168.     return resultat;
  169.      
  170. };
  171.  
  172. //La fonction tourTableau permet de créer un nouveau tableau
  173. //dans lequel l'état des cellules peut avoir changé
  174. //selon ses voisins.
  175.  
  176. var tourTableau = function(){
  177.  
  178.     var nouvTableau = creerMatrice(dimensionTableau, dimensionTableau); //créer un tableau
  179.      
  180.     for(var i=0; i < dimensionTableau; i++){
  181.  
  182.         for(var j=0; j < dimensionTableau; j++){
  183.  
  184.             var nb = compterVoisinsVivants(i,j);
  185.              
  186.             if (nb < 2){      // si nombre de voisins est plus petit que 2
  187.                 nouvTableau[i][j] = 0; // la cellule meurt
  188.             }
  189.             else if(nb <= 3){  //cellule reste dans le même état si nombre de voisins vivants
  190.                 nouvTableau[i][j] = tableau[i][j]; // est plus petit ou égal à 3
  191.                  
  192.                 if(nb == 3) //Si une cellule a exactement 3 voisins
  193.                 {
  194.                     if(tableau[i][j] == 0) //et que cette cellule est morte
  195.                     {
  196.                         nouvTableau[i][j] = 1; // elle devient vivante
  197.                     }
  198.                 }
  199.             }
  200.             else if(nb > 3){ // si nombre de voisins est plus grand que 3
  201.                 nouvTableau[i][j] = 0; //la cellule meure
  202.             }
  203.         }
  204.     }
  205.      
  206.     return nouvTableau;
  207. };
  208.  
  209. //La fonction boucle infinie permet de lancer le jeu à l'infini
  210. var boucleInfinie = function(){
  211.  
  212.     while(true){
  213.          
  214.         afficherTableau();
  215.         tableau = tourTableau();
  216.         pause(0.01); //fait une pause entre chaque apparition de tableau
  217.        
  218.     }
  219. };
  220.  
  221. //Lancer le jeu
  222.  
  223. var dimensionTableau = 20;
  224. var tableau = creerMatrice(dimensionTableau, dimensionTableau);
  225. etatInitial();
  226. boucleInfinie();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement