Je suis en train de simplifier, en attendant, voici la fonction coutCase:
EDIT: Finalement simplifier... En fait je ne fait que déplacer du code, ajouter des intermédiaires etc... Je vais directement retranscrire mes fonctions dans une classe où se seras vraiment plus lisible.
function coutCase($xCourrant, $yCourrant, $xFinal, $yFinal, $mode, $coutParent = NULL, $xParent = NULL, $yParent = NULL) {
$couts = array("f" => NULL, "g" => NULL, "h" => NULL);
if($mode <= 3) // Pour les cases carrées
$couts["h"] = (abs($xCourrant-$xFinal)+abs($yCourrant-$yFinal))*10; // Calcul du cout H: distance de Manhattan entre la case courrante et la case finale
else // Pour les cases hexagonales
$couts["h"] = ceil(sqrt(($xCourrant*$xFinal)+($yCourrant*$yFinal)));
if($coutParent !== NULL AND $xParent !== NULL AND $yParent !== NULL) {
$couts["g"] = (($mode == 2) AND (!is_int(($xCourrant-$xParent)/2) OR !is_int(($yCourrant-$yParent)/2))) ? $coutParent["g"] + 14 : $coutParent["g"] + 10; // Calcul du cout G (14 si déplacement en diagonal en mode 2, sinon 10) + cout de déplacement du parent
} else // En théorie appelé seulement pour le calcul de la case départ qui n'as aucun parent
$couts["g"] = 0;
$couts["f"] = $couts["h"] + $couts["g"]; // Calcul du cout total F
return $couts;
}
Et maintenant que je me relis, je ne suis pas très sur de:$couts["h"] = ceil(sqrt(($xCourrant*$xFinal)+($yCourrant*$yFinal)));
EDIT: Finalement simplifier... En fait je ne fait que déplacer du code, ajouter des intermédiaires etc... Je vais directement retranscrire mes fonctions dans une classe où se seras vraiment plus lisible.