SUDOKY - SUDOKU EN JAVASCRIPT

amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010 - 29 juil. 2008 à 14:54
 thomas boulenger - 17 mai 2017 à 21:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47436-sudoky-sudoku-en-javascript

thomas boulenger
17 mai 2017 à 21:41
J'ai essayé tes grilles, elles ont souvent plusieurs solutions

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.
Les grilles générées sont parfois introuvables.
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 !!!
kiadimoundi Messages postés 4 Date d'inscription vendredi 22 décembre 2006 Statut Membre Dernière intervention 30 décembre 2008
29 déc. 2008 à 12:02
code intéressant. ça fait effectivement beaucoup de combinaisons possibles !
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 !
cs_chaoun Messages postés 2 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 18 septembre 2008
18 sept. 2008 à 12:03
Merci pour les chiffres ! ça marche nickel
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 !
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
18 sept. 2008 à 08:11
-pour les chiffres sur PC portable, c'est corrigé
-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 ?
cs_chaoun Messages postés 2 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 18 septembre 2008
17 sept. 2008 à 13:15
petit bug : j'ai un ordinateur portable et je ne peux pas rentrer les chiffres dans la grille...

pour Miloka : quand le navigateur lit le programme et qu'il rencontre "//" dans une ligne,
il lit pas ce qui suit (le commentaire) et recommence à lire directement à la ligne suivante.
D'une façon générale, pour que le code fonctionne, il vaut mieux recréer les passages à la ligne
de façon à ce que le code sur ta page ressemble à celui qui est affiché ici.
Si tu télécharges le zip, le code sera "comme il faut" et tu pourras faire un copier-coller sur
ta page sans problème.
miloka Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 13 septembre 2008
13 sept. 2008 à 14:33
Voilou j'ai ôté les commentaires de codes.
La grille ne s'affiche tjs pas.
Désolé de t'embêter ...
miloka Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 13 septembre 2008
13 sept. 2008 à 09:28
* pour html c'est ma faute lol, erreur de frappe ...

J'ai copié le code et coller ensuite sur ma page html mais qd je le valide, tout s'écrit à la suite comme ci-dessus. Je ne suis pas développeuse donc je ne sais pas quelle écritues sont ensemble .. enfin
J'essai sans les écritures, erreur de débutant ...
Merci à toi
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
13 sept. 2008 à 02:15
tu peut faire des passages à la ligne ?
parce que comme ca, les commentaires de code avec le "//" devant, va mettre en commentaire tte la suite du code
du coup, il ne retrouve plus rien !
au faite c'est <html> et non <htlm> :)
miloka Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 13 septembre 2008
13 sept. 2008 à 02:07
J'ai apporté les modifications mais rien n'y fait !!

je te joins le code que j'ai installé sur ma page de portail

<htlm><head><style>.tabloInterieur{width:20px;height:20px;font-family:Tahoma;font-size:12px;color:lightblue;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, //faible2 : 15, //moyen3 : 13, //difficile4 : 11 //diabolique }var grille,masque,chiffres,choixCase= null,grilleUser= new Array(81);//retourne un chiffre entre min & maxfunction aleatoire(min,maxi) {return (parseInt(Math.random()*1000)%(maxi-min+1)+min);}//test si c'est un chiffrefunction 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="\";var x,y;for (y=0;y<3;y++){htm+=\"----
";for (x=0;x<3;x++){index = y*3+x;if (sub) { htm+=""; htm+=creerGrille3x3(grille,chiffres,masque,index,false); //recursif pour afficher les sous tableaux htm+=", "; } else { if (masque[id*9+index] == true) //test binaire sur le masque { htm+=""+chiffres[parseInt(grille.charAt(id*9+index))]+", "; grilleUser[id*9+index]=chiffres[parseInt(grille.charAt(id*9+index))]; } else { //htm+= chiffres[parseInt(grille.charAt(id*9+index))]; htm+= ""; //if (isChiffre(grilleUser[id*9+index])) htm+=isChiffre(grilleUser[id*9+index]) ? grilleUser[id*9+index] : " "; htm+=", "; } }}htm+="n";}htm+="
";return htm;}//changement du style au passage de la souris + selection de la case selectionnéefunction 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ètrefunction 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 desordrefunction 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 grillefunction 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 grillefunction 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 clavierfunction toucher(e){var key = window.event ? e.keyCode : e.which;supp = (key==32||key==46||key==96||key==8); //supprime le chiffre (touches : espace,del,0 ou back)key -=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 grillefunction 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="lightblue"; }}}//Affiche les réponses de la grillefunction 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>
<center>SuDoKy V1.0 par AmRouNiX (A. Selim)

[# reponse]
</center></html>

voilà je pense que j'ai fait comme indiqué ... encore mer ci !
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
13 sept. 2008 à 01:51
ok ok , je vois le pb,
tu enleve les lignes :

<script language="javascript">
window.onload = function () {
initGrille(true,false);}
</script>

et tu remplace :
// (en + il y'a une erreur dans la ligne ...)
par


verifie qu'il y'a un seul dans ta page ! sinon envoi moi ton source si ca ne marche pas !
miloka Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 13 septembre 2008
13 sept. 2008 à 01:13
re moi ...
merci de ton écoute.
Au niveau balise et "id" j'ai du rien touché puisque j'ai bêtement copié le code source, d'où peu être ma boulette ???
j'ai voulu télécharger le script mais mon ms dos affiche une erreur dite d'"ouverture".
Sur mon forum, seul le niveau et le texte s'affiche en aucun cas la grille de jeu.

Merci de ton aide
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
12 sept. 2008 à 21:08
salut ... ca m'arrive souvent aussi ce genre de souci !
verifie que tu as bien fermé les balises, que tu n'a pas mis 2 fois les mêmes "id"
tu as un message d'erreur ? si oui à quelle ligne ?
miloka Messages postés 5 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 13 septembre 2008
11 sept. 2008 à 21:41
Bonsoir,
C'est le script enfin l'apparence définitive qui m'a fait venir ici. Ce petit jeu est bien présenté et clair !
Je ne suis pas une experte en info mais qd même, j'ai installé le script sur ma bulle de forum mais la grille ne s'affiche pas. Aurais je fait une erreur qqe part.
Merci de m'éclairer un peu ...
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
1 août 2008 à 15:39
Oki je pourrais m'en servir alors nikel j'avai peur que tu enlève juste un nombre au hazard de case et pas conséquent la règle d'unicité aurait été compromise :)
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
1 août 2008 à 14:35
salut !
concernant le niveau de difficulté, je ne sais pas si tu as remarqué mais la disposition des chiffes affichée était symétrique par rapport au centre de la grille.
en fonction du niveau, j'affiche un certain nombre de chiffre sur la demi grille,
17 chiffre pour le niveau faible, 15 niveau moyen, 13 difficile et 11 chiffres pour le niveau diabolique
et par symétrie, on trouve 34 chiffres visible pour le niveau faible ... jusqu'a 22 chiffres pour le niveau diabolique qui est suffisent pour résoudre la grille car théoriquement il faut un minimum de 17 chiffres disposés n'importe où pour résoudre la grille et avoir une solution unique (je l'ai lu sur un site)

nb : le nombre de chiffres affichés correspond à la variable "niveaux", et la valeur 41 permet de rendre visible toute la grille (utilisé pour débugger) ...

PS: merci pr la note !

@+
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
1 août 2008 à 12:19
C'est encore moi ! pour le niveau de difficulté tu enlèves un nombre aléatoire de chiffres suivant les niveaux dans ta grille??
nicomilville Messages postés 3472 Date d'inscription lundi 16 juillet 2007 Statut Membre Dernière intervention 28 février 2014 36
1 août 2008 à 11:44
Salut,

Encore une bonne source !

Continue comme ça amrounix !

a++
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
30 juil. 2008 à 12:06
c vrai mais c plus fun d'avoir un jeu avec toutes les possibilités possibles :p
5 millions de grilles dja pour les faire il faut y aller, donc ton système suffit :)
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
30 juil. 2008 à 11:59
c'est clair que comme ca on peut encore augementer le nombre de combinaison ...

x4 pour la rotation
x2 pour la symétrie
x6 permutations des blocs horizontalements (3!)
x6 permutations des blocs verticalements
x6 permutations des lignes dans un même bloc
x6 permutations des colonnes dans un même bloc

5080320x2x4x6x6x6x6 = 52 672 757 760 combinaisons à cela faut supprmier les doublons (symétrie + permutation)
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
30 juil. 2008 à 11:47
quel intérêt de faire des algorithmes (bien que j'aime ca) sachant qu'avec mon système on aboutie à + de 5 millions de grilles différentes, et c'est sans compter le temps d'exécution, algorithme récursif, équations à 72 paramètres (81-9) même en utilisant des matrices, ca fait beaucoup de calcul !
Pour info sans tenir compte des symétries (rotation, transposition), il existe 5 472 730 538 de combinaisons possibles ...
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
30 juil. 2008 à 11:47
Pour mélanger il y a une autre solution sinon,
c'est d'intervertir deux lignes, ou deux colonnes qui se trouvent dans le même "carré" en gros sur le carré de 9x9 tu intervertis la ligne 1 et 2, ca te donne une nouvelle grille et après tu as encore plus de solutions je pense.
mais bon ca nécessite que tu ne stock pas de la même façon tes éléments car il faudrait les mettre dans un seul tableau.
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
30 juil. 2008 à 11:30
C'est pas mal mais pourquoi n'avoir pas utilisé un algorithme de génération de grille ?
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
30 juil. 2008 à 11:10
mici ci cooool
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
30 juil. 2008 à 11:05
mais si!!! :)
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
30 juil. 2008 à 10:51
yes ! et c'est la méthode chiffreDesordre() qui réalise ce mélange !

pas de note pour ce source ? :-/

@+
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
30 juil. 2008 à 10:30
J'imagine que quand tu dis que tu mélange les chiffre de de 1 à 9 tu remplace par exemple tous les 1 de la grille par le 8 le 8 par un 7 etc?
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
30 juil. 2008 à 10:23
Non, en faite il y'a 14 grilles différentes déjà mémorisées dans la variable puzzles, c'est des grilles déjà résolues, l'astuce c'est qu'en seconde phase je mélange les chiffres de 1 à 9, qui donneront beaucoup plus de grilles différentes .
Pour chaque grille on a 9! (362880) combinaisons possibles, soit un totale de :
362880 x 14 = 5080320 grilles possibles.

Une fois la grille créée, j'applique un masque qui laisse un certain nombre de chiffre visible en fonction du niveau, mais normalement, on a qu'une seule possibilité à moins qu'on a vraiment vraiment pas de chance (statistiquement quasi impossible)

Ce qui est aléatoire, c'est le mélange des chiffres et l'emplacement des chiffres visibles !

Lors de la vérification, je fait des tests entre ce qu'on a saisie et la grille générée (variable grille combiné avec la variable chiffres)

Si tu as d'autres questions, n'hesite pas !

@+
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
30 juil. 2008 à 09:52
Salut une petite question, j'ai regardé le code vite fait et je crois avoir compris que tu remplissais la grille de ton sudoku aléatoirement, mais je n'ai pas vu la fonction qui permettais de savoir si la grille était résolvable et à fortiori d'une seul façon ais-je mal vu?
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
30 juil. 2008 à 09:20
Mouai c vrai la classe,
heu franchement jprend pas le paris, jvais le perdre a tous les coups :p
J'ai pas encore testé le jeux mais ca va vnir soon.
amrounix Messages postés 78 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 12 juillet 2010
29 juil. 2008 à 14:54
246 lignes de pur code... j'aime ca ! dites moi ce que vous en pensez ?
je donne une médaille à celui qui fera + court ! (sans repomper ... lol )
Rejoignez-nous