Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //18 décembre 2019
- //Julie Guertin (20120742) et Valérie Panaite(20161679)
- //Devoir 2 : Le jeu de la vie
- //Ce programme est une implantation du Jeu de la vie
- //de John Horton Conway.
- //La fonction carré dessine une cellule de la grille
- var carre = function (largeur) {
- for (var i = 1; i <= 4; i++) {
- fd(largeur);
- rt(90);
- }
- };
- //La fonction positionner permet de placer la tortue
- var positionner = function (x, y) {
- pu(); rt(90); fd(x); lt(90); fd(y); pd();
- };
- //La fonction grille dessine une grille dont la distance entre le début d'un carré
- //et d'un autre = pas, la largeur de chaque carré = largeur. nx représente le nombre
- //de carrés sur x et ny, le nombre de carrés sur y.
- var grille = function (nx, ny, pas, largeur) {
- for (var x = 0; x < nx; x++) {
- for (var y = 0; y < ny; y++) {
- positionner(x*pas, y*pas);
- carre(largeur);
- positionner(-x*pas, -y*pas);
- }
- }
- };
- //La fonction afficherTableau dessine la grille et colorie
- //les cellules vivantes selon les données du tableau
- var afficherTableau = function(){
- cs();
- positionner(-90, -100); //permet de placer la tortue
- grille(dimensionTableau, dimensionTableau, 10, 10); //permet de dessiner la grille
- for(var i = 0; i < dimensionTableau; i++) // Pour chacune des cellules de la grille
- {
- for(var j = 0; j < dimensionTableau; j++)
- {
- if (tableau[i][j] == 1) //si la cellule est vivante dans le tableau
- {
- colorierCase(i, j); //on colorie la cellule
- }
- }
- }
- };
- //La fonction colorierCase permet de colorier les cases correspondant
- //aux cellules vivantes dans la grille affichée
- var colorierCase = function(x, y){
- setpw(10); //largeur du trait
- setpc(1,0,1); //couleur du trait
- pu(); rt(90); fd(5 + x*10); //colorie une case
- lt(90); fd(y*10); pd(); fd(10);
- positionner(-(5 + x*10),-(y*10 + 10)); //repositionne la tortue
- };
- // La fonction creerMatice permet de créer un tableau
- //dans lequel on stocke l'état des cellules.
- //Au départ, les cellules sont toutes à 0.
- var creerMatrice = function (nbRangees, nbColonnes) {
- var resultat = Array(nbRangees);
- for (var i = 0; i < nbRangees; i++) {
- resultat[i] = Array(nbColonnes);
- for (var j = 0; j < nbColonnes; j++){
- resultat[i][j]=0;
- }
- }
- return resultat;
- };
- //La fonction CellulesDépart demande à l'utilisateur de rentrer le % de cellules
- //vivantes initiales voulu.
- var CellulesDepart = function () {
- var pourcentage = + prompt("Quel est le pourcentage de cellules vivantes au départ?");
- while(pourcentage >= 100 || pourcentage <= 0|| isNaN(pourcentage)) { //si ce n'est pas un chiffre de 1 à 99 inclus
- pourcentage = +prompt ("Veuillez entrer un pourcentage valide."); //demande un nouveau chiffre
- }
- return pourcentage; //retourne un pourcentage valide
- };
- //La fonction etatInitial assigne aléatoirement l'état vivant à certaines cellules
- //du tableau dépendant du pourcentage entré.
- var etatInitial = function () {
- var cellulesVivantes = (CellulesDepart()/100) * Math.pow(dimensionTableau,2); //donne le nombre de cellules vivantes
- for (var i = 1; i <= cellulesVivantes; i++) {
- var x = (Math.floor(dimensionTableau * Math.random())); //donne un chiffre de 0 à 20
- var y = (Math.floor(dimensionTableau * Math.random())); //donne un chiffre de 0 à 20
- if(tableau[x][y] == 0) //si cellule est à 0 (morte)
- {
- tableau[x][y] = 1; //elle prend la valeur 1(vivante)
- }
- else{ //si la cellule est déjà à 1 (vivante)
- i--; //décrémenter la variable i et obtenir les coordonnées
- } //d'une nouvelle cellule aléatoirement
- }
- };
- //La fonction compterVoisinsVivants permet de compter le nombre
- //de voisins vivants pour chacune des cellules du tableau
- var compterVoisinsVivants = function(x, y){
- var x_min = x-1;
- if(x == 0) x_min = x; //détecter si à la limite du tableau
- var x_max = x+1;
- if(x == (dimensionTableau -1)) x_max = x; //détecter si à la limite du tableau
- var y_min = y-1;
- if(y == 0) y_min = y; //détecter si à la limite du tableau
- var y_max = y+1;
- if(y == (dimensionTableau -1)) y_max = y; //détecter si à la limite du tableau
- var resultat = 0;
- for(var i = x_min; i <= x_max; i++){
- for(var j = y_min; j <= y_max; j++){
- if (i == x && j == y){ // exclure la cellule pour laquelle on compte les voisins
- resultat += 0;
- }
- else{
- resultat += tableau[i][j]; //faire la somme des voisins viants
- }
- }
- }
- return resultat;
- };
- //La fonction tourTableau permet de créer un nouveau tableau
- //dans lequel l'état des cellules peut avoir changé
- //selon ses voisins.
- var tourTableau = function(){
- var nouvTableau = creerMatrice(dimensionTableau, dimensionTableau); //créer un tableau
- for(var i=0; i < dimensionTableau; i++){
- for(var j=0; j < dimensionTableau; j++){
- var nb = compterVoisinsVivants(i,j);
- if (nb < 2){ // si nombre de voisins est plus petit que 2
- nouvTableau[i][j] = 0; // la cellule meurt
- }
- else if(nb <= 3){ //cellule reste dans le même état si nombre de voisins vivants
- nouvTableau[i][j] = tableau[i][j]; // est plus petit ou égal à 3
- if(nb == 3) //Si une cellule a exactement 3 voisins
- {
- if(tableau[i][j] == 0) //et que cette cellule est morte
- {
- nouvTableau[i][j] = 1; // elle devient vivante
- }
- }
- }
- else if(nb > 3){ // si nombre de voisins est plus grand que 3
- nouvTableau[i][j] = 0; //la cellule meure
- }
- }
- }
- return nouvTableau;
- };
- //La fonction boucle infinie permet de lancer le jeu à l'infini
- var boucleInfinie = function(){
- while(true){
- afficherTableau();
- tableau = tourTableau();
- pause(0.01); //fait une pause entre chaque apparition de tableau
- }
- };
- //Lancer le jeu
- var dimensionTableau = 20;
- var tableau = creerMatrice(dimensionTableau, dimensionTableau);
- etatInitial();
- boucleInfinie();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement