//SUDOKU par Walter Siracusa function disableAllButton(){ //Désactive tous les boutons numérotés for(i=1;i<=9;i++){ but=_root["but"+i]; but._alpha=10; but.enabled=false; but.useHandCursor=false; } } function Init(niveau){ //niveau = Nb moyen de trous par zone (3, 5 ou 7) //if(Play) clearGame(); //Plus possible... Play=true; Help=true; //Aide activée ? End=false; //Partie terminée ? Niveau=niveau; Time0=getTimer(); disableAllButton(); Score=2000; score_txt.text=Score; Tab=new Array([3,4,9,6,7,5,1,2,8], [7,2,6,8,1,4,3,5,9], [8,1,5,2,3,9,4,6,7], [9,7,2,5,8,1,6,3,4], [6,5,3,4,9,7,8,1,2], [4,8,1,3,6,2,9,7,5], [1,3,7,9,2,8,5,4,6], [2,9,4,1,5,6,7,8,3], [5,6,8,7,4,3,2,9,1]); Rnd=new Array(1,2,3,4,5,6,7,8,9); //Mélange Rnd plusieurs fois for(i=0;i<20;i++){ ind1=Math.round(Math.random()*8); //0 <= ind1 <= 8 ind2=Math.round(Math.random()*8); //0 <= ind2 <= 8 ind=Rnd[ind1]; Rnd[ind1]=Rnd[ind2]; Rnd[ind2]=ind; } //Change les valeurs de Tab avec les valeurs de Rnd for(j=0;j<9;j++) for(i=0;i<9;i++) Tab[i][j]=Rnd[Tab[i][j]-1]; //-1 car Rnd commence à 0 //6 possiblités de rangement des lignes et des colonnes dans Rnd Rnd=new Array([0,1,2],[0,2,1],[1,2,0],[1,0,2],[2,1,0],[2,0,1]); //Tab2: tableau temporaire pour l'échange des lignes Tab2=new Array(); for(i=0;i<9;i++) Tab2[i]=new Array(); //Reconstruit les lignes de Tab dans Tab2 avec Rnd for(z=0;z<9;z+=3){ //Index des groupes (0,3 et 6) ind=Math.round(Math.random()*5); //0 <= ind <= 5 for(j=0;j<3;j++) //Lignes d'un groupe for(i=0;i<9;i++) Tab2[i][z+j]=Tab[i][z+Rnd[ind][j]]; } //Reconstruit les colonnes de Tab2 dans Tab avec Rnd for(z=0;z<9;z+=3){ //Index des groupes (0,3 et 6) ind=Math.round(Math.random()*5); //0 <= ind <= 5 for(i=0;i<3;i++) //Colonnes d'un groupe for(j=0;j<9;j++) Tab[z+i][j]=Tab2[z+Rnd[ind][i]][j]; } //Grille contenant la solution dans Soluce Soluce=new Array(); //Grille contenant la solution for(i=0;i<9;i++) Soluce[i]=new Array(); for(j=0;j<9;j++) for(i=0;i<9;i++) Soluce[i][j]=Tab[i][j]; //Copie de Tab dans Soluce //Tab2: Tableau de booleens des trous initialisé à vrai for(j=0;j<9;j++) for(i=0;i<9;i++) Tab2[i][j]=true; //Case pleine Nb_hole=niveau*9; //Nombre de trous au total while(Nb_hole>0){ i=Math.floor(Math.random()*9); // 0 <= i < 9 j=Math.floor(Math.random()*9); // 0 <= j < 9 if(Tab2[i][j]){ Tab2[i][j]=false; //Case vidé Tab[i][j]=0; //Supprime le chiffre à trouver (0 ne compte pas) Nb_hole--; } } //Attache tous les chiffres sur la scène num=0; for(j=0;j<9;j++){ for(i=0;i<9;i++){ clip=attachMovie("digit","digit"+num,num,{_x:i*CASE,_y:j*CASE}); num++; if(Tab[i][j]>0){ //Chiffre visible clip.txt_digit.textColor=0x0 //Gris clip.txt_digit.text=Tab[i][j]; }else{ //Chiffre à trouver clip.txt_digit.textColor=0x0000FF; //Bleu clip.txt_digit.text=""; //Texte vide } } } //Attache le curseur de sélection attachMovie("curs","curs",200,{_x:-50,_y:-50}); //Profondeur = 200 curs._alpha=40; //Semi-transparence curs.num=-1; //Aucune case cliquée } //Boutons choix de la difficulté et de l'aide but_easy.onRelease=function(){ txt_msg.text=" NIVEAU FACILE"; Init(3); } but_medium.onRelease=function(){ txt_msg.text=" NIVEAU MOYEN"; Init(5); } but_hard.onRelease=function(){ txt_msg.text=" NIVEAU DIFFICILE"; Init(7); } but_help.onRelease=function(){ Help=!Help; if(Help) txt_msg.text=" AIDE ACTIVEE"; else txt_msg.text=" AIDE DESACTIVEE"; } but_abandon.onRelease=function(){ clearInterval(id_timing); Score=0; score_txt.text=Score; clearGame(); } //Clique sur la scène onMouseDown=function(){ i=Math.floor(_xmouse/CASE); j=Math.floor(_ymouse/CASE); //Clique dans la grille et sur un chiffre à trouver if(Play && i>=0 && j>=0 && i<9 && j<9 && !Tab2[i][j]){ curs.i=i; //Position du curseur sur la grille curs.j=j; curs.num=curs.i+curs.j*9; //Numéro de la case curs._x=curs.i*CASE; //Place le curseur sur la scène curs._y=curs.j*CASE; temp=Tab[curs.i][curs.j]; //Mémorise le chiffre sélectionné Tab[curs.i][curs.j]=0; //Le remplace par 0 //Liste booléene des chiffres disponibles for(i=0;i<=9;i++) Liste[i]=true; //Initialise la liste des booléens //Parcours toute la ligne de Tab for(i=0;i<9;i++) Liste[Tab[i][curs.j]]=false; //Parcours toute la colonne de Tab for(j=0;j<9;j++) Liste[Tab[curs.i][j]]=false; //Parcours toute la zone de Tab for(j=0;j<3;j++) for(i=0;i<3;i++) Liste[Tab[3*Math.floor(curs.i/3)+i][3*Math.floor(curs.j/3)+j]]=false Tab[curs.i][curs.j]=temp; //Rétablit le chiffre selectionné //Construit la chaine txt_msg (si aide activé) if(Help){ /*txt_msg.text=" "; for(i=1;i<=9;i++) if(Liste[i]) txt_msg.text+=i+" - "; //Supprime les 2 derniers caractères (si possible) if(txt_msg.length>2) txt_msg.text=txt_msg.text.slice(0,-2); else txt_msg.text=" Oh oh!"; //Aucun chiffre disponible ! */ for(i=1;i<=9;i++){ but=_root["but"+i]; but._alpha=10; but.enabled=false; if(Liste[i]){ but._alpha=100; but.enabled=true; but.useHandCursor=true; } } } } } //Clique sur un des boutons de 0 à 9 for(k=0;k<=9;k++){ _root["but"+k].val=k; //Numéro du bouton _root["but"+k].onRelease=function(){ if(Play && !End && curs.num>=0){ if(this.val>0){ //Un bouton de 1 à 9 if(Liste[this.val]){ //Le chiffre de la liste est possible Tab[curs.i][curs.j]=this.val; _root["digit"+curs.num].txt_digit.text=this.val; Check(); //Grille est complète et juste ? } }else{ //Bouton vide (supprime le chiffre) Tab[curs.i][curs.j]=0; Tab[curs.i][curs.j]=0;_root["digit"+curs.num].txt_digit.text=""; } } } } //Clique sur le bouton Réponse but_rep.onRelease=function(){ if(Play){ txt_msg.text=" SOLUTION..."; End=true; num=0; //Numéro de la case for(j=0;j<9;j++){ for(i=0;i<9;i++){ if(Tab[i][j]!=Soluce[i][j]){ //Chiffre différent Tab[i][j]=Soluce[i][j]; clip=_root["digit"+num]; clip.txt_digit.textColor=0xFF0000; //Rouge clip.txt_digit.text=Soluce[i][j]; } num++; //Case suivante } } } } //Grille complète et juste ? function Check(){ ok=true; for(j=0;j<9;j++){ total=0; for(i=0;i<9;i++) total+=Tab[i][j]; if(total!=45) ok=false; //Somme de 1 à 9 = 45 } if(ok){ //Gagné ! myDate=new Date(0,0,0,0,0,0,0); //Objet date pour la durée de la partie myDate.setMilliseconds(getTimer()-Time0); txt_msg.text="BRAVO! ("+myDate.getHours()+" h "+myDate.getMinutes()+" min "+myDate.getSeconds()+" s)"; End=true; endGame(); } } function clearGame(){ //Clear pour les nouvelles parties delete Tab,Tab2,Soluce,Rnd; //Supprime les tableaux,... curs.removeMovieClip(); //...le curseur, for(i=0;i<9*9;i++) _root["digit"+i].removeMovieClip(); //...les chiffres gotoAndStop("score_flag"); } function endGame(){ End=true; but_abandon._visible=false; clearInterval(id_timing); play(); } function timingScore(){ Score--; score_txt.text=Score; if(Score==1980) but_abandon._visible=true; if(Score==0) endGame(); } //------------------------------------------ CASE=30; //Largeur et hauteur d'une case de la grille (en pixels) Play=false; //Une partie a été lancée ? Liste=new Array(); //Tableau de booléens des chiffres disponibles but_rep._visible=false; but_help._visible=false; but_easy._visible=false; but_medium._visible=false; but_hard._visible=false; but_abandon._visible=false; but0.useHandCursor=true; Init(5); id_timing=setInterval(timingScore,700);