JeuWeb - Crée ton jeu par navigateur
Problème Pathfinding A*, mauvais chemin - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Problème Pathfinding A*, mauvais chemin (/showthread.php?tid=3056)

Pages : 1 2 3 4 5


RE: Problème Pathfinding A*, mauvais chemin - Melimelo - 21-09-2008

http://www.creajeu{point car lien mort}net/forum/viewtopic.php?id=312

Ce que je trouve très drôle c'est qu'il est vraiment mieux traiter ici Big Grin


RE: Problème Pathfinding A*, mauvais chemin - Plume - 21-09-2008

HS déplacé. D'une, ce n'est pas le sujet du fil. De deux, ce genre de trollage n'amènera à rien. De trois, nous étions déjà au courant et nous savons pertinemment qu'il se prononce de manière infondée. CreaJeu n'a aucune prétention face à JeuWeb dans l'immédiat. Merci de ne pas lancer le débat.

@tchaOo°


RE: Problème Pathfinding A*, mauvais chemin - Sephi-Chan - 21-09-2008

Je plussoie le monsieur. Le comportement de Raitosan a été stupide mais ce n'est pas une raison pour en faire autant.

JeuWeb ne doit pas être opposé à Creajeu. Si les communautés se tirent entre les pattes, ça ne peut être que néfaste pour les membres et pour la cause que nous soutenons tous : les jeux par navigateur.

La concurrence, c'est bien, mais il ne faut pas que ça dégénère.


Sephi-Chan


RE: Problème Pathfinding A*, mauvais chemin - Zamentur - 21-09-2008

Donc dans ce tuto on vois que le résultat n'est pas le chemin le plus court si on utilise la diagonale.
http://www.siteduzero.com/tutoriel-3-34333-le-pathfinding-avec-a.html

Donc pour l'optimisation dont j'ai parlé:
A chaque ajout de case au chemin
Vérifier qu'il n'y a pas de case adjacente en dehors de la précédente, qui soit contenue dans le chemin
Si c'est le cas -> on supprime les cases enregistré en plus

Et ainsi on obtient un des plus court chemin.


Après je pense surtout qu'il faut s'interroger sur le fait d'avoir le plus court chemin sur un grand nombre d'obstacle. Pour moi ce n'est pas réaliste, car bien souvent on fait des détours en allant dans un endroit qui est potentiellement le meilleur.
Sans compter que pour trouver le véritable plus court chemin c'est très couteux et donc inadapté. Même les jeux installé ne le font pas!


RE: Problème Pathfinding A*, mauvais chemin - jo_link_noir - 21-09-2008

preso, je trouve que c'est réalisable et pas spécialement si coûteux, en temps en tout cas, j'ai pas tester en ressource serveur. On considère bien sur qu'on cherche pas un chemin sur 100.000 cases, faut pas être fous non plus :-°

Code PHP :
<?php
class Pathfinding
{
//coordonnée x du joueur 1
private $x;
//coordonnée y du joueur 1
private $y;
//coordonnée x du joueur 2
private $x2;
//coordonnée y du joueur 2
private $y2;
//pa disponible par le joueur
private $pa;
//le cout du terrain
private $terrain;

//le parcours le moins couteux qui à été trouver
private $parcours='';
//le cout du parcours trouver
private $cout=0;

//liste du cout le moins élever pour un chemin sur une case (case1=>cout, case2=>cout....)
private $case_cout = array();
//pa restant pour le parcours le moins couteux
private $pa_reste = 0;
//facultatif, sers à compter le nombre de boucle effectuer pour trouver un résultat
private $compteur = 0;

/*cré le parcours le moins couteux en pa
@param (int) $x
@parma (int) $y
@param (int) $x2
@parma (int) $y2
@parma (int) $pa
@parma (array) $terrain (forme : [x][y]=>cout, ....)
@return true si un parcours est trouver, sinon false*/
public function __construct($x, $y, $x2, $y2 ,$pa ,$terrain)
{
//la variable time est à suprimer ainsi que le echo et la fonction p
//(c'est juste pour afficher les resultat rapidement...
//on peut le faire à l'exterieur de la fonction !)
//la fonction p ressemble à ça :
//function p($a){echo '<pre>'print_r($a);echo '</pre>'};
$time=microtime(true);
//les cases de départ et d'arrivées sont les même : on stop
if($x === $x2 AND $y === $y2)
{
return
false;
}
$this->x = $x;
$this->y = $y;
$this->x2 = $x2;
$this->y2 = $y2;
$this->pa = $pa;
$this->terrain = $terrain;

//on va rechercher le chemin le moins couteux
$this->chemin_plus_court("$x,$y", $pa);
$parcours=$this->chemin($x, $y, $pa);
$time=microtime(true)-$time;
echo
'<br />pathfinding : '.$this->compteur()."
boucle effetuer en "
.($time*1000)." ms
(<strong>parcours(x:
$x, y:$y, x2:$x2, y2:$y2, pa:$pa)</strong>)";
echo
'parcours avec un cout de <strong>'.$this->cout.'</strong> pa';
p($this->parcours());
p($this->pa());
p($this->cout_parcours());
return
$parcours;
}

/*récupère les case adjacentes à la case et les renvoies dans un ordre précis
(la case la plus près du point d'arriver à la plus éloignée)
@param (int) $x
@parma (int) $y
@return (array) case adjacente*/
public function adjacente($x, $y)
{
//point d'arriver à gauche mi par defaut
//(les autre point seront situés soit avant, soit après)
$cases_adjacentes = array(
array(
$x-1, $y)
);

//point d'arriver à droite
if($x-$this->x2 < 0):
array_unshift($cases_adjacentes, array($x+1, $y));
else:
$cases_adjacentes[] = array($x+1, $y);
endif;

//point d'arriver en haut
if($y-$this->y2 > 0):
array_unshift($cases_adjacentes, array($x, $y-1));
else:
$cases_adjacentes[] = array($x, $y-1);
endif;

//point d'arriver en bas
if($y-$this->y2 < 0):
array_unshift($cases_adjacentes, array($x, $y+1));
else:
$cases_adjacentes[] = array($x, $y+1);
endif;

//point d'arriver en bas à gauche
if($x-$this->x2 > 0 AND $y-$this->y2 < 0):
array_unshift($cases_adjacentes, array($x-1, $y+1));
else:
$cases_adjacentes[] = array($x-1, $y+1);
endif;

//point d'arriver en bas à droite
if($x-$this->x2 < 0 AND $y-$this->y2 < 0):
array_unshift($cases_adjacentes, array($x+1, $y+1));
else:
$cases_adjacentes[] = array($x+1, $y+1);
endif;

//point d'arriver en haut à gauche
if($x-$this->x2 > 0 AND $y-$this->y2 > 0):
array_unshift($cases_adjacentes, array($x-1, $y-1));
else:
$cases_adjacentes[] = array($x-1, $y-1);
endif;

//point d'arriver en haut à droite
if($x-$this->x2 < 0 AND $y-$this->y2 > 0):
array_unshift($cases_adjacentes, array($x+1, $y-1));
else:
$cases_adjacentes[] = array($x+1, $y-1);
endif;

return
$cases_adjacentes;
}

/*calcule la distance entre 2 points (en abslu)
@param (int) $x
@parma (int) $y
@param (int) $x2
@parma (int) $y2
@return (int) distance entre les 2 coordonnées (en case)*/
public function distance($x,$y)
{
$distance = abs($x - $this->x2) + abs($y - $this->y2);
return
$distance;
}

/*élimine les cases inaccessiblent du au manque de PA ou du à
l'infranchisement d'un obstacle
@param (int) $x
@parma (int) $y
@parma (int) $pa
@return (array) case adjacente accessible (forme x,y,[cout])*/
public function accessible($x,$y,$pa)
{
//la case d'arriver est déjà atteinte, pas la peine de continuer
if($x!=$this->x2 OR $y!=$this->y2)
{
$case_accessible=array();
$case_adjacentes = $this->adjacente($x,$y);
foreach(
$case_adjacentes as $case)
{
//si le terrain n'est pas définit, il est infranchissable
list($x,$y)=$case;
if(isset(
$this->terrain[$x][$y]))
{
//vérifi si le nombre de pa sera suffisament élever
//pour atteindre l'arrivée à partir de la case
//(cout_case + distance -*1)
if($this->terrain[$x][$y] + $this->distance($case[0],$case[1]) - 1 <= $pa)
{
$case_accessible["$x,$y"] = $this->terrain[$x][$y];
}
}
}
return
$case_accessible;
}
return array();
}

/*insere le chemin le moins coûteu en pa dans la variable
$this->parcours, et les pa utilisais dans $this->cout
@param (int) $x case en court de traitement (position x)
@parma (int) $y idem mais pour la position y
@parma (int) $pa qui reste à partir de la case traiter
@fonc (string) $s representatif des case visiter (x,y;x,y...)
@fonc (int) $cout reprentatif du cout des cases déjà parcouru
@return true si un parcours est trouver*/
public function chemin($x, $y, $pa, $s='', $cout=0)
{
//définit les cases adjacentes est accessible
$cases = $this->accessible($x, $y, $pa);

if(
$cases != array())
{
$return=false;
//création du chemin (on parcours dans une boucle
//les case adjacente accessible)
foreach($cases as $key=>$cout_case)
{
$this->compteur();
list(
$xx,$yy)=explode(',',$key);
//un chemin est trouver création du tableau de parcours
//(forme : [0]=>tableau des cases, [1]=>tableau du cout)
//et stop la continuité de la recherche de parcours pour ce terrain
if($xx==$this->x2 AND $yy==$this->y2)
{
//le chemin trouver et le plus court
if($this->parcours_plus_court($pa) === true)
{
//on enregistre le parcours et on
//arrete la boucle du foreach
$this->parcours = $s.$key;
$this->cout = $cout+$cout_case;
return
true;
}
}
//elimine les chemins qui dépasse les pa du chemin trouver
//et ceux qui viennent sur des cases avec un chemin eyant
//moins de pa utiliser (pa - distance)
elseif($this->chemin_plus_court($key, $pa) === true AND $this->pa_reste < $pa - $this->distance($xx,$yy))
{
//traite la case suivante en rapellant la fonction chemin
if($this->chemin($xx, $yy, $pa-$cout_case, "$s$key;", $cout+$cout_case) === true)
{
$return = true;
}
}
}
return
$return;
}
return
false;
}

/*vérifie si les pa restant sont plus élever que ceux enregistrer,
retourne true et sauvegarde les pa dans ce cas, false dans le cas contraire
@param (int) $pa_reste
@static (int) $reste
@return (bolen) true si $pa_reste>$reste false dans le cas contraire*/
public function parcours_plus_court($pa_reste)
{
if(
$pa_reste > $this->pa_reste)
{
$this->pa_reste = $pa_reste;
return
true;
}
return
false;
}

/*vérifie si les pa restant dans une case sont plus élever que ceux enregistrer,
retourne true et sauvegarde les pa dans ce cas,
false dans le cas contraire et true si la case n'avais pas été enregistrer
@param (int) $pa_reste
@static (array) $reste du maximum de pa q'un chemin a eu sur cette une case (forme [x,y]=>pa_reste)
@return (bolen) true si $pa_reste>$reste false dans le cas contraire*/
public function chemin_plus_court($key, $pa_reste)
{
if(isset(
$this->case_cout[$key]))
{
if(
$pa_reste > $this->case_cout[$key])
{
$this->case_cout[$key] = $pa_reste;
return
true;
}
return
false;
}
$this->case_cout[$key] = $pa_reste;
return
true;
}

public function
compteur()
{
return
$this->compteur++;
}

//retourne le parcours forme ([0]=>"x,y", [1]=>"x,y"....)
public function parcours()
{
return
explode(';', $this->parcours);
}

//retourne les pa restant
public function pa()
{
return
$this->pa-$this->cout;
}

//retourne les pa utiliser
public function pa_utiliser()
{
return
$this->cout;
}

//retourne le cout du parcours ([x,y]=>cout
public function cout_parcours()
{
$cout = array();
foreach(
$this->parcours() as $case)
{
list(
$x,$y)=explode(',',$case);
$cout[$case] = $this->terrain[$x][$y];
}
return
$cout;
}
}
?>
et le fichier de test fait bien à l'arrache
Code PHP :
<?php
error_reporting
(E_ALL);
$page="";
$a = array();
$page.="<table id='plateau'>";

$tableau=array();
$terrain=array();
$taillex=20;//nombre de case en largeur
$tailley=20;//nombre de case en hauteur
$taillecase=40;//taille des case en px
$i=0;
while(
$i<$taillex)
{
$y=-$i*$taillecase;
//$page.='<tr>';
$z=0;
while(
$z<$tailley)
{
$x=$z*$taillecase;
$j=$i*$taillex+$z+1;
$k=-($j-1)*$taillecase+$i*$taillecase;
$s="plaine";
if(
$j=== 43 OR $j===44 OR $j===47 OR $j===48 OR $j===53 OR $j===54 OR $j===57 OR $j===58){
$s="lac";
}
//$page.='<td id="a'.$j.'" class="'.$s.'" onclick="selectId('.$j.')">'.$j.'</td>';

$tableau[$j]=$j;
$terrain[$z+1][$i+1]=mt_rand(1,3);
$a["x"]["s"][$i][]=$j;
$a["x"]["x"][$i][]=$x;
$a["y"]["s"][]=$j;
$a["y"]["y"][]=$k;

$z++;
}
//$page.='</tr>';
$i++;
}
$page.="</table>";




/*Pathfinding pour rechercher le chemin le moins couteux
il � l'air de ressemblais �
Algorithme de Dantzig-Ford (http://fr.wikipedia.org/wiki/Algorithme_de_Dantzig-Ford)
et p-t plus, celui de belmon-ford mais ce script � �t� fait avant toute recherche
d'algo de pathfinding, sauf une petite connaissance du A* et aussi celui Algorithme
de parcours en profondeur (http://fr.wikipedia.org/wiki/Algorithme_de_parcours_en_profondeur)

PS : $terrain correspond au PA que coute la case (il peuvent �tre n�gatif/positif ou �gal � 0.
Une valeur n�gaif va augmenter les PA quand on passe la case)
*/



function __autoload($class_name) {
require_once
"_class/class_pathfinding.php";
}

function
p($s)
{
echo
'<pre>';
print_r($s);
echo
'</pre>';
}

/*cr�ation du Pathfinding ou Recherche de chemin
*/
//on affiche le tableau avec point d�part et point arriver
foreach($tableau as $case)
{
$y=FLOOR(($case-1)/$taillex)+1;
$x=$case-($y-1)*$taillex;
$tmp="$x,$y";
if(
$case==64){$tmp='<strong style="color:red;font-size:'.($taillecase/20).'em;">X<sub>1</sub></strong>';}
if(
$case==124){$tmp='<strong style="color:red;font-size:'.($taillecase/20).'em;">X<sub>2</sub></strong>';}
if(
$tmp=='2,1'){$tmp='<strong style="color:green;font-size:'.($taillecase/20).'em;">X<sub>1</sub></strong>';}
if(
$tmp=='5,7'){$tmp='<strong style="color:green;font-size:'.($taillecase/20).'em;">X<sub>2</sub></strong>';}
if(
$tmp=='8,15'){$tmp='<strong style="color:blue;font-size:'.($taillecase/20).'em;">X<sub>2</sub></strong>';}
if(
$tmp=='20,3'){$tmp='<strong style="color:blue;font-size:'.($taillecase/20).'em;">X<sub>2</sub></strong>';}
$page.="<div id='a$case'>$tmp</div>";
}

//pour tester su un terrain fixe avec des obstacle...
//$terrain=unserialize('a:20:{i:1;a:20:{i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:3;i:5;i:2;i:6;i:2;i:7;
i:3;i:8;i:1;i:9;i:3;i:10;i:1;i:11;i:1;i:12;i:1;i:13;i:1;i:14;i:1;i:15;i:3;i:16;i:1;i:17;i:2;i:18;
i:2;i:19;i:2;i:20;i:2;}i:2;a:20:{i:1;i:3;i:2;i:1;i:3;i:2;i:4;i:3;i:5;i:2;i:6;i:2;i:7;i:3;i:8;i:3;
i:9;i:3;i:10;i:3;i:11;i:2;i:12;i:1;i:13;i:3;i:14;i:3;i:15;i:1;i:16;i:1;i:17;i:1;i:18;i:2;i:19;
i:1;i:20;i:1;}i:3;a:20:{i:1;i:2;i:2;i:1;i:3;i:2;i:4;i:3;i:5;i:3;i:6;i:1;i:7;i:3;i:8;i:3;
i:9;i:2;i:10;i:3;i:11;i:1;i:12;i:1;i:13;i:3;i:14;i:1;i:15;i:1;i:16;i:3;i:17;i:3;i:18;i:1;i:19;
i:2;i:20;i:3;}i:4;a:20:{i:1;i:1;i:2;i:1;i:3;i:3;i:4;i:3;i:5;i:3;i:6;i:2;i:7;i:1;i:8;i:2;i:9;
i:3;i:10;i:1;i:11;i:1;i:12;i:3;i:13;i:3;i:14;i:3;i:15;i:2;i:16;i:3;i:17;i:1;i:18;i:1;i:19;i:1;
i:20;i:2;}i:5;a:20:{i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:3;i:5;i:1;i:6;i:1;i:7;i:3;i:8;i:3;i:9;i:3;i:10;
i:2;i:11;i:2;i:12;i:2;i:13;i:1;i:14;i:1;i:15;i:2;i:16;i:3;i:17;i:1;i:18;i:2;i:19;i:3;i:20;i:1;}i:6;
a:20:{i:1;i:2;i:2;i:2;i:3;i:1;i:4;i:2;i:5;i:3;i:6;i:1;i:7;i:3;i:8;i:3;i:9;i:2;i:10;i:3;i:11;i:3;i:12;
i:2;i:13;i:2;i:14;i:3;i:15;i:3;i:16;i:2;i:17;i:3;i:18;i:2;i:19;i:2;i:20;i:2;}i:7;a:20:{i:1;i:1;
i:2;i:3;i:3;i:1;i:4;i:3;i:5;i:1;i:6;i:3;i:7;i:1;i:8;i:2;i:9;i:1;i:10;i:1;i:11;i:2;i:12;i:2;i:13;i:1;
i:14;i:2;i:15;i:1;i:16;i:3;i:17;i:2;i:18;i:1;i:19;i:3;i:20;i:3;}i:8;a:20:{i:1;i:3;i:2;i:1;
i:3;i:2;i:4;i:2;i:5;i:3;i:6;i:1;i:7;i:1;i:8;i:2;i:9;i:2;i:10;i:1;i:11;i:3;i:12;i:1;i:13;i:1;i:14;i:3;
i:15;i:1;i:16;i:1;i:17;i:3;i:18;i:1;i:19;i:1;i:20;i:1;}i:9;a:20:{i:1;i:1;i:2;i:2;i:3;i:1;i:4;
i:2;i:5;i:1;i:6;i:1;i:7;i:1;i:8;i:3;i:9;i:1;i:10;i:1;i:11;i:1;i:12;i:2;i:13;i:2;i:14;i:2;i:15;i:1;i:16;
i:2;i:17;i:2;i:18;i:3;i:19;i:2;i:20;i:1;}i:10;a:20:{i:1;i:2;i:2;i:2;i:3;i:3;i:4;i:1;i:5;i:1;i:6;i:1;
i:7;i:2;i:8;i:1;i:9;i:3;i:10;i:3;i:11;i:2;i:12;i:1;i:13;i:1;i:14;i:3;i:15;i:3;i:16;i:3;i:17;i:1;i:18;
i:1;i:19;i:2;i:20;i:1;}i:11;a:20:{i:1;i:1;i:2;i:3;i:3;i:2;i:4;i:1;i:5;i:3;i:6;i:1;i:7;i:1;i:8;
i:1;i:9;i:2;i:10;i:3;i:11;i:3;i:12;i:1;i:13;i:1;i:14;i:2;i:15;i:3;i:16;i:1;i:17;i:2;i:18;i:3;i:19;
i:2;i:20;i:2;}i:12;a:20:{i:1;i:3;i:2;i:2;i:3;i:3;i:4;i:3;i:5;i:3;i:6;i:1;i:7;i:2;i:8;i:1;i:9;i:1;
i:10;i:1;i:11;i:3;i:12;i:3;i:13;i:3;i:14;i:2;i:15;i:3;i:16;i:2;i:17;i:1;i:18;i:2;i:19;i:2;i:20;
i:3;}i:13;a:20:{i:1;i:2;i:2;i:2;i:3;i:3;i:4;i:2;i:5;i:3;i:6;i:3;i:7;i:3;i:8;i:3;i:9;i:3;i:10;
i:2;i:11;i:2;i:12;i:1;i:13;i:2;i:14;i:3;i:15;i:3;i:16;i:1;i:17;i:3;i:18;i:3;i:19;i:2;i:20;i:2;}i:14;
a:20:{i:1;i:2;i:2;i:1;i:3;i:3;i:4;i:2;i:5;i:3;i:6;i:1;i:7;i:2;i:8;i:1;i:9;i:1;i:10;i:1;i:11;i:1;i:12;
i:1;i:13;i:1;i:14;i:3;i:15;i:2;i:16;i:1;i:17;i:3;i:18;i:3;i:19;i:3;i:20;i:1;}i:15;a:20:{i:1;i:3;i:2;
i:1;i:3;i:2;i:4;i:1;i:5;i:1;i:6;i:3;i:7;i:3;i:8;i:3;i:9;i:3;i:10;i:2;i:11;i:1;i:12;i:1;i:13;i:2;i:14;
i:3;i:15;i:3;i:16;i:2;i:17;i:1;i:18;i:3;i:19;i:3;i:20;i:2;}i:16;a:20:{i:1;i:3;i:2;
i:1;i:3;i:1;i:4;i:3;i:5;i:3;i:6;i:2;i:7;i:3;i:8;i:1;i:9;i:3;i:10;i:1;i:11;i:2;i:12;i:1;i:13;i:1;i:14;
i:1;i:15;i:1;i:16;i:3;i:17;i:2;i:18;i:2;i:19;i:1;i:20;i:2;}i:17;a:20:{i:1;i:3;i:2;i:3;i:3;
i:1;i:4;i:2;i:5;i:1;i:6;i:2;i:7;i:2;i:8;i:2;i:9;i:1;i:10;i:2;i:11;i:3;i:12;i:2;i:13;i:2;i:14;i:3;
i:15;i:2;i:16;i:3;i:17;i:1;i:18;i:2;i:19;i:2;i:20;i:2;}i:18;a:20:{i:1;i:2;i:2;i:2;i:3;i:2;i:4;i:1;
i:5;i:1;i:6;i:1;i:7;i:1;i:8;i:1;i:9;i:2;i:10;i:3;i:11;i:1;i:12;i:3;i:13;i:3;i:14;i:2;i:15;i:1;i:16;i:1;
i:17;i:3;i:18;i:2;i:19;i:1;i:20;i:1;}i:19;a:20:{i:1;i:3;i:2;i:1;i:3;i:2;i:4;i:3;i:5;i:2;i:6;i:2;i:7;
i:3;i:8;i:1;i:9;i:1;i:10;i:2;i:11;i:2;i:12;i:2;i:13;i:1;i:14;i:3;i:15;i:1;i:16;i:1;i:17;i:2;i:18;i:3;
i:19;i:3;i:20;i:3;}i:20;a:20:{i:1;i:1;i:2;i:1;i:3;i:1;i:4;i:2;i:5;i:2;i:6;i:3;i:7;
i:2;i:8;i:3;i:9;i:3;i:10;i:2;i:11;i:1;i:12;i:1;i:13;i:1;i:14;i:3;i:15;i:1;i:16;i:2;i:17;i:2;i:18;
i:2;i:19;i:3;i:20;i:2;}}');

new Pathfinding(2,2,10,10,50,$terrain);
new Pathfinding(4,4,4,5,6,$terrain);
new Pathfinding(4,4,4,7,6,$terrain);
new Pathfinding(8,15,20,3,40,$terrain);
new Pathfinding(2,1,5,7,12,$terrain);
new Pathfinding(2,2,2,2,12,$terrain);




$s="";
$t=array();
$l=array();
//on "range" les variable x dans un ordre plus facile � traiter
foreach($a["x"] as $key=>$valuz)
{
if($key=="s")
{
foreach($valuz as $value)
{
foreach($value as $cle=>$i)
{
$t[$cle][]=$i;
}
}
}
else
{
foreach($valuz as $cle=>$value)
{
foreach($value as $cle=>$i)
{
$l[$cle][]=$i;
}
}
}
}

//on affiche le style par raport au chaque id de chaque ligne (position droit)
foreach($t as $key=>$valu)
{
$s.="#a".implode(",#a",$valu)." {\tleft:{$l[$key][0]}px;}";
}

$t=array();
$l=array();
//on "range" les variable y dans un ordre plus facile � traiter
foreach($a["y"] as $key=>$valuz)
{
if($key=="s")
{
foreach($valuz as $value)
{
$t[]=$value;
}
}
else
{
foreach($valuz as $value)
{
$l[]=$value;
}
}
}

//on affiche le style par raport au chaque id de chaque ligne (position bas)
foreach($t as $key=>$valu)
{
$s.="#a".$valu." {\ttop:{$l[$key]}px;}";
}

echo '
<style>div{position:relative;width:'.($taillecase-1).'px;height:'.
($taillecase-1).'
px;font-size:'.($taillecase/pow($taillecase/10,2)*$taillecase/7).'
px;border-right:1px solid black;border-top:1px solid black;}'.$s.'</style>'.$page;
?>

ouai, c'est assez moche mais bon, ça marche... pour un premier script en POO j'en suis quand même assez content Smile


RE: Problème Pathfinding A*, mauvais chemin - Cartman34 - 21-09-2008

A mon avis c'est très lourd pour pas grand chose...j'espère que ca gère les obstacles sinon c'est pas terrible.
Même un script gérant les obstacle pourrait être bien plus court car il ne s'agit que de quelques excceptiosn et calculs en plus sur une 30aines de lignes (à tout casser)


RE: Problème Pathfinding A*, mauvais chemin - jo_link_noir - 21-09-2008

Encore heureux qu'il gère les obstacles, sinon c'est trop facile est vraiment sans intérêt. Il peut aussi faire des cases avec un coût négatif, position ou nul (mais ça va pas beaucoup servir XD) et je pense qu'il reste assez souple, mais ça n'engage que moi. Bon après c'est vrai qu'il est peut-être lourd et je n'ai pas de script pour le comparer.
Après si on vire tout ce qui est inutile dans le constructeur est tout les if/else dans la fonction case_adjacente il n'est pas si grand que ça au final.

Pour info j'en avait faire un autre d'environ cinquante lignes mais j'avais une erreur de mémoire dépasser... alors j'ai garder celui là.