Soyez le premier à donner votre avis sur cette source.
Vue 13 809 fois - Téléchargée 1 176 fois
<html> <head> <style> .tabloInterieur{width:20px;height:20px;font-family:Tahoma;font-size:12px;color:black;text-align:center;border:1px #c0c0c0 solid;cursor:pointer;} .tabloInterieur b{color:blue;cursor:pointer;} .tabloExterieur{border:2px #c0c0c0 solid;text-align:center;} td{font-family:Tahoma;font-size:12px;} a{font-family:Tahoma;font-size:12px;text-decoration:none;} </style> <script language="javascript"> /*14 grilles possibles + remplacement des chiffres de 1-9 par d'autres chiffres ca fait beaucoup de combinaisons !!!*/ var puzzles = new Array ( "123745698459681732678392145269584371513267948784913526937412856826375194451869237", "126895374437621985958473126457983612193246578862517394269548731314769852785231649", "142685973936217458857394612329451867174862593568973241298534716745621389136789425", "158469372362587914794312658637215984259648173841973526726841593435796821189235467", "269548731314769852785231649126895374437621985958473126457983612193246578862517394", "362175948845963217179248635713296854458731629962584713439527681576184392821396457", "386751942574928361291364875614837529793245186528619743478293165659817432132456987", "418957632297643581563812794286571394354928716179436285723845169865139472941627358", "452371986618429573379865241734629815162845397598713624293148567754236981186957432", "531428679628579143749163825986217345214835967537496281792854163381796452654312978", "753896412196274538482153679385624971421759683967318245248567139365912847791834526", "872351946139264758654987321269587134843612975175439268418725693526391487793846512", "921437568583629174674158392283746195765912438419835267674319852251847396983526741", "954126783836759124172834956295431678371568492648297315849567312215983647763421589"); var niveaux = /*nombre de chiffre qui vont apparaitre en fonction du niveau (affichage symétrique, donc faire *2)*/ { 0 : 41, /*affiche tout (pour debuger et tester...)*/ 1 : 17, /*faible*/ 2 : 15, /*moyen*/ 3 : 13, /*difficile*/ 4 : 11, /*diabolique*/ 5 : 9 /* impossible*/ }; var grille,masque,chiffres,choixCase= null,grilleUser= new Array(81); /*retourne un chiffre entre min & max*/ function aleatoire(min,maxi) {return (parseInt(Math.random()*1000)%(maxi-min+1)+min);} /*test si c'est un chiffre*/ function isChiffre(nbre) { return (nbre!=null&&nbre>0&&nbre<=9); } /*creer un tableau 3x3*/ /*grille= liste des chiffres, chiffres = chiffre de 1 à 9 ds le désordre, masque = code binaire des emplacement des chiffres, id = index du tableau, sub = tableau principale / sous tableau */ function creerGrille3x3(grille,chiffres,masque,id,sub) { var htm="<table cellspacing=0 >"; var x,y; for (y=0;y<3;y++) { htm+="<tr>"; for (x=0;x<3;x++) { index = y*3+x; if (sub) { htm+="<td class='tabloExterieur' >"; htm+=creerGrille3x3(grille,chiffres,masque,index,false); /*recursif pour afficher les sous tableaux*/ htm+="</td>"; } else { if (masque[id*9+index] == true) /*test binaire sur le masque*/ { htm+="<td class='tabloInterieur' ><b>"+chiffres[parseInt(grille.charAt(id*9+index))]+"</b></td>"; grilleUser[id*9+index]=chiffres[parseInt(grille.charAt(id*9+index))]; } else { /*htm+= chiffres[parseInt(grille.charAt(id*9+index))];*/ htm+= "<td class=\"tabloInterieur\" id='c_"+(id*9+index)+"' onmouseover=\"choix(this,0);\" onmouseout=\"choix(this,1);\" onclick=\"choix(this,2);\">"; /*if (isChiffre(grilleUser[id*9+index]))*/ htm+=isChiffre(grilleUser[id*9+index]) ? grilleUser[id*9+index] : " "; htm+="</td>"; } } } htm+="</tr>\n"; } htm+="</table>"; return htm; } /*changement du style au passage de la souris + selection de la case selectionnée*/ function choix(source,code) { if (code == 0) {source.style.background=(source == choixCase) ? '#c0ffc0':'yellow'} else if (code == 1){ source.style.background=(source == choixCase) ? '#c0ffc0':''; } else { if (choixCase!=null) {choixCase.style.background='';} choixCase=source; choix(source,0); } } /*retourne un chiffre qui n'appartient pas à la liste envoyé en paramètre*/ function uniqueChiffre(list) { var nbr=aleatoire(1,9); for(var a=0;a<list.length;a++){ if(list[a]==nbr){ nbr=aleatoire(1,9); a=0; } } return nbr; } /*retourne les chiffres de 1 à 9 dans le desordre*/ function chiffreDesordre() { liste=new Array("0"); for(j=0;j<9;j++){ nvx_chiffre=uniqueChiffre(liste); liste.push(nvx_chiffre); } return liste; } /*retourne un masque correspondant au niveau de difficulté*/ function getMasque(nbmax) { var list = new Array(81); for (i=0;i<nbmax;i++) { x = aleatoire(0,40); while (list[x]==true) { x = aleatoire(0,40); } list[x]=true; } for (i = 0; i<40; i++) { if (list[39-i]==true) list[41+i] = true; } return list; } /*génère la grille*/ function creerGrille(niveau,nvx) { if (nvx) { grilleUser= new Array(81); grille = puzzles[aleatoire(0,13)]; nbChiffre = niveaux[parseInt(niveau)]; masque = getMasque(nbChiffre); chiffres = chiffreDesordre(); choixCase=null; } html=creerGrille3x3(grille,chiffres,masque,0,true); document.getElementById("grille").innerHTML = html; } /*remise a zéro de la grille*/ function initGrille(code,msg) { grilleUser= new Array(81); if (!msg||confirm("êtes-vous sûr de réinitialiser la grille ?")) {creerGrille(document.getElementById('level').value,code);} } /*récupère le code du clavier*/ function toucher(e) { var key = window.event ? e.keyCode : e.which; supp = (key==32||key==46||key==96||key==8||key==48); /*supprime le chiffre (touches : espace,del,0 ou back)*/ key -=(key<96)?48:96; if (key>=1&&key<=9||supp) { if (choixCase==null) {alert("vous devez selectionner une case pour taper un chiffre");} else { choixCase.innerHTML = supp ? " " : key; grilleUser[parseInt(choixCase.id.split("_")[1])]= supp ? "" : key; } } } /*verifie la grille*/ function verif(code) { for (i=0;i<81;i++) { if (isChiffre(grilleUser[i])&&masque[i]!=true) if (code&&parseInt(chiffres[parseInt(grille.charAt(i))])!=grilleUser[i]) { document.getElementById("c_"+i).style.color="red"; } else { document.getElementById("c_"+i).style.color="black"; } } } /*Affiche les réponses de la grille*/ function reponse(code) { for (i=0;i<81;i++) { if (masque[i]!=true) if (code&&!isChiffre(grilleUser[i])) { document.getElementById("c_"+i).innerHTML=chiffres[parseInt(grille.charAt(i))]; } else { document.getElementById("c_"+i).innerHTML=isChiffre(grilleUser[i])?grilleUser[i]:" "; } } verif(code); } </script> </head> <body onkeydown="toucher(event);" onload="initGrille(true,false);"> <br><center> <b>SuDoKy V1.1 par AmRouNiX (A. Selim)</b><br><br> <table> <tr><td><div id="grille"></div></td><td align="center"> <a href="#" onclick="javascript:initGrille(true,true);" style="color:green;"><b>nouvelle grille</b></a><br><br> <a href="#" onclick="javascript:initGrille(false,true);" style="color:red;"><b>recommencer</b></a><br><br> <b>niveau</b> <select id='level' onchange="initGrille(true,true);" > <!--<option value='0'>Debug</option>--> <option value='1'>Faible</option> <option value='2' selected >Moyen</option> <option value='3'>Difficile</option> <option value='4'>Diabolique</option> <option value='5'>Impossible</option></select><br><br> <a href="#" onmouseover="javascript:verif(true);" onmouseout="javascript:verif(false);" style="color:blue;"><b>verifier</b></a><br><br><br> <a href="#" onmouseover="javascript:reponse(true);" onmouseout="javascript:reponse(false);" style="color:blue;"><b>reponse</b></a><br> </td></tr></table> </center> </body> </html>
exemple avec cette grille il y a 2 solutions : http://www.lamarmite.fr/felix/sudoky_17_05_17.jpg
mais avec celle ci il y en a 18.
http://www.lamarmite.fr/felix/sudoky_4.jpg
J'ai même trouvé une de tes grilles où tu as 225 solutions ...
pour t'aider j'ai fait une page html :
http://www.lamarmite.fr/felix/amrounix.html
un peu long à charger il y a les 225 solutions !!!
évidement quand la solution qu'on a trouvé ne correspond pas à la solution que tu proposes, il te dit que ta réponse est fausse alors que les contraintes du sudoku sont respectées.
j'en ai mis quelques unes à l'épreuve d'un algorithme qui trouve des grilles difficiles, parfois on reste bloquer avec plusieurs cases avec deux possibilités équivalentes (exemple 7,8 sur une case et 7,8 sur une autre)
En mettant un chiffre au hasard (ici 7 ou 8), ça se débloque. Il faut parfois répéter l'opération hasardeuses plusieurs fois. Ensuite je fini toujours par trouver une solution mais qui n'est pas obligatoirement celle qui est proposée ...
Donc bonne chance à ceux qui cherche manuellement la solution à vos grilles générées !!!
Si des personnes sont intéressées par un générateur (beta) de grilles de sudoku :
j'en ai mis un ici : http://www.javascriptfr.com/codes/GENERATEUR-GRILLES-SUDOKU_48813.aspx
n'hésitez pas à me faire par de vos suggestions !
et c'est une bonne idée pour les commentaires...
Pour éviter le problème du "onload", tu pourrais peut-être afficher une grille
blanche et la remplir seulement quand on choisit un niveau ?
à part ces quelques détails, c'est vraiment un bon code, bravo !
-j'ai remplacé les commentaires // par /*...*/
je pense que le problème de miloka vient sur le onload du , quand la page se charge, on initialise la grille sinon rien ne s'affiche !
vérifie qu'il n'y a pas 2 dans ta page, sinon as tu une URL, qu'on puisse regarder le source et trouver le problème ?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.