Journal du Net Développeur >  Flash >  Concevoir un Sudoku en Flash

Concevoir un Sudoku en Flash > 4. Le code source

Précédente 5. Aller plus loin... 
 
  Sommaire
 Le code source

Il serait trop long et indigeste de vous fournir l'ensemble de notre code source - qui n'est pas non plus de première beauté. Voici les principales fonctions...

Tout d'abord, la suite de boucle pour créer, remplir, mélanger, conserver, etc., nos principaux tableaux.

  1. function initTableau() {
  2.     // Le tableau original, fait à la main.
  3.     tableau = new Array(
  4.         [1, 2, 3, 4, 5, 6, 7, 8, 9],
  5.         [4, 5, 6, 7, 8, 9, 1, 2, 3],
  6.         [7, 8, 9, 1, 2, 3, 4, 5, 6],
  7.         [2, 3, 4, 5, 6, 7, 8, 9, 1],
  8.         [5, 6, 7, 8, 9, 1, 2, 3, 4],
  9.         [8, 9, 1, 2, 3, 4, 5, 6, 7],
  10.         [3, 4, 5, 6, 7, 8, 9, 1, 2],
  11.         [6, 7, 8, 9, 1, 2, 3, 4, 5],
  12.         [9, 1, 2, 3, 4, 5, 6, 7, 8]);
  13.  
  14.     // Tableau des inversions de chiffres, fait à la main.
  15.     melange = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9);
  16.  
  17.     // Mélange du tableau des inversions.
  18.     for (i=0; i<10; i++) {
  19.         indexOriginal = Math.round(Math.random()*8);
  20.         indexMelange = Math.round(Math.random()*8);
  21.         copie = melange[indexOriginal];
  22.         melange[indexOriginal]= melange[indexMelange];
  23.         melange[indexMelange] = copie;
  24.     }
  25.  
  26.     // Modification des valeurs du tableau à partir du mélange.
  27.     for (i=0; i<9; i++) {
  28.         for(j=0; j<9; j++) {
  29.             tableau[j][i] = melange[tableau[j][i]-1];
  30.         }
  31.     }
  32.  
  33.     // Conserver une copie du tableau original.
  34.     tableauSolution = new Array();
  35.     for (i=0; i<10; i++) {
  36.         tableauSolution[i] = new Array();
  37.     }
  38.     for (i=0; i<10; i++) {
  39.         for (j=0; j<10; j++) {
  40.             tableauSolution[j][i] = tableau[j][i];
  41.         }
  42.     }
  43.  
  44.     // Effacer certaines cases.
  45.     // 1. besoin d'une nouveau tableau indiquant
  46.     // si une case est déjà prise (true) ou pas
  47.     tableauTrous = new Array();
  48.     for (i=0; i<10; i++) {
  49.         tableauTrous[i] = new Array();
  50.     }
  51.     for (i=0; i<10; i++) {
  52.         for (j=0; j<10; j++) {
  53.             tableauTrous[i][j] = true;
  54.         }
  55.     }
  56.  
  57.     // "difficulte" représente le nombre de trous à effacer par ligne.
  58.     // On calcul donc le nombre total de trous à effacer
  59.     nbrTrous = difficulte*9;
  60.     // Puis on en retard autant que nécessaire sur chaque ligne
  61.     // jusqu'à épuisement du nombre
  62.     while (nbrTrous > 0) {
  63.         for (i=0; i<9; i++) {
  64.             trousLigne = difficulte;
  65.             while (trousLigne > 0 ) {
  66.                 j = Math.floor(Math.random()*9);
  67.                 if (tableauTrous[i][j] === true) {
  68.                     tableauTrous[i][j] = false;
  69.                     tableau[i][j] = "";
  70.                     trousLigne--;
  71.                     nbrTrous--;
  72.                 }
  73.             }
  74.         }
  75.     }
  76. }

Ensuite, la bouche pour afficher la grille à l'écran, avec les valeurs idoines.

  1. function initGrille() {
  2.     coordx = 0;
  3.     coordy = 0;
  4.     profondeur = 0;
  5.     // "uneCase" est le nom de notre movie-clip
  6.     // dont une instance a été placée sur la scène
  7.     taille = uneCase._width;
  8.     for (i=1; i<10; i++) {
  9.         for (j=1; j<10; j++) {
  10.             // on instancie autant de uneCase que nécessaire
  11.             laCase = attachMovie("uneCase", "c"+j+i, profondeur);
  12.             laCase._x = taille*(i-1);
  13.             laCase._y = taille*(j-1);
  14.             // on assigne la valeur du tableau mélangé et vidé
  15.             laCase.chiffre = tableau[j-1][i-1];
  16.             if (laCase.chiffre === "") {
  17.                 // on lui assigne une fonction choisir()
  18.                 // qui changera sa couleur (via gotoAndStop())
  19.                 // et remplira la variable "choisie" avec sa référence
  20.                 laCase.onPress = function() {
  21.                     choisir(this);
  22.                 };
  23.             }
  24.             profondeur++;
  25.         }
  26.     }
  27. }

L'écouteur des touches du clavier

  1. function initClavier() {
  2.     // on écoute les touche du clavier
  3.     // et on met à jour la grille
  4.     var ecouteur:Object = new Object();
  5.     ecouteur.onKeyDown = function() {
  6.         choisie.chiffre = String.fromCharCode(Key.getCode());
  7.         verifTableauCorrespondance()
  8.     };
  9.     Key.addListener(ecouteur);
  10. }

La boucle pour vérifier qu'un chiffre entré correspond bien à la solution.

  1. function verifTableauCorrespondance() {
  2.   toutEstbon = true;
  3.     for (i=1; i<10; i++) {
  4.     calculDesChiffres = 0
  5.     for (j=1; j<10; j++) {
  6.       if (this["c"+i+j].chiffre != "") {
  7.         calculDesChiffres += tableau[i][j];
  8.         if (calculDesChiffres == 45) {
  9.           // tous les chiffres sont rentrés
  10.           if (this["c"+i+j].chiffre != tableauSolution[i-1][j-1]) {
  11.             // ... mais ça ne correspond pas à la solution
  12.             toutEstBon = false;
  13.             statut = "Tout va mal !";
  14.           } else {
  15.             // ... et ça correspond !
  16.             statut = "Tout va bien...";
  17.           }
  18.         } else {
  19.           toutEstBon = false;
  20.         }
  21.       }
  22.     }
  23.   }
  24. }
Précédente Aller plus loin...
Jouer au Sudoku
Suivante 
Introduction | La logique du Sudoku | Génération et résolution
Interface graphique | Le code source | Aller plus loin...
 
|
Haut de page
Nos autres sites Société | Mentions légales | Contacts | Publicité | PA Emploi | Presse | Recrutement | Tous nos sites | Données personnelles
© Benchmark Group, 69/71 avenue Pierre Grenier. 92517 Boulogne Billancourt Cedex