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(); |