Autoit [SCRIPT] Récupérer le meilleur chemin

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#1
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.fr/index.php?threa...-du-client-d-et-initialisation-des-cases.623/)

Voici donc la bête :

Code:
#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.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#2
Ça détecte aussi les obstacles entre ?
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#3
Non, n'oublions pas que c'est de l'AutoIt, et que pour gérer les obstacles, il faudrait définir pour chaque map chaque case obstacle.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#4
Donc, tu l'utilises quand ce script ?
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#5
En fait, je l'ai un peu créé pour le fun :D.
A la base j'ai défini pour chaque case (si tu as essayé mes autres fonctions tu l'as peut-être remarqué) les cases proches.

Mais, si aucune ressource n'est présente sur une case proche, je voulais qu'il trouve la case la plus proche, puis qu'il y aille. En cliquant sur chaque case ok c'est dégueulasse mais bon...
Je ne sais pas à quoi ça servira encore, mais j'ai quand même voulu la poster, je trouve cette fonction intéressante.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#6
Elle pourrait être très utile en combat, mais faudrait gérer les obstacles...
 

Nexty

Membre
Inscrit
4 Février 2012
Messages
14
Reactions
0
#7
Les obstacles peuvent être surement géré avec le mode tactique.
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#8
Y'a pas 50 solutions pour les obstacles : les définir pour chaque map... Tu comprends bien que je laisse libre court aux programmeurs ! :)

Faudrait les définir dans un fichier, par exemple situé dans "maps\-29,-42.ob", qui contiendrait une liste d'obstacles du genre "258,326,124,etc" et ajouter dans notre fonction

Code:
For $iIndexObstacle = 0 To Ubound($listeObstacles) - 1
   If $iCaseCiblee = $listeObstacles[$iIndexObstacle] Then
      $bIsObstacle = True
      ExitLoop
   EndIf
Next
C'est un algorithme de tête, je ne sais pas si ce sera pleinement fonctionnel, mais c'est un départ. A essayer donc pour améliorer.

EDIT : @Nexty, tu as suivi? Je ne recherche jamais ce couleur de pixel, pour une vitesse accrue du bot. Donc mode tactique ou pas...
 

Nexty

Membre
Inscrit
4 Février 2012
Messages
14
Reactions
0
#9
Ok je comprend.

Pour les positions des maps, comment faire pour les connaitre en AutoIt? Car remplir les fichiers d'obstacles à la main risque de prendre une éternité...
Après sa serai simple pour référencer automatiquement les cases obstacles par recherche de couleur lorsque la map est encore inconnue. Puis lorsque une fois la map enregistré et connue suffit d'utiliser le fichier qui contiendrai la liste d'obstacles.
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#10
Euh, ça c'est faisable seulement en combat, mode tactique. Sinon, je vois pas comment.
 
A

Anonymous

Invité
#11
La seule façon de gérer les obstacles serait de lire les D2P en autoit et ainsi se déplacer sur la map et en combat.
 
Inscrit
4 Février 2012
Messages
14
Reactions
0
#12
J'ai trouvé une solution pour la position de la map, il faudrait indiquer la map actuelle au démarrage du bot après celons ses déplacements il saura sur quelle map il se trouve (Encore faut t'il qu'il ne se soit pas perdu^^) donc quel fichier à lire pour connaitre les informations sur les obstacles ou autre et si la map est encore inconnue il les enregistres.
J'ai plein d'idée qui m'arrive à la tête pour mon bot qui rendra ses trajets bien plus performants ainsi que les combats.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#13
Sinon y a la commande /mapid qui renvoie le numéro de la map. On fais un copié collé qu'on fous dans une variable, puis on fais une comparaison avec toutes les maps qu'on a listé. Je l'utilise dans mon bot.
 
A

Anonymous

Invité
#14
Nexty a dit:
J'ai trouvé une solution pour la position de la map, il faudrait indiquer la map actuelle au démarrage du bot après celons ses déplacements il saura sur quelle map il se trouve (Encore faut t'il qu'il ne se soit pas perdu^^) donc quel fichier à lire pour connaitre les informations sur les obstacles ou autre et si la map est encore inconnue il les enregistres.
J'ai plein d'idée qui m'arrive à la tête pour mon bot qui rendra ses trajets bien plus performants ainsi que les combats.
Je vien de te dire les d2p
 

d4rkv4n

Contributeur
Inscrit
6 Mai 2012
Messages
129
Reactions
0
#15
Oui, ça serait fun, faudrait savoir comment lire les D2P en AutoIt.
J'essaierai de m'y pencher lorsque j'aurai terminé (ou abandonné :D) le bot socket.
 
Haut Bas