Sortie de boucle prématurée
Bonjour,
J'essaie de programmer un démineur en JS à base d'une table html de 10x10, fonctionnant sur le modèle du démineur windows, à savoir lorsqu'une case est cliquée par un joueur si la case ne contient pas de mine et si la détection du nombre de mines à sa périphérie est =0, les 8 cases adjacentes sont découvertes, c'est l'objet de la fonction uncoverAdjacent().
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
function uncoverAdjacent(tab){
var tableDomTd = document.getElementsByTagName("td");
while(tab.length >0){
var el=tab.pop();
var X=getX(el);
var Y=getY(el);
//boucle sur tous les TD de la grille et on decouvre les cases
//adjacentes de la case dont la valeur nombre de mines est à "0"
for(var i=0;i<=tableDomTd.length;i++){
var Xtd=getX(tableDomTd[i]);
var Ytd=getY(tableDomTd[i]);
var distance=Math.pow((Y-Ytd),2)+Math.pow((X-Xtd),2);
if (distance<=2){
var tdAdjacent=uncoverCase(tableDomTd[i]);
if(getNbMine(Xtd,Ytd)==0)tab.push(tdAdjacent);
alert(tab.length);
}
}
}
} |
cette fonction reçoit en parametre un tableau : "tab" qui contient un élément de type <td>. lorsque le test de la ligne 14 s'effectue "tab" est bien incrémenté et le message alert de la ligne 17 affiche le bon résultat.
Or quelle que soit la valeur de "tab.length", la boucle "while" ne fonctionne pas.
J'aimerais comprendre pourquoi. D'ailleurs quelle que soit l'action j'essaie de réaliser après la sortie de la boucle "for" à la ligne 19, celle-ci est ignorée.
Ainsi un simple alert("hello") n'est pas interprété, alors que le script continue de s'exécuter...
Une interruption que je juge un peu bizarre, pas très subtil observerez-vous,
Pour info voici le code des fonctions appelées :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
function uncoverCase(el){
if (el.className!="uncovered"){
var X=getX(el);
var Y=getY(el);
var nbMines=getNbMine(X,Y);
//var classeEl=el.className;
nouveauTd=document.createElement("td");
nouveauTd.id=el.id;
nouveauTd.className="uncovered";
nouveauTd.style.backgroundColor="cyan";
nouveauTd.innerHTML=nbMines;
el.parentNode.replaceChild(nouveauTd,el);
//alert(nouveauTd.id);
return nouveauTd;
}
//return false;
return el;
//el.style.backgroundColor="cyan";
//el.innerHTML=nbMines;
}
//extrait l'abscisse à partir de l'id
function getX(el){
var idCase = el.id;
var numCase = parseFloat(idCase.substring(4));
var X;
if(numCase<10){X=numCase; return X;}
if(numCase%10==0){X=10; return X;}
X=numCase%10;
return X;
}
//extrait l'ordonnée à partir de l'id
function getY(el){
var idCase = el.id;
var numCase = parseFloat(idCase.substring(4));
var Y;
if(numCase<10){Y=1;return Y};
if(numCase%10==0){Y=Math.floor(numCase/10); return Y}
Y=Math.floor(numCase/10)+1;
return Y;
}
//retourne le nombre de mines autour de la case
function getNbMine(col,lin){
var compteurMine=0;
if (isMine(col-1,lin+1))compteurMine++;
if (isMine(col,lin+1))compteurMine++;
if (isMine(col+1,lin+1))compteurMine++;
if (isMine(col-1,lin))compteurMine++;
if (isMine(col+1,lin))compteurMine++;
if (isMine(col-1,lin-1))compteurMine++;
if (isMine(col,lin-1))compteurMine++;
if (isMine(col+1,lin-1))compteurMine++;
return compteurMine;
}
//retourne true si mine sur la case
function isMine(col,lin){
for (var j=0;j<nbMine;j++){
if ((col==xMines[j])&&(lin==yMines[j])){
// alert(col+" "+lin);
return true;
}
}
return false;
} |
Voila ce que j'ai essayé jusqu'à présent ne fonctionne pas car une notion m'échappe. J'espère que vous comprendrez d'où cette interruption provient.
Merci.