Sudoky - sudoku en javascript

Soyez le premier à donner votre avis sur cette source.

Vue 13 809 fois - Téléchargée 1 176 fois

Description

jeu du sudoku en javascript (V1.1)
-5.080.320 grilles possibles, en 243 lignes de code !
-génération du tableau
-saisie des chiffres au clavier
-light, efficace, et simple a comprendre
-ok pour firefox

Source / Exemple :


<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] : "&nbsp;";
	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 ? "&nbsp;" : 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]:"&nbsp;";
	}
}
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>

Codes Sources

A voir également

Ajouter un commentaire Commentaires

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 !!!
Messages postés
4
Date d'inscription
vendredi 22 décembre 2006
Statut
Membre
Dernière intervention
30 décembre 2008

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 !
Messages postés
2
Date d'inscription
lundi 15 septembre 2008
Statut
Membre
Dernière intervention
18 septembre 2008

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 !
Messages postés
78
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
12 juillet 2010

-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 ?
Afficher les 31 commentaires

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.