begin process at 2012 02 14 10:29:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > SUDOKY - SUDOKU EN JAVASCRIPT

SUDOKY - SUDOKU EN JAVASCRIPT


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :6 933 / 393

Auteur : amrounix

Ecrire un message privé
Site perso
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

Les Membres Club peuvent 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)

 Sources du même auteur

Source avec Zip Source avec une capture TROUVER UN ITINÉRAIRE AVEC GOOGLE MAP
Source avec Zip Source avec une capture DEBLOCK ME - CASSE TÊTE
Source avec Zip Source avec une capture CRYPTOR - PROTEGEZ VOS CODES SOURCES !
Source avec Zip Source avec une capture CODE UTF-8
Source avec Zip Source avec une capture QUIZZ MASTER : 2000 QUESTIONS POUR TESTER VOTRE CULTURE

 Sources de la même categorie

Source avec Zip Source avec une capture AVVDA : A VERY VERY DARK AFFAIRES DEMO par Cyreb
Source avec Zip Source avec une capture 3D AVEC WEBGL + MESH par Hakumbaya
SUDOKU RESOLVER (BRUTEFORECE, RÉCURSION) par amezghal
Source avec Zip MACHINE À SOUS par loicseg
Source avec Zip DOODLE JUMP EN JAVASCRIPT par Toshy62

 Sources en rapport avec celle ci

Source avec Zip DICOFOU DICTIONNAIRE FANTAISISTE EN JAVASCRIPT par lecurieux41
Source avec Zip CRÉATION DE SUDOKU EN JAVASCRIPT par pabbati
Source avec Zip Source avec une capture JEUX MEMORY par macgile
Source avec Zip SUDOKUS PAREIL MAIS EN MIEUX par Laffrey
Source avec Zip Source avec une capture LE JEU DE LA BATAILLE par Arto_8000

Commentaires et avis

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 )

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.

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?

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 !

@+

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?

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 ? :-/

@+

Commentaire de lakichemole le 30/07/2008 11:05:39 10/10

mais si!!! :)

Commentaire de amrounix le 30/07/2008 11:10:03

mici ci cooool

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 ?

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.

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

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)

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

Commentaire de nicomilville le 01/08/2008 11:44:39 10/10

Salut,

Encore une bonne source !

Continue comme ça amrounix !

a++

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

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 !

@+

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

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


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 ?  

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

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 !

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 !

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

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

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

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.

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 ?

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 !

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 Du dinamique avec du JavaScript [ par minimoysmini ] Salut, Voila je connais pas mal de truc en informatique. Je c'est programmer en C#,HTML,JavaScript et CSS. Puis j'ai eu envie de créer un jeux sur i Du dynamique avec du javascript [ par minimoysmini ] Salut, Voila je connais pas mal de truc en informatique. Je c'est programmer en C#,HTML,JavaScript et CSS. Puis j'ai eu envie de créer un jeux su La fonction "Saut" dans un jeux 2D [ par DrSlump75 ] Bonjours à tous ! Depuis quelques semaines je me suis lancé avec quelques camarades dans un petit jeu de plateforme 2D en Javascript sur navigateur. L one page javascript application ? [ par alxidali ] Bonjour a tous . j'ai une petite question j&#8217;espère que quelqu'un pourra m'aider ! 1 - comment faire une très grande application JavaScript (pro Cherche à changer un id quand l'url se modifie!!! [ par ayolos ] Bonjour à toutes et à tous, voilà, j'utilise un CMS (expression engine 2.2.2), il génère mes page en php et authorise le javascript, le problème est Envoyer variable Javascript vers une autre page (par URL) [ par midoxe ] Bonjour, je travail sur une application web, et je me bloque sur ce problème : le clique sur un lien provoque l'ouverture d'une fenetre javascript q Calcul de taux de marge en javascript [ par sbataille ] Bonjour, Je suis commerciale et je dois régulièrement définir un prix de vente d'une formation en fonction du prix "d'achat" de l'intervenant et de l javascript [ par wikilili ] bonjour svpp je veux savoir si il est possible de programmer mon propre interface pour par exemple boite de dialogue et associer a elle une methode j


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales