[Algorithmique] Problème lors d'une recherche

Fermé
stombaker Messages postés 4 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 29 novembre 2010 - 28 nov. 2010 à 21:02
stombaker Messages postés 4 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 29 novembre 2010 - 29 nov. 2010 à 18:30
Bonjour,

Je suis actuellement en train de programmer un bomberman en javascript avec canvas.

Je suis en ce moment en train d'effectuer une Intelligence Artificielle (IA) afin de commander les bots. Mon premier objectif est de faire en sorte qu'il fuit quand il est dans une zone dangereuse (susceptible d'être victime d'une explosion).
Mais à un moment, ça bloque, il ne se déplace plus.

Voici le code (peut-être préférable de le copier dans un logiciel de traitement de texte) :

/*
	plateauD : tableau 2D qui enregistre les positions dangereuses.
	plateauC : tableau 2D qui enregistre les collisions.
	Ces deux tableaux sont mis à jour et ne sont pas la cause du problème.
*/
	this.choisirDestination2 = function()
	{
		var caseX = Math.floor((this.posX + this.tailleX/2)/20);
		var caseY = Math.floor((this.posY + this.tailleY/2)/20);
		
		if (plateauD[caseX][caseY]) // On est sur une case dangereuse. On se met à l'abris.
		{
			var tabX = new Array(), tabY = new Array();
			var tabParent = new Array(); // Un tableau indiquant la ligne de la case parente.
			var tabN = new Array(); // Indique le nombre de cases qu'il faut pour se déplacer.
			var Ldestination; // Ligne des tableaux de la destination finale.
			
			tabX.push(caseX); tabY.push(caseY); tabParent.push(null); tabN.push(0); // On enregistre les données de la case actuelle.
			
			var caseOK = false, caseImpossible = false, i, j, k=1, blocages, gauche, droite, haut, bas;
			while (!caseOK && !caseImpossible)
			{
				for (i = 0 ; i < tabX.length ; i++)
				{
					if (tabN[i] == k-1)
					{
						gauche = true; droite = true; haut = true; bas = true;
						for (j = 0 ; j < tabX.length ; j++)
						{
							if (tabX[i]-1 == tabX[j] && tabY[i] == tabY[j] || tabX[i]-1 < 0 || plateauC[tabX[i]-1][tabY[i]])
								gauche = false;
							if (tabX[i]+1 == tabX[j] && tabY[i] == tabY[j] || tabX[i]+1 > 24 || plateauC[tabX[i]+1][tabY[i]])
								droite = false;
							if (tabY[i]-1 == tabY[j] && tabX[i] == tabX[j] || tabY[i]-1 < 0 || plateauC[tabX[i]][tabY[i]-1])
								haut = false;
							if (tabY[i]+1 == tabY[j] && tabX[i] == tabX[j] || tabY[i]+1 > 24 || plateauC[tabX[i]][tabY[i]+1])
								bas = false;
						}
						if (gauche)
						{
							tabX.push(tabX[i]-1); tabY.push(tabY[i]); tabParent.push(i); tabN.push(k);
							if (!plateauD[tabX[i]-1][tabY[i]] && !caseOK)
							{
								Ldestination = tabX.length-1;
								caseOK = true;
								break;
							}
						}
						if (droite)
						{
							tabX.push(tabX[i]+1); tabY.push(tabY[i]); tabParent.push(i); tabN.push(k);
							if (!plateauD[tabX[i]+1][tabY[i]] && !caseOK)
							{
								Ldestination = tabX.length-1;
								caseOK = true;
								break;
							}
						}
						if (haut)
						{
							tabX.push(tabX[i]); tabY.push(tabY[i]-1); tabParent.push(i); tabN.push(k);
							if (!plateauD[tabY[i]][tabY[i]-1] && !caseOK)
							{
								Ldestination = tabX.length-1;
								caseOK = true;
								break;
							}
						}
						if (bas)
						{
							tabX.push(tabX[i]); tabY.push(tabY[i]+1); tabParent.push(i); tabN.push(k);
							if (!plateauD[tabY[i]][tabY[i]+1] && !caseOK)
							{
								Ldestination = tabX.length-1;
								caseOK = true;
								break;
							}
						}
					}
				}
				for (i = 0 ; i < tabN.length ; i++)
				{
					if (tabN[tabN.length-1] != k) // On est entièrement bloqué.
					{
						caseImpossible = true;
						break;
					}
				}
				k++;
			} // Sortie du while.
			
			if (!caseImpossible) // On n'est pas bloqué.
			{
				if (tabN[Ldestination] != 1)
				{
					var parent = tabParent[Ldestination];
					while (tabN[parent] != 1)
					{
						parent = tabParent[parent];
					}
				}
				else
					parent = Ldestination;
				var caseX = tabX[parent], caseY = tabY[parent];
			}
			else // On est bloqué. Pas de coordonnées à donner. On reste où on est.
			{
				this.destinationX = null;
				this.destinationY = null;
				return;
			}
		}
		else
			return;
		
		this.destinationX = caseX*20 + 10;
		this.destinationY = caseY*20 + 10;
	}


J'essaye plusieurs trucs qui améliorent ou détériorent le résultat, mais sans jamais arriver à l'objectif final. :(

Merci de votre aide.
Au revoir.

A voir également:

1 réponse

stombaker Messages postés 4 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 29 novembre 2010
29 nov. 2010 à 18:30
En fait, c'est tout bête, mon problème venait d'une autre fonction.
0