Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 KB | None | 0 0
  1. /**
  2. * cree par : Marc-Andre Piche
  3. * 783722
  4. *
  5. * Game of Life type Griffeath --
  6. * automate cellulaire qui passe au prochain etat
  7. * quand au moins une (ou min) cellule(s) voisine(s) a cet etat.
  8. *
  9. * exemple pour 3 etats, la cellule (3) du centre passe a (1)
  10. * puisqu elle a une cellule (1) dans son voisinage:
  11. *
  12. * 2 1 1 (moore) 3 2 1
  13. * 1 3 1 --> 2 1 1
  14. * 1 1 1 (batch) 1 1 1
  15. */
  16.  
  17.  
  18. // deux jeux de couleurs: 4 et 10
  19.  
  20. var colors_4 = [{r:255, g:51, b:51}, // rouge
  21. {r:255, g:153, b:51}, // orange
  22. {r:255, g:255, b:51}, // jaune
  23. {r:255, g:229, b:204}]; // rose
  24.  
  25. var colors_10 = [{r:241, g:148, b:138},
  26. {r:195, g:135, b:211},
  27. {r:127, g:179, b:213},
  28. {r:118, g:215, b:196},
  29. {r:247, g:220, b:111},
  30. {r:229, g:152, b:102},
  31. {r:191, g:201, b:202},
  32. {r:133, g:146, b:158},
  33. {r:28, g:40, b:51},
  34. {r:33, g:97, b:140}];
  35.  
  36. // variables du cahier des charges:
  37. var colors = 4; // nombre d etats
  38. var init ="random"; // distribution des etats
  39. var voisinage = "moore"; // evaluation selon Moore ou VonNeumann
  40. var evolution= "online"; // methode de mise a jour des etats
  41. var n = 20; // nombre de lignes
  42. var m = 50; // nombre de colonnes
  43. var min =1; // valeur entre 0 et 8
  44.  
  45.  
  46. function createTableau(nbLines, nbColumns) { //code fourni en classe: creer un tableau
  47. var g = new Array(nbLines);
  48. for ( var i=0; i g[i] = new Array(nbColumns);
  49. return g;
  50. }
  51.  
  52. function fillMatrice(tableau) { //rempli le tableau d etats: au hasard ou uniforme(1)
  53. switch (init) {
  54. case "uniform":
  55. for (var k = 0; k < tableau.length; ++k)
  56. tableau[k].fill(1); //rempli chaque cellule de la valeur (1)
  57. break;
  58. default : //case "random" par default
  59. for (var i = 0; i < tableau.length; ++i)
  60. for (var j = 0; j < tableau[i].length; j++)
  61. tableau[i][j] = (Math.floor(Math.random() * colors)) + 1; // rempli chaque cellule d une valeur au hasard
  62. break;
  63. }
  64. }
  65.  
  66. // variables globales additionelles:
  67. var palette= colors_4; //pointeur des tableau de couleurs selon nb colors
  68. var direction = [[-1,0],[0,-1],[0,1],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]; //tableau des 8 directions ordonnees pour verifier VonNeumann en premier
  69. var marqueur = false; // indice de changement d une cellule /indice de continuite
  70. var matrice= createTableau(n,m); //tableau des valeurs d etats par default
  71. fillMatrice(matrice); //initialise les valeurs du tableau
  72.  
  73.  
  74.  
  75. function cellCheck(i,j,tableau,state) {
  76. return i>= 0 && i= 0 && j }
  77.  
  78.  
  79.  
  80. function nextState(s) {
  81. return ((s >= colors) ? 1 : s + 1); //retourne le prochaine etat du cycle
  82. }
  83.  
  84.  
  85. function evalCell(i,j,matrice) { // evalue une cellule et retourne sa nouvelle valeur
  86. var count = 0;
  87. var checkState= nextState(matrice[i][j]);//valeur de recherche : une cellule qui a l etat suivant
  88. for (var a = 0; count !==min && (a < 4 || ((voisinage == "moore") && a < 8)); a++) { //parcours les 4 ou 8 directions (selon moore) jusqua ce qu il trouve min etat(s) recherches
  89. count += +(cellCheck(i + direction[a][0], j + direction[a][1], matrice, checkState)); //evalue une direction et ajoute 1 si cellCheck est true
  90. } if (count==min) {
  91. marqueur = true; //indique qu une cellule a ete modifiee
  92. return checkState;
  93. }else return matrice[i][j]; //la cellule n est pas modifiee
  94. }
  95.  
  96. function updateOnline(matrice){
  97. for (var i=0; i for (var j=matrice[i].length-1; j>=0; j--) {
  98. matrice[i][j] = evalCell(i, j,matrice);
  99. setPixel(j,i,palette[matrice[i][j]-1]); //fonction codeboot d interface image: pixel selon l etat ij
  100. }
  101. }
  102.  
  103. function updateBatch(x,permuteTableau){
  104. for (var i=0; i for (var j = permuteTableau[x][i].length - 1; j >= 0; j--){
  105. permuteTableau[x^1][i][j] = evalCell(i,j,permuteTableau[x]); //place resultat evalue dans la 'matrice' alternative
  106. }
  107. }
  108. }
  109.  
  110. function updateImage(matrice){ //mise a jour de tous les pixels
  111. for (var i=0; i for (var j=0; j setPixel(j,i,palette[matrice[i][j]-1]); //fonction codeboot d interface image
  112. }
  113.  
  114. //core function
  115.  
  116.  
  117. function getCommandes(commandLine){ //separe la ligne de commande en tableau n x 2 [ind,val]
  118. var tableauCommandes = commandLine.split(";");
  119. for (var i=0; i tableauCommandes[i] = tableauCommandes[i].split("=");
  120. }
  121. return tableauCommandes;
  122. }
  123.  
  124.  
  125. function findCommandValue(str,tableau){ //cherche et retourne la valeur associee a une string**fonction accepte seulement les tableau n x 2
  126. for (var i=0; i if (tableau[i].indexOf(str)!== -1) return tableau[i][(tableau[i].indexOf(str))^1]; // -- methode seulement pour les tableaux n x 2
  127. return undefined;
  128. }
  129.  
  130.  
  131. function initCommands(tableau) { //**fonction accepte seulement les tableau n x 2
  132. //extrait les valeurs associees au variables principales
  133. var findcolors = findCommandValue("colors",tableau);
  134. var findinit =findCommandValue("init",tableau);
  135. var findvoisinage = findCommandValue("voisinage",tableau);
  136. var findevolution= findCommandValue("evolution",tableau);
  137. var findn = findCommandValue("n",tableau);
  138. var findm = findCommandValue("m",tableau);
  139. var findmin =findCommandValue("min",tableau);
  140.  
  141. //applique les valeurs trouves ou celles par default
  142. (findcolors===undefined)? colors = 4tristefindcolors==="10")? colors = 10:colors = 4;
  143. (findinit===undefined)? init ="random"tristefindinit === "uniform")? init ="uniform":init ="random";
  144. (findvoisinage===undefined)? voisinage ="moore"tristefindvoisinage.toLowerCase() === "vonneumann")? voisinage ="vonneumann":voisinage ="moore";
  145. (findevolution===undefined)? evolution ="online"tristefindevolution.toLowerCase() === "batch")? evolution ="batch":evolution ="online";
  146. (findn===undefined)? n =20 tristeisNaN(+findn))? n =20:n =+findn;
  147. (findm===undefined)? m =50 tristeisNaN(+findm))? m =50:m =+findm;
  148.  
  149. (findmin===undefined)? min =1 tristeisNaN(+findmin))? min =1:min =+findmin;
  150. if (min < 0 ) min = -min; //converti une valeur negative
  151. if (min > 8) min = 8 ; //max min = 8
  152.  
  153. (colors === 10)? palette= colors_10: palette= colors_4; //utilisez switch pour plus de 2 palettes
  154.  
  155. }
  156.  
  157. function play(commandLine) {
  158.  
  159.  
  160. var tableauCommandes = (commandLine===undefined)? tableauCommandes = "": getCommandes(commandLine);
  161. initCommands(tableauCommandes);
  162. matrice= createTableau(n,m); //reinitialise les dimensions du tableau des valeurs d etats
  163. fillMatrice(matrice); //reinitialise les valeurs du tableau
  164.  
  165.  
  166. setScreenMode(m,n); //fonction codeboot d interface image
  167. updateImage(matrice); //initialise l image au temps zero
  168.  
  169.  
  170. switch (evolution) { //choix de mise a jour selon 'evolution'
  171. case "online":
  172. do {
  173. marqueur = false;
  174. updateOnline(matrice);
  175. } while (marqueur);
  176. break;
  177. case "batch":
  178. batchRun();
  179. break;
  180. }
  181. }
  182.  
  183.  
  184. function batchRun() { //creer un deuxieme tableau tampon et alterne avec la matrice originale pour faire la mise a jour
  185. var altMatrice= createTableau(n,m); //solution alternative :considerez une copie des deux premieres lignes seulement pour un tres grand tableau: demande plus que calcul, mais moins de memoire
  186. var permuteTableau=[matrice,altMatrice]; //ensemble des deux tableaux alternatifs
  187. var x=0; //indice du tableau tampon
  188. do {
  189. marqueur = false;
  190. updateBatch(x,permuteTableau);
  191. //pause();
  192. x ^= 1; //permute l indice des deux tableaux 1/0
  193. updateImage(permuteTableau[x]);
  194. } while (marqueur);
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement