[Algorithmique] Problème lors d'une recherche
stombaker
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
stombaker Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
stombaker Messages postés 4 Date d'inscription Statut Membre Dernière intervention -
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) :
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.
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:
- [Algorithmique] Problème lors d'une recherche
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Comment faire une recherche à partir d'une photo - Guide
- Je recherche une chanson - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
- Probleme recherche chaine tv tcl - Forum Box et Streaming vidéo