Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SUDOKY - SUDOKU EN JAVASCRIPT


Information sur la source

Catégorie :Jeux Classé sous : sudoky, sudoku, javascript, jeux Niveau : Initié Date de création : 29/07/2008 Date de mise à jour : 18/09/2008 08:04:58 Vu / téléchargé: 4 019 / 248

Note :
8,33 / 10 - par 3 personnes
8,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

  • <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>
<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>

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

29 juillet 2008 15:30:11 :
ajout du zip
18 septembre 2008 08:04:58 :
-correction pour la saisie des chiffres sur PC portable (utilisation des chiffres en haut du clavier)

Commentaires et avis

signaler à un administrateur
Commentaire de amrounix le 29/07/2008 14:54:02

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 )

signaler à un administrateur
Commentaire de petifa le 30/07/2008 09:20:00

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.

signaler à un administrateur
Commentaire de lakichemole le 30/07/2008 09:52:38

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?

signaler à un administrateur
Commentaire de amrounix le 30/07/2008 10:23:24

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 !

@+

signaler à un administrateur
Commentaire de lakichemole le 30/07/2008 10:30:56

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?

signaler à un administrateur
Commentaire de amrounix le 30/07/2008 10:51:17

yes ! et c'est la méthode chiffreDesordre() qui réalise ce mélange !

pas de note pour ce source ? :-/

@+

signaler à un administrateur
Commentaire de lakichemole le 30/07/2008 11:05:39 10/10

mais si!!! :)

signaler à un administrateur
Commentaire de amrounix le 30/07/2008 11:10:03

mici ci cooool

signaler à un administrateur
Commentaire de XtremDuke le 30/07/2008 11:30:00

C'est pas mal mais pourquoi n'avoir pas utilisé un algorithme de génération de grille ?

signaler à un administrateur
Commentaire de petifa le 30/07/2008 11:47:02

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.

signaler à un administrateur
Commentaire de amrounix le 30/07/2008 11:47:40

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 ...

signaler à un administrateur
Commentaire de amrounix le 30/07/2008 11:59:21

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)

signaler à un administrateur
Commentaire de petifa le 30/07/2008 12:06:59

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 :)

signaler à un administrateur
Commentaire de nicomilville le 01/08/2008 11:44:39 10/10

Salut,

Encore une bonne source !

Continue comme ça amrounix !

a++

signaler à un administrateur
Commentaire de lakichemole le 01/08/2008 12:19:33

C'est encore moi ! pour le niveau de difficulté tu enlèves un nombre aléatoire de chiffres suivant les niveaux dans ta grille??

signaler à un administrateur
Commentaire de amrounix le 01/08/2008 14:35:09

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 !

@+

signaler à un administrateur
Commentaire de lakichemole le 01/08/2008 15:39: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 :)

signaler à un administrateur
Commentaire de miloka le 11/09/2008 21:41:50

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 ...


signaler à un administrateur
Commentaire de amrounix le 12/09/2008 21:08:58

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 ?  

signaler à un administrateur
Commentaire de miloka le 13/09/2008 01:13:31

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

signaler à un administrateur
Commentaire de amrounix le 13/09/2008 01:51:23

ok ok , je vois le pb,
tu enleve les lignes :

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

et tu remplace :
<body onkeydown="toucher(event)";>  // (en + il y'a une erreur dans la ligne ...)
par
<body onkeydown="toucher(event);" onload="initGrille(true,false);" >

verifie qu'il y'a un seul <body> dans ta page ! sinon envoi moi ton source si ca ne marche pas !

signaler à un administrateur
Commentaire de miloka le 13/09/2008 02:07:26

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="<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é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 ? "&nbsp;" : 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]:"&nbsp;"; }}verif(code);}</script></head><body onkeydown="toucher(event);" onload="initGrille(true,false);" > <br><center><b>SuDoKy V1.0 par AmRouNiX (A. Selim)</b><br><br><table><tr><td><div id="grille"></div></td><td align="center"><a href="#" onclick="javascript&#058;initGrille(true,true);" style="color:green;"><b>nouvelle grille</b></a><br><br><a href="#" onclick="javascript&#058;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></select><br><br><a href="#" onmouseover="javascript&#058;verif(true);" onmouseout="javascript&#058;verif(false);"  style="color:blue;"><b>verifier</b></a><br><br><br><a href="#" onmouseover="javascript&#058;reponse(true);" onmouseout="javascript&#058;reponse(false);" style="color:blue;"><b>reponse</b></a><br></td></tr></table></center></body></html>

voilà je pense que j'ai fait comme indiqué ... encore mer ci !

signaler à un administrateur
Commentaire de amrounix le 13/09/2008 02:15: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> :)

signaler à un administrateur
Commentaire de miloka le 13/09/2008 09:28:57

* 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

signaler à un administrateur
Commentaire de miloka le 13/09/2008 14:33:46

Voilou j'ai ôté les commentaires de codes.
La grille ne s'affiche tjs pas.
Désolé de t'embêter ...

signaler à un administrateur
Commentaire de chaoun le 17/09/2008 13:15:07

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.

signaler à un administrateur
Commentaire de amrounix le 18/09/2008 08:11:20

-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 <body>, quand la page se charge, on initialise la grille sinon rien ne s'affiche !
vérifie qu'il n'y a pas 2 <body> dans ta page, sinon as tu une URL, qu'on puisse regarder le source et trouver le problème ?

signaler à un administrateur
Commentaire de chaoun le 18/09/2008 12:03:29

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 !

signaler à un administrateur
Commentaire de kiadimoundi le 29/12/2008 12:02:33 5/10

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 !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Jeux dhtml javascript [ par Cyreb ] Voila, je regarde depuis longtemps les sources proposé sur ce site et je m'interesse aux jeux en javascripts, pourquoi ne pas créer de veritable proje placer une image à la place d'une fenêtre d'Alerte - Comment modifier mon code javascript svp? [ par RomantikA ] Bonjour, veuillez m'excuser pour cette question peut être stupide et/ou imprécise, mais je désirerais savoir s'il est possible de modifier un code jav Récupérer une valeur d' Access via un codage Javascript [ par mareuh ] Bonjour, je suis novice en progarmmation javascript, et j'ai besoin de dévélopper une application en javascript qui récupère des données dans une base Quelqu'un d'assez fort en javascript sait il faire ??? [ par AUZUR ] Bonjour tout le monde, voila je débute en javascript, et je dois développer une fonction pour mon entreprise, qui doit gérer les caractères spéciaux. Comment manipuler un XML déjà en mémoire via une routine en javascript? [ par zazalamouche ] Voici quelques info sur mon problème:J'ai un fichier XML qui contient des données et un fichier XSL qui contient le format d'affichageLe XML référence probleme fonction javascript et validation w3c [ par anthonydb ] Bonjour à tous voilà je vous expose mon probléme j'ai une fonction javascript qui me permet de mettre a jour des listes liées sans avoir a cliquer sur Problème alignement [ par overstorex ] Bonsoir,J'espère que je suis au bonne endroit pour poster cette demande d'aide.je suis un néophyte en script,je m'en excuse .<img src="http://www.java Problème chargement image javascript [ par Travailleuuse06 ] Bonjour,je suis devant un très gros problème que je n'arrive pas à résoudre. J'ai une page html où j'ai un &lt;img src="image"&gt;Dans ma partie jav Détecter est afficher les coordonées de la page du navigateur ??? [ par supergrey ] Bon, déjà je précise qu'en javascript je suis un newbie. Je voudrais afficher dans la barre de titre du navigateur , la position de la fenetre du navi texte initial dans un champ "input" [ par aztec78 ] bonjour,voici mon problème :j'ai un petit programme en javascript qui transforme un texte d'un formulaire en zone de texte à modifier lorsque l'on cli


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode