Logigramme

Description

un fichier OO qui sert d'apui pour résoudre les logigrammes... et un logigramme en prime...

Source / Exemple :


<html>
<head>
<title>logigramme</title>
</head>
<body>
<p>Pour utiliser ceci, il suffit de mettre en paramètre le nom, le nombre de cases par catègories, et le tableau qui contiendra les noms désignants les catègories (Ces noms ne servent qu'a l'affichage). Ensuite, on ne peut sauvegarder, mais on peut plus facilement résoudre nos logigrammes.</p>
<p>Einstein avait dit que seulement 2 pourcent de la population pouvaient résoudre son logigramme... en serez vous capable...</p>
<p>Verstion 1.1 Tout est pris en compte... Seule chose que ce programme ne fera pas a votre place : les supositions. Nouveautées : On peut rayer d'une couleur une ligne ou une colone, on a aussi un bouton clear pour effacer les lignes surlignées. On peut également, en cliquant sur les indices, les griser pour retenir plus facilement ceux que l'on a déja exploité.</p>

<p>5 maisons, 5 nationalités, 5 boissons, 5 produits du tabac, 5 animaux favoris.<br />
15 indices pour tout démêler...<br />

<script>
function clear_screen(taille){
	var j, k;
	for (j=0;j<taille;j++)
		for (k=0;k<taille;k++)
			document.getElementById(k+"_"+j).style.background="#FFFFFF";
}
function boldisex(i, taille){
	var j;
	for (j=0;j<taille;j++)
		document.getElementById(j+"_"+i).style.background="#FFDDAA";
}
function boldisey(i, taille){
	var j;
	for (j=0;j<taille;j++)
		document.getElementById(i+"_"+j).style.background="#FFDDAA";
}
function Logigramme(nom, taille, tableau){
/*
Ceci sert de constructeur....

  • /
taille2=tableau.length; //on y déclare les variables this.tableau=new Array(taille2); this.nom = nom; this.taille_once=taille; this.taille_total=taille2; this.indices_used; //puis les fonctions que le logigramme peut utiliser this.check=Logigramme_check; this.rectifie=Logigramme_rectifie; this.affiche=Logigramme_affiche; this.indices=Logigramme_indices; this.indice_coche=Logigramme_indice_coche; //on affiche les cases document.write('<input type="button" value="clear" onclick="clear_screen('+taille2+');"><br /><table style="border-spacing: 0px;"><tr><td>'+nom+'</td>'); for (i=0;i<taille2;i++) document.write('<td><input type="button" value="'+tableau[i]+'" onclick="boldisex('+i+', '+taille2+');"></taille2;i++)></td>'); ci=0; for (i=0;i<taille2;i++){ if (i%taille==0){ ci++; change_colone=1; }else change_colone=0; document.write('</tr><tr><td><input type="button" value="'+tableau[i]+'" onclick="boldisey('+i+', '+taille2+');"></td>'); this.tableau[i]=new Array(taille2); //on déclare un tableau dans un tableau cj=0; for (j=0;j<taille2;j++){ if (j%taille==0){ //marque un changement de catègorie et les bordures de gauche de chaque catègorie cj++; st='border-left : 3px solid;'; }else st=''; if (change_colone==1) //place les bordures de haut de categories st+='border-top : 3px solid;'; if (i==j) v='O'; else if (ci==cj) v='X'; else v=''; if (j==taille2-1) //place la bordure de droite st+='border-right : 3px solid;'; if (i==taille2-1) //et celle du dessous st+='border-bottom : 3px solid;'; document.write('<td style="'+st+'"><input type="text" id="'+i+'_'+j+'" size="1" value="'+v+'" onchange="changed('+"'"+nom+"'"+','+i+','+j+');" /></td>'); this.tableau[i][j]=v; //et on en modifie la valeur } } document.write('</tr></table><br /><input type="button" value="clear" onclick="clear_screen('+taille2+');">'); } function Logigramme_indices(){ var i; this.indices_used=new Array(Logigramme_indices.arguments.length); document.write("<ul>"); for (i=0;i<Logigramme_indices.arguments.length;i++){ document.write('<li id="indice_'+i+'" onclick="'+this.nom+'.indice_coche('+i+');">'+Logigramme_indices.arguments[i]+"</li>"); this.indices_used[i]=false; } document.write("</ul>"); } function Logigramme_indice_coche(i){ this.indices_used[i]=(this.indices_used[i])?false:true; document.getElementById("indice_"+i).style.background=(this.indices_used[i])?"#DDDDDD":"#FFFFFF"; } function Logigramme_affiche(pos_x,pos_y){ /* cette fonction sert à changer la valeur d'une case
  • /
/*//alert(pos_x+'/'+pos_y+'/'+this.tableau[pos_x][pos_y]); eval("a=document."+this.nom+"._"+pos_x+"_"+pos_y+".value"); eval("document."+this.nom+"._"+pos_x+"_"+pos_y+".value='"+this.tableau[pos_x][pos_y]+"'");*/ document.getElementById(pos_x+"_"+pos_y).value=this.tableau[pos_x][pos_y]; } function Logigramme_check(pos_x,pos_y,changed){ /* Cette fonction sertà cocher une case
  • /
if (changed=="O" || changed=="X" || changed==""){ this.tableau[pos_x][pos_y]=changed; //aplique la modification en ram this.rectifie(); //complète le tableau }else{ alert('erreur !! vous avez saisi :"'+changed+'"'); this.affiche(pos_x,pos_y); //efface l'erreur } } function Logigramme_rectifie(){ /* Pour commencer dans tout logigramme : à toute case de coordonnées (x, y) on peut associer une case de même valeur et de coordonnées (y,x);
  • /
var scan_x, cores_x, scan_y, cores_y, point_x, point_y,i,j=0; var alignO=new Array(this.taille_once*2); var alignX=new Array(this.taille_once*2); var manqueO_x=new Array(this.taille_once*2); var manqueO_y=new Array(this.taille_once*2); for (i=0;i<this.taille_once*2;i++){ alignX[i]=0; alignO[i]=0; } for (scan_x=0;scan_x<this.taille_total;scan_x++){ for (scan_y=0;scan_y<this.taille_total;scan_y++){ if (this.tableau[scan_x][scan_y]!=this.tableau[scan_y][scan_x]){ if (this.tableau[scan_x][scan_y]==''){ this.tableau[scan_x][scan_y]=this.tableau[scan_y][scan_x]; this.affiche(scan_x,scan_y); }else if (this.tableau[scan_y][scan_x]==''){ this.tableau[scan_y][scan_x]=this.tableau[scan_x][scan_y]; this.affiche(scan_y,scan_x); }else{ alert('ERREUR CONFLIT ENTRE LES CASES : ('+scan_x+', '+scan_y+') et ('+scan_y+', '+scan_x+');'); } } } } /* ensuite, on a strictement une seule réponse positive par ligne et par colone...
  • /
retour=1; while(retour==1){ //comme le tableau change régulièrement, on doit faire plusieurs tours... retour=0; for (scan_x=0;scan_x<this.taille_total;scan_x+=this.taille_once){ for (scan_y=0;scan_y<this.taille_total;scan_y+=this.taille_once){ for (point_x=0;point_x<this.taille_once;point_x++){ for (point_y=0;point_y<this.taille_once;point_y++){ if (this.tableau[scan_y+point_y][scan_x+point_x]=='X'){ alignX[point_x]++; alignX[point_y+this.taille_once]++; }else if (this.tableau[scan_y+point_y][scan_x+point_x]=='O'){ alignO[point_x]++; alignO[point_y+this.taille_once]++; }else{ manqueO_x[point_x]=scan_x+point_x; manqueO_x[point_y+this.taille_once]=scan_x+point_x; manqueO_y[point_x]=scan_y+point_y; manqueO_y[point_y+this.taille_once]=scan_y+point_y; } } } for (i=0;i<this.taille_once*2;i++){ //récupère les erreurs if (alignX[i]==this.taille_once) alert('erreur ligne de croix dans la catègorie ('+(scan_x/this.taille_once)+','+(scan_y/this.taille_once)+');'+this.taille_once); if (alignO[i]>1) alert('erreur deux validations dans la catègorie ('+(scan_x/this.taille_once)+','+(scan_y/this.taille_once)+');'); //si il ne reste qu'une case vide, et que toutes les cases sont remplies par des croix, alors on mets un O if (alignX[i]==this.taille_once-1 && alignO[i]==0){ this.tableau[manqueO_y[i]][manqueO_x[i]]='O'; this.affiche(manqueO_y[i],manqueO_x[i]); retour=1; } //quand on a un O on doit remplir toutes les cases sur les cotés de X if (alignO[i]==1 && alignX[i]!=this.taille_once-1){ if (i<this.taille_once){ for (point_y=0;point_y<this.taille_once;point_y++){ if (this.tableau[scan_y+point_y][scan_x+i]==''){ this.tableau[scan_y+point_y][scan_x+i]='X'; this.affiche(scan_y+point_y, scan_x+i); } } }else{ for (point_x=0;point_x<this.taille_once;point_x++){ //alert(scan_y + i + ' , ' + scan_x + point_x ); if (this.tableau[ scan_y + i - this.taille_once ][ scan_x + point_x]==''){ this.tableau[ scan_y + i - this.taille_once ][ scan_x + point_x]='X'; this.affiche( scan_y + i - this.taille_once , scan_x + point_x); } } } retour=1; } //remets les alignements à 0 alignX[i]=0; alignO[i]=0; } } } /* Quand on rencontre un O, les cases ensuite sont identiques
  • /
for (scan_y=0;scan_y<this.taille_total;scan_y++){ for (scan_x=0;scan_x<this.taille_total;scan_x++){ if (this.tableau[scan_y][scan_x]=='O'){ for (point_x=0;point_x<this.taille_total;point_x++){ if (this.tableau[scan_y][point_x]!=this.tableau[scan_x][point_x]){ if (this.tableau[scan_y][point_x]==''){ this.tableau[scan_y][point_x]=this.tableau[scan_x][point_x]; this.affiche(scan_y,point_x); retour=1; }else if (this.tableau[scan_x][point_x]==''){ this.tableau[scan_x][point_x]=this.tableau[scan_y][point_x]; this.affiche(scan_x,point_x); retour=1; }else{ alert('ERREUR CONFLIT ENTRE LES CASES : ('+scan_y+', '+pointx+') et ('+scan_x+', '+pointx+');'); } } } } } } } } function changed(nom, pos_x,pos_y){ /* Cette fonction sert quand on change manuellement les valeurs elle récupère la valeur changée et l'envoi à la fonction check
  • /
eval("a=document.getElementById('"+pos_x+"_"+pos_y+"').value"); eval(nom+".check("+pos_x+","+pos_y+",'"+a+"')"); } /* (médiocre) Exemple d'utilisation
  • /
a=new Array(4); a[0]='ang'; a[1]='sue'; a[2]='dan'; a[3]='nor'; a[4]='all'; a[5]='1'; a[6]='2'; a[7]='3'; a[8]='4'; a[9]='5'; a[10]='rou'; a[11]='ver'; a[12]='ble'; a[13]='jau'; a[14]='bla'; a[15]='chi'; a[16]='ois'; a[17]='cha'; a[18]='che'; a[19]='poi'; a[20]='thé'; a[21]='caf'; a[22]='lai'; a[23]='bie'; a[24]='eau'; a[25]='pal'; a[26]='dun'; a[27]='mal'; a[28]='win'; a[29]='rot'; //pour avoir la fonction changed il faut leur mettre le même nom.... /* Pour plus de vitesse et de facilitée, un duplicat des cases affichés est fait en ram... ( dans this.tableau)
  • /
einstein=new Logigramme('einstein',5,a); einstein.indices('Le Britannique habite dans une maison rouge.','Le Suédois possède un chien.','Le Danois boit du thé.','La maison verte est immédiatement à gauche de la maison blanche.','Le propriétaire de la maison verte boit du café.','La personne qui fume des cigares de marque Pall Mall élève des oiseaux.','Le propriétaire de la maison jaune fume des Dunhill.',"L'homme qui vit dans la maison du milieu boit du lait.','Le Norvégien habite dans la première maison.","L'homme qui fume des Rothmans demeure dans la maison située à côté de celui qui garde des chats.","L'homme qui possède des chevaux habite à côté de celui qui fume des Dunhill.","Le propriétaire qui fume des malboros boit de la bière.","L'Allemand fume des Winfield.","Le Norvégien habite à côté de la maison bleue.","Le voisin de l'homme qui fume des Rothmans, boit de l'eau."); </script> <br /> À qui appartient le poisson? </p> </body> </html>

Codes Sources

A voir également

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.