View difference between Paste ID: EzX1iNcT and ZXwaHDj9
SHOW: | | - or go back to the newest paste.
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 () {
103+
var CellulesDepart = 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
107+
	while(pourcentage >= 100 || pourcentage <= 0|| isNaN(pourcentage)) { //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
120+
    var cellulesVivantes = (CellulesDepart()/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();