Voici un script que j'ai créé pour calculer le meilleur chemin partant d'une case X jusqu'à une case Y.
Pour pouvoir l'utiliser, vous aurez besoin de mes 2 fonctions envoyées précédemment (voir le topic https://cadernis.com/d/623-[script]-détection-du-client-d-et-initialisation-des-cases)
Voici donc la bête :
Cliquez pour révéler
Cliquez pour masquer
#include <Array.au3>
#include <String.au3>
#include "__AddArray.au3"
#include "_detect_client.au3"
#include "../variables/_cases.au3"
_detect_client()
_init_cases()
meilleur_chemin(128, 256)
Func meilleur_chemin($iDebut, $iFin)
$iDebut_Pixels_X = $iCases[$iDebut][0]
$iDebut_Pixels_Y = $iCases[$iDebut][1]
$iFin_Pixels_X = $iCases[$iFin][0]
$iFin_Pixels_Y = $iCases[$iFin][1]
$iActuel_X = $iDebut_Pixels_X
$iActuel_Y = $iDebut_Pixels_Y
Dim $aChemin_Plus_Court[1] = [0]
Do
$iDebut_Pixels_X = $iCases[$iDebut][0]
$iDebut_Pixels_Y = $iCases[$iDebut][1]
$sCases_a_proximite = $iCases[$iDebut][7]
$aCases_a_proximite = _StringExplode($sCases_a_proximite, "|")
$iCase_Plus_Bas = ""
; -------------------------- Distance X ----------------------------;
Dim $aDistances_X[1] = [0]
For $i = 0 To UBound($aCases_a_proximite) - 1
If $iCases[$aCases_a_proximite[$i]][0] > $iFin_Pixels_X Then
_ArrayAdd($aDistances_X, $iCases[$aCases_a_proximite[$i]][0] - $iFin_Pixels_X)
Else
_ArrayAdd($aDistances_X, $iFin_Pixels_X - $iCases[$aCases_a_proximite[$i]][0])
EndIf
Next
_ArrayDelete($aDistances_X, 0)
; ------------------------------------------------------------------; Distance X
; -------------------------- Distance Y ----------------------------;
Dim $aDistances_Y[1] = [0]
For $i = 0 To UBound($aCases_a_proximite) - 1
If $iCases[$aCases_a_proximite[$i]][1] > $iFin_Pixels_Y Then
_ArrayAdd($aDistances_Y, $iCases[$aCases_a_proximite[$i]][1] - $iFin_Pixels_Y)
Else
_ArrayAdd($aDistances_Y, $iFin_Pixels_Y - $iCases[$aCases_a_proximite[$i]][1])
EndIf
Next
_ArrayDelete($aDistances_Y, 0)
; ------------------------------------------------------------------; Distance Y
; -------------------------- Distance Totale ----------------------------;
Dim $aDistances_Totales[1] = [0]
Local $iPlus_Bas = 1000
For $i = 0 To UBound($aCases_a_proximite) - 1
$iDistance_Totale = $aDistances_X[$i] + $aDistances_Y[$i]
_ArrayAdd($aDistances_Totales, $iDistance_Totale)
If $iDistance_Totale < $iPlus_Bas Then
$iCase_Plus_Bas = $aCases_a_proximite[$i]
$iPlus_Bas = $iDistance_Totale
EndIf
Next
_ArrayDelete($aDistances_Totales, 0)
; ------------------------------------------------------------------; Distance Totale
$iActuel_X += $iCases[$iCase_Plus_Bas][0] - $iCases[$iDebut][0]
$iActuel_Y += $iCases[$iFin][1] - $iCases[$iCase_Plus_Bas][1]
_ArrayAdd($aChemin_Plus_Court, $iCase_Plus_Bas)
ConsoleWrite("case de départ => " & $iDebut & @CR & _
"case d'arrivée => " & $iFin & @CR & _
"$iX au début = " & $iDebut_Pixels_X & " / $iX Actuel = " & $iActuel_X & " / $iX Ciblé = " & $iFin_Pixels_X & @CR & _
"$iY au début = " & $iDebut_Pixels_Y & " / $iY Actuel = " & $iActuel_Y & " / $iY Ciblé = " & $iFin_Pixels_Y & @CR & _
"case plus proche : " & $iCase_Plus_Bas & "/ x => " & $iCases[$iCase_Plus_Bas][0] & " / y => " & $iCases[$iCase_Plus_Bas][1] & @CR)
$iDebut = $iCase_Plus_Bas
If $iCase_Plus_Bas = $iFin Then ExitLoop
Until $iActuel_Y = $iFin_Pixels_Y And $iActuel_X = $iFin_Pixels_X
_ArrayDisplay($aChemin_Plus_Court)
EndFunc
A personnaliser bien sûr selon vos besoins.
Si vous rencontrez un bug, un souci d'intégration, etc, je suis à votre disposition ! :D
EDIT : Cette fonction retourne un tableau avec chaque case à parcourir pour arriver jusqu'à la case voulue, en prenant le chemin le plus court en pixels.