Aide et conseils concernant AutoIt et ses outils.
ultimateheadcenter
Niveau 2
Messages : 21 Enregistré le : sam. 30 juil. 2016 15:35
Status :
Hors ligne
#1
Message
par ultimateheadcenter » lun. 01 août 2016 21:52
Bonjour à tous, je me suis lancer dans un casse tête sans nom et je viens demander de l'aide !
Le but est de lire un fichier et naviguer à l’intérieur lettre par lettre (imaginons que une lettre = une case dans un jeu).
0 = mur
1 = chemin
S = (1) = start
E = (1) = End
map.txt
#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #AutoIt3Wrapper_Run_Tidy=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <File.au3> #include <Array.au3> #OnAutoItStartRegister "Dellog" Global $MAP_PATH = @ScriptDir & "\map.txt" ;Chemin du fichier Global $LOG_PATH = @ScriptName & ".log" Global $X_MAX = _FileCountLines ( $MAP_PATH ) ;Compte les lignes Global $CMDRETURN ;Stock le contenu du retour console Global $POS_ACTUAL_Y ;Position actuelle Y Global $POS_ACTUAL_X ;Position actuelle X Global $POS_LAST_Y ;Position précédente Y Global $POS_LAST_X ;Position précédente X Global $POS_START_Y ;Position de départ Y Global $POS_START_X ;Position de départ X Global $POS_END_Y ;Position de d'arrivée Y Global $POS_END_X ;Position de d'arrivée X Global $POS_MAX_Y ;Position maximum Y Global $POS_MAX_X = $X_MAX ;Position maximum X Global $TOTAL1 ;Total de 1 Global $TOTAL0 ;Total de 0 Global $MAP ;Array qui stock le fichier Global $ERRORGO = "0" Global $ERRORREAD = "0" _ANALYZE
( ) ;Analyser le fichier _GetInfo
( ) ;En tirer des informations If $POS_START_Y And $POS_START_X And $POS_END_Y And $POS_END_X = "0" Then Exit ;Si aucun départ / arrivée If $POS_START_Y And $POS_START_X And $POS_END_Y And $POS_END_X = "" Then Exit ;Si aucun départ / arrivée _FileReadToArray ( $MAP_PATH , $MAP ) ;Ecris le fichier dans l'array $POS_ACTUAL_Y = $POS_START_Y ;ACTUAL = START $POS_ACTUAL_X = $POS_START_X ;ACTUAL = START $POS_LAST_X = $POS_START_X ;LAST = START $POS_LAST_Y = $POS_START_Y ;LAST = START HotKeySet ( "{ESC} " , "_EXIT" ) ;Up presser HotKeySet ( "{UP} " , "_HOTUP" ) ;Up presser HotKeySet ( "{DOWN} " , "_HOTDOWN" ) ;Down presser HotKeySet ( "{LEFT} " , "_HOTLEFT" ) ;Left presser HotKeySet ( "{RIGHT} " , "_HOTRIGHT" ) ;Right presser While 1 Sleep ( 100 ) ;Boucle d'attente de touche WEnd Func _ANALYZE
( ) Local $X_ACTUAL = 1 While $X_ACTUAL <= $X_MAX ;Boucle jusqu'à la dernière ligne If $X_ACTUAL <> "1" Then $CMDRETURN &= @CRLF ;Ajout au Return console Local $X_READ = FileReadLine ( $MAP_PATH , $X_ACTUAL ) ;Lire la ligne Local $X_LENGHT = StringLen ( $X_READ ) ;Longueur de la chaine If $X_LENGHT > $POS_MAX_Y Then $POS_MAX_Y = $X_LENGHT ;Ecrire la plus grosse valeur dans $POS_MAX_Y Local $Y_ACTUAL = 1 While $Y_ACTUAL <= $X_LENGHT ;Boucle pour chaque lettres de la chaine $Y_READ = _GetY
( $X_READ , $Y_ACTUAL ) ;Lire la lettre actuelle de la boucle $CMDRETURN &= $Y_READ ;Ajout au Return console ;~ _Log($X_ACTUAL & ";" & $Y_ACTUAL & "|" & $Y_READ & @CRLF) ;Ecrire Console l'état actuel $Y_ACTUAL = $Y_ACTUAL + 1 WEnd $X_ACTUAL = $X_ACTUAL + 1 WEnd _Log
( $CMDRETURN & @CRLF ) ;Ecrire Console le résultat final $CMDRETURN = "" ;Reset du return EndFunc ;==>_ANALYZE Func _Direction
( $startposx , $startposy , $endposx , $endposy ) Local $direction If $startposx < $endposx Then $direction &= "Down" ;Down Else $direction &= "Up" ;Up EndIf If $startposy < $endposy Then $direction &= "Right" ;Right Else $direction &= "Left" ;Left EndIf Return $direction EndFunc ;==>_Direction Func _NEAR
( $posx , $posy , $lastx , $lasty ) Local $Return Local $left = _ReadLeft
( $posx , $posy ) If $left = "1" Or $left = "S" Or $left = "E" Then $Return &= "[LEFT]" _Log
( "[LEFT]" ) EndIf Local $right = _ReadRight
( $posx , $posy ) If $right = "1" Or $right = "S" Or $right = "E" Then $Return &= "[RIGHT]" _Log
( "[RIGHT]" ) EndIf Local $up = _ReadUp
( $posx , $posy ) If $up = "1" Or $up = "S" Or $up = "E" Then $Return &= "[UP]" _Log
( "[UP]" ) EndIf Local $down = _ReadDown
( $posx , $posy ) If $down = "1" Or $down = "S" Or $down = "E" Then $Return &= "[DOWN]" _Log
( "[DOWN]" ) EndIf _Log
( @CRLF ) EndFunc ;==>_NEAR Func _GetInfo
( ) Local $X_ACTUAL = 1 While $X_ACTUAL <= $X_MAX ;Boucle jusqu'à la dernière ligne Local $X_READ = FileReadLine ( $MAP_PATH , $X_ACTUAL ) ;Lire la ligne Local $X_LENGHT = StringLen ( $X_READ ) ;Longueur de la chaine Local $Y_ACTUAL = 1 While $Y_ACTUAL <= $X_LENGHT ;Boucle pour chaque lettres de la chaine $Y_READ = _GetY
( $X_READ , $Y_ACTUAL ) ;Lire la lettre actuelle de la boucle If $Y_READ = "S" Then $POS_START_X = $X_ACTUAL $POS_START_Y = $Y_ACTUAL _Log
( "START[" & $X_ACTUAL & ";" & $Y_ACTUAL & "]" ) ElseIf $Y_READ = "E" Then $POS_END_X = $X_ACTUAL $POS_END_Y = $Y_ACTUAL _Log
( "END[" & $X_ACTUAL & ";" & $Y_ACTUAL & "]" ) ElseIf $Y_READ = "1" Then $TOTAL1 = $TOTAL1 + 1 ElseIf $Y_READ = "0" Then $TOTAL0 = $TOTAL0 + 1 EndIf $Y_ACTUAL = $Y_ACTUAL + 1 WEnd $X_ACTUAL = $X_ACTUAL + 1 WEnd _Log
( "Total[1:" & $TOTAL1 & " 0:" & $TOTAL0 & "]" ) Local $POS_DIRECTION = _Direction
( $POS_START_X , $POS_START_Y , $POS_END_X , $POS_END_Y ) _Log
( "Direction:" & $POS_DIRECTION & @CRLF ) EndFunc ;==>_GetInfo Func _GetX
( ) Local $Get = $POS_ACTUAL_X Return $Get EndFunc ;==>_GetX Func _GetY
( $str , $pos ) Local $Get = StringMid ( $str , $pos , 1 ) ;~ _Log("STRINGMID=" & $Get & @CRLF) If $Get = "" Then Return "error" Return $Get EndFunc ;==>_GetY Func _HOTLEFT
( ) _GoLeft
( $POS_ACTUAL_X , $POS_ACTUAL_Y ) If Not @error Then _NEAR
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_LAST_X , $POS_LAST_Y ) EndFunc ;==>_HOTLEFT Func _HOTRIGHT
( ) _GoRight
( $POS_ACTUAL_X , $POS_ACTUAL_Y ) If Not @error Then _NEAR
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_LAST_X , $POS_LAST_Y ) EndFunc ;==>_HOTRIGHT Func _HOTDOWN
( ) _GoDown
( $POS_ACTUAL_X , $POS_ACTUAL_Y ) If Not @error Then _NEAR
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_LAST_X , $POS_LAST_Y ) EndFunc ;==>_HOTDOWN Func _HOTUP
( ) _GoUp
( $POS_ACTUAL_X , $POS_ACTUAL_Y ) If Not @error Then _NEAR
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_LAST_X , $POS_LAST_Y ) EndFunc ;==>_HOTUP Func _GoLeft
( $posx , $posy ) If $posy - 1 < 1 Then ;~ _Log("GoLeft ERROR" & @CRLF) $ERRORGO = "1" Return @error EndIf If _ReadLeft
( $posx , $posy ) = "0" Then Return @error If _ReadLeft
( $posx , $posy ) = "" Then Return @error _Log
( "GoLeft" & "[" ) $POS_LAST_Y = $POS_ACTUAL_Y $POS_ACTUAL_Y = $posy - 1 _Log
( "" & $POS_ACTUAL_Y & ";" & $POS_ACTUAL_X & "]" ) Local $POS_DIRECTION = _Direction
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_END_X , $POS_END_Y ) _Log
( "Direction:" & $POS_DIRECTION & @CRLF ) Return $posx & ";" & $posy - 1 EndFunc ;==>_GoLeft Func _GoRight
( $posx , $posy ) If $posy + 1 > $POS_MAX_Y Then ;~ _Log("GoRight ERROR" & @CRLF) $ERRORGO = "1" Return @error EndIf If _ReadRight
( $posx , $posy ) = "0" Then Return @error If _ReadRight
( $posx , $posy ) = "" Then Return @error _Log
( "GoRight" & "[" ) $POS_LAST_Y = $POS_ACTUAL_Y $POS_ACTUAL_Y = $posy + 1 _Log
( "" & $POS_ACTUAL_X & ";" & $POS_ACTUAL_Y & "]" ) Local $POS_DIRECTION = _Direction
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_END_X , $POS_END_Y ) _Log
( "Direction:" & $POS_DIRECTION & @CRLF ) Return $posx & ";" & $posy + 1 EndFunc ;==>_GoRight Func _GoDown
( $posx , $posy ) If $posx + 1 > $POS_MAX_X Then $ERRORGO = "1" ;~ _Log("GoDown ERROR" & @CRLF) Return @error EndIf If _ReadDown
( $posx , $posy ) = "0" Then Return @error If _ReadDown
( $posx , $posy ) = "" Then Return @error _Log
( "GoDown" & "[" ) $POS_LAST_X = $POS_ACTUAL_X $POS_ACTUAL_X = $posx + 1 _Log
( "" & $POS_ACTUAL_X & ";" & $POS_ACTUAL_Y & "]" ) Local $POS_DIRECTION = _Direction
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_END_X , $POS_END_Y ) _Log
( "Direction:" & $POS_DIRECTION & @CRLF ) Return $posx + 1 & ";" & $posy EndFunc ;==>_GoDown Func _GoUp
( $posx , $posy ) If $posx - 1 < 1 Then ;~ _Log("GoUp ERROR" & @CRLF) $ERRORGO = "1" Return @error EndIf If _ReadUp
( $posx , $posy ) = "0" Then Return @error If _ReadUp
( $posx , $posy ) = "" Then Return @error _Log
( "GoUp" & "[" ) $POS_LAST_X = $POS_ACTUAL_X $POS_ACTUAL_X = $posx - 1 _Log
( "" & $POS_ACTUAL_X & ";" & $POS_ACTUAL_Y & "]" ) Local $POS_DIRECTION = _Direction
( $POS_ACTUAL_X , $POS_ACTUAL_Y , $POS_END_X , $POS_END_Y ) _Log
( "Direction:" & $POS_DIRECTION & @CRLF ) Return $posx - 1 & ";" & $posy EndFunc ;==>_GoUp Func _Read
( $posx , $posy ) Local $xstr = _ArrayToString ( $MAP , "|" , $posx , $posx ) Local $str = _GetY
( $xstr , $posy ) Return $str EndFunc ;==>_Read Func _ReadLeft
( $posx , $posy ) Local $xstr = _ArrayToString ( $MAP , "|" , $posx , $posx ) ;~ _Log("XLEFT=" & $xstr & @CRLF) Local $str = _GetY
( $xstr , $posy - 1 ) If $str = $POS_MAX_Y Then Return $ERRORREAD = "1" If $str = "0" Then Return $ERRORREAD = "1" ;~ _Log("LEFT=" & $str & @CRLF) Return $str EndFunc ;==>_ReadLeft Func _ReadRight
( $posx , $posy ) Local $xstr = _ArrayToString ( $MAP , "|" , $posx , $posx ) ;~ _Log("XRIGHT=" & $xstr & @CRLF) Local $str = _GetY
( $xstr , $posy + 1 ) If $str = "0" Then Return $ERRORREAD = "1" If $posy = StringLen ( $xstr ) Then Return $ERRORREAD = "1" ;~ _Log("RIGHT=" & $str & @CRLF) Return $str EndFunc ;==>_ReadRight Func _ReadUp
( $posx , $posy ) If $posx = "1" Then Return $ERRORREAD = "1" Local $xstr = _ArrayToString ( $MAP , "|" , $posx - 1 , $posx - 1 ) ;~ _Log("XUP=" & $xstr & @CRLF) Local $str = _GetY
( $xstr , $posy ) If $str = "0" Then Return $ERRORREAD = "1" ;~ _Log("UP=" & $str & @CRLF) Return $str EndFunc ;==>_ReadUp Func _ReadDown
( $posx , $posy ) If $posx = $POS_MAX_X Then Return $ERRORREAD = "1" Local $xstr = _ArrayToString ( $MAP , "|" , $posx + 1 , $posx + 1 ) ;~ _Log("XDOWN=" & $xstr & @CRLF) Local $str = _GetY
( $xstr , $posy ) If $str = "0" Then Return $ERRORREAD = "1" ;~ _Log("DOWN=" & $str & @CRLF) Return $str EndFunc ;==>_ReadDown Func _EXIT
( ) ShellExecute ( $LOG_PATH , "" , @ScriptDir , "" , @SW_MAXIMIZE ) Exit EndFunc ;==>_EXIT Func _Log
( $txt ) ConsoleWrite ( $txt ) FileWrite ( $LOG_PATH , $txt ) EndFunc ;==>_Log Func Dellog
( ) FileDelete ( @ScriptName & ".log" ) EndFunc ;==>Dellog
mikell
Spammer !
Messages : 6292 Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status :
Hors ligne
#2
Message
par mikell » mar. 02 août 2016 10:00
Il me semble que tu te compliques la vie. Si le but de la manoeuvre c'est du pathfinding alors lire le fichier dans une array 2D puis naviguer dans l'array serait une bonne optimisation
Code : Tout sélectionner
#include <Array.au3>
$MAP_PATH = @ScriptDir & "\map.txt"
$read = FileReadToArray($MAP_PATH)
Global $rows = UBound($read), $cols = StringLen($read[0]), $MAP[$rows][$cols]
For $i = 0 to $rows-1
For $j = 0 to $cols-1
$MAP[$i][$j] = StringMid($read[$i], $j+1, 1)
Next
Next
_ArrayDisplay($MAP, "map")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ultimateheadcenter
Niveau 2
Messages : 21 Enregistré le : sam. 30 juil. 2016 15:35
Status :
Hors ligne
#3
Message
par ultimateheadcenter » mar. 02 août 2016 10:06
Tu as résumé mon patté en 10 lignes ? Sérieusement ? lol
Effectivement je me complique la vie.
Merci grandement !
Je vais rajouté le résolut et je reviendrais avec quelque chose de plus complet et moins brouillon
Il n'y as pas de limitations de taille dans les arrays ?
Comment puis-je récupéré la colonne en plus de la ligne ?
#include <Array.au3> $MAP_PATH = @ScriptDir & "\map.txt" $read = FileReadToArray
( $MAP_PATH ) Global $rows = UBound ( $read ) Global $cols = StringLen ( $read [ 0 ] ) Global $MAP [ $rows ] [ $cols ] For $POS_LINE = 0 to $rows - 1 For $POS_LETTER = 0 to $cols - 1 $MAP [ $POS_LINE ] [ $POS_LETTER ] = StringMid ( $read [ $POS_LINE ] , $POS_LETTER + 1 , 1 ) Next Next _PreProcess
( ) ;~ _ArrayDisplay($MAP, "map") Func _PreProcess
( ) Local $Search1_S = _ArraySearch ( $MAP , "S" ) Local $Search2_S = _ArraySearch ( $MAP , "S" , 0 , 0 , 0 , 0 , 0 ,- 1 , True ) ConsoleWrite ( "StartY= " & $Search1_S & @CRLF ) ConsoleWrite ( "StartX= " & $Search2_S & @CRLF ) Local $Search1_E = _ArraySearch ( $MAP , "E" ) Local $Search2_E = _ArraySearch ( $MAP , "E" , 0 , 0 , 0 , 0 , 0 ,- 1 , True ) ConsoleWrite ( "EndY= " & $Search1_E & @CRLF ) ConsoleWrite ( "EndX= " & $Search2_E & @CRLF ) EndFunc Func _PostProcess
( ) EndFunc
mikell
Spammer !
Messages : 6292 Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status :
Hors ligne
#4
Message
par mikell » mar. 02 août 2016 10:47
Code : Tout sélectionner
#include <Array.au3>
$MAP_PATH = @ScriptDir & "\map.txt"
$read = FileReadToArray($MAP_PATH)
Global $rows = UBound($read)
Global $cols = StringLen($read[0])
Global $MAP[$rows][$cols]
For $i = 0 to $rows-1
For $j = 0 to $cols-1
$MAP[$i][$j] = StringMid($read[$i], $j+1, 1)
Next
Next
Msgbox(0,"", "start : " & _Find($MAP, "S") &@crlf& "end : " & _Find($MAP, "E"))
_ArrayDisplay($MAP, "map")
Func _Find($array, $case)
For $i = 0 to UBound($array)-1
For $j = 0 to UBound($array, 2)-1
If $array[$i][$j] = $case Then Return $i & "," & $j
Next
Next
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ultimateheadcenter
Niveau 2
Messages : 21 Enregistré le : sam. 30 juil. 2016 15:35
Status :
Hors ligne
#5
Message
par ultimateheadcenter » mar. 02 août 2016 10:50
Ah ben tu as été plus rapide je viens de corrigé mon script, mais je vais utilisé le tiens, plus clair lol
Merci beaucoup
C'est là qu'on voit les pro ^^
mikell
Spammer !
Messages : 6292 Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status :
Hors ligne
#6
Message
par mikell » mar. 02 août 2016 10:53
Il est surtout moins lourd
Il faut de temps en temps avoir une petite pensée pour son processeur
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ultimateheadcenter
Niveau 2
Messages : 21 Enregistré le : sam. 30 juil. 2016 15:35
Status :
Hors ligne
#7
Message
par ultimateheadcenter » mar. 02 août 2016 10:55
Oui c'est plus clair, plus puissant et plus rapide que demander de plus lol ^^ je vais apprendre à utiliser les arrays, je ne les ait utilisé que très rarement.
J'ai supprimé le superflue du post et j'ai mis le résolut, merci beaucoup et à très bientot pour de nouvelles questions
Tlem
Site Admin
Messages : 11798 Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status :
Hors ligne
#8
Message
par Tlem » mar. 02 août 2016 18:17
ultimateheadcenter a écrit : Tu as résumé mon patté en 10 lignes ? Sérieusement ? lol
Et encore, il a été gentil ! Il aurait pu le faire en 7 lignes (voir 6 en faisant toutes les déclarations sur une ligne).
Ceci dit, la condensation maximale n'est pas forcément optimisé pour la lecture et la compréhension des lecteurs ... D’où les 10 lignes.
ultimateheadcenter
Niveau 2
Messages : 21 Enregistré le : sam. 30 juil. 2016 15:35
Status :
Hors ligne
#9
Message
par ultimateheadcenter » mar. 02 août 2016 19:59
Probleme résolut
map.txt
#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_Change2CUI=y #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #AutoIt3Wrapper_Run_Tidy=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <Array.au3> #include <String.au3> #include <Timers.au3> #OnAutoItStartRegister "SUPPR" Global $MAP_PATH = @ScriptDir & "\map.txt" Global $LOG_PATH = @ScriptName & ".log" Global $VISITED_FILE = @ScriptDir & "\VISITED.log" Global $VISITED Global $read = FileReadToArray
( $MAP_PATH ) Global $rows = UBound ( $read ) Global $cols = StringLen ( $read [ 0 ] ) Global $MAP [ $rows ] [ $cols ] For $POS_ROWS = 0 To $rows - 1 For $POS_COLS = 0 To $cols - 1 $MAP [ $POS_ROWS ] [ $POS_COLS ] = StringMid ( $read [ $POS_ROWS ] , $POS_COLS + 1 , 1 ) Next Next Global $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS Global $POS_LAST_COLS , $POS_LAST_ROWS Global $POS_START_COLS , $POS_START_ROWS Global $POS_END_COLS , $POS_END_ROWS Global $POS_MAX_COLS , $POS_MAX_ROWS Global $POS_LAST_OPERATION = "FIRST" Global $SIM_ACTUAL Global $SIM_TOTAL = 10 Global $SIM_BEST_SIM Global $SIM_BEST_MOVE Global $GPS_ACTUAL Global $TOTAL_MOVE , $TOTAL_1 , $TOTAL_0 Global $ERRORGO = "0" Global $ERRORREAD = "0" _START
( ) Func _PreProcess
( ) $GetS = _Find
( $MAP , "S" ) $ExpS = _StringExplode ( $GetS , ";" ) If UBound ( $ExpS ) > "1" Then If $ExpS [ 0 ] = "" Or $ExpS [ 1 ] = "" Then Return @error $POS_START_COLS = $ExpS [ 0 ] $POS_START_ROWS = $ExpS [ 1 ] $GetE = _Find
( $MAP , "E" ) $ExpE = _StringExplode ( $GetE , ";" ) If $ExpE [ 0 ] = "" Or $ExpE [ 1 ] = "" Then Return @error $POS_END_COLS = $ExpE [ 0 ] $POS_END_ROWS = $ExpE [ 1 ] EndIf If $POS_START_COLS = "" Or $POS_START_ROWS = "" Or $POS_END_COLS = "" Or $POS_END_ROWS = "" Then ;~ _Log("ERROR START/END" & @CRLF) Else $POS_ACTUAL_COLS = $POS_START_COLS $POS_ACTUAL_ROWS = $POS_START_ROWS $POS_LAST_COLS = $POS_START_COLS $POS_LAST_ROWS = $POS_START_ROWS $POS_MAX_COLS = $cols $POS_MAX_ROWS = $rows EndIf EndFunc ;==>_PreProcess Func _Find
( $array , $case ) For $i = 0 To UBound ( $array ) - 1 For $j = 0 To UBound ( $array , 2 ) - 1 If $array [ $i ] [ $j ] = $case Then Return $i & ";" & $j Next Next EndFunc ;==>_Find Func _MOVELEFT
( $POS_COLS , $POS_ROWS ) If $POS_COLS = "0" Then Return "0" Else If _READLEFT
( $POS_COLS , $POS_ROWS ) = "0" Then Return "0" $POS_LAST_COLS = $POS_ACTUAL_COLS ;~ $POS_LAST_ROWS = $POS_ACTUAL_ROWS $POS_ACTUAL_COLS = $POS_ACTUAL_COLS - 1 EndIf EndFunc ;==>_MOVELEFT Func _MOVERIGHT
( $POS_COLS , $POS_ROWS ) If $POS_COLS = $POS_MAX_COLS Then Return "0" Else If _READRIGHT
( $POS_COLS , $POS_ROWS ) = "0" Then Return "0" $POS_LAST_COLS = $POS_ACTUAL_COLS ;~ $POS_LAST_ROWS = $POS_ACTUAL_ROWS $POS_ACTUAL_COLS = $POS_ACTUAL_COLS + 1 EndIf EndFunc ;==>_MOVERIGHT Func _MOVEUP
( $POS_COLS , $POS_ROWS ) If $POS_ROWS = "0" Then Return "0" Else If _READUP
( $POS_COLS , $POS_ROWS ) = "0" Then Return "0" $POS_LAST_ROWS = $POS_ACTUAL_ROWS ;~ $POS_LAST_COLS = $POS_ACTUAL_COLS $POS_ACTUAL_ROWS = $POS_ACTUAL_ROWS - 1 EndIf EndFunc ;==>_MOVEUP Func _MOVEDOWN
( $POS_COLS , $POS_ROWS ) If $POS_ROWS = $POS_MAX_ROWS Then Return "0" Else If _READDOWN
( $POS_COLS , $POS_ROWS ) = "0" Then Return "0" $POS_LAST_ROWS = $POS_ACTUAL_ROWS ;~ $POS_LAST_COLS = $POS_ACTUAL_COLS $POS_ACTUAL_ROWS = $POS_ACTUAL_ROWS + 1 EndIf EndFunc ;==>_MOVEDOWN Func _READLEFT
( $POS_COLS , $POS_ROWS ) If $POS_COLS = "0" Then Return "0" Else $read = _ArrayToString ( $MAP , "|" , $POS_COLS - 1 , $POS_COLS - 1 , ";" , $POS_ROWS , $POS_ROWS ) If $read = "0" Then Return "0" EndIf Return $read EndFunc ;==>_READLEFT Func _READRIGHT
( $POS_COLS , $POS_ROWS ) If $POS_COLS = $POS_MAX_COLS Then Return "0" Else $read = _ArrayToString ( $MAP , "|" , $POS_COLS + 1 , $POS_COLS + 1 , ";" , $POS_ROWS , $POS_ROWS ) If $read = "0" Then Return "0" EndIf Return $read EndFunc ;==>_READRIGHT Func _READUP
( $POS_COLS , $POS_ROWS ) If $POS_ROWS = "0" Then Return "0" Else $read = _ArrayToString ( $MAP , "|" , $POS_COLS , $POS_COLS , ";" , $POS_ROWS - 1 , $POS_ROWS - 1 ) If $read = "0" Then Return "0" EndIf Return $read EndFunc ;==>_READUP Func _READDOWN
( $POS_COLS , $POS_ROWS ) If $POS_ROWS = $POS_MAX_ROWS Then Return "0" Else $read = _ArrayToString ( $MAP , "|" , $POS_COLS , $POS_COLS , ";" , $POS_ROWS + 1 , $POS_ROWS + 1 ) If $read = "0" Then Return "0" EndIf Return $read EndFunc ;==>_READDOWN Func _HOTKEYLEFT
( ) _MOVELEFT
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) _VISITED
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("ACTUAL:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS & " LAST:" & $POS_LAST_COLS & ";" & $POS_LAST_ROWS) Local $GPSDATA = _GPS
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS , $POS_END_COLS , $POS_END_ROWS ) ;~ _Log("[GPS:" & $GPSDATA & "]") If $GPSDATA = "DESTINATION" Then _POSTPROCESS
( ) _NEAR
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("[Operation=LEFT]") ;~ _Log("[LastOperation=" & $POS_LAST_OPERATION & "]") ;~ _Log(@CRLF) $TOTAL_MOVE = $TOTAL_MOVE + 1 $POS_LAST_OPERATION = "LEFT" EndFunc ;==>_HOTKEYLEFT Func _HOTKEYRIGHT
( ) _MOVERIGHT
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) _VISITED
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("ACTUAL:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS & " LAST:" & $POS_LAST_COLS & ";" & $POS_LAST_ROWS) Local $GPSDATA = _GPS
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS , $POS_END_COLS , $POS_END_ROWS ) ;~ _Log("[GPS:" & $GPSDATA & "]") If $GPSDATA = "DESTINATION" Then _POSTPROCESS
( ) _NEAR
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("[Operation=RIGHT]") ;~ _Log("[LastOperation=" & $POS_LAST_OPERATION & "]") ;~ _Log(@CRLF) $TOTAL_MOVE = $TOTAL_MOVE + 1 $POS_LAST_OPERATION = "RIGHT" EndFunc ;==>_HOTKEYRIGHT Func _HOTKEYUP
( ) _MOVEUP
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) _VISITED
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("ACTUAL:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS & " LAST:" & $POS_LAST_COLS & ";" & $POS_LAST_ROWS) Local $GPSDATA = _GPS
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS , $POS_END_COLS , $POS_END_ROWS ) ;~ _Log("[GPS:" & $GPSDATA & "]") If $GPSDATA = "DESTINATION" Then _POSTPROCESS
( ) _NEAR
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("[Operation=UP]") ;~ _Log("[LastOperation=" & $POS_LAST_OPERATION & "]") ;~ _Log(@CRLF) $TOTAL_MOVE = $TOTAL_MOVE + 1 $POS_LAST_OPERATION = "UP" EndFunc ;==>_HOTKEYUP Func _HOTKEYDOWN
( ) $GO = _MOVEDOWN
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) _VISITED
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("ACTUAL:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS & " LAST:" & $POS_LAST_COLS & ";" & $POS_LAST_ROWS) Local $GPSDATA = _GPS
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS , $POS_END_COLS , $POS_END_ROWS ) ;~ _Log("[GPS:" & $GPSDATA & "]") If $GPSDATA = "DESTINATION" Then _POSTPROCESS
( ) _NEAR
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log("[Operation=DOWN]") ;~ _Log("[LastOperation=" & $POS_LAST_OPERATION & "]") ;~ _Log(@CRLF) $TOTAL_MOVE = $TOTAL_MOVE + 1 $POS_LAST_OPERATION = "DOWN" EndFunc ;==>_HOTKEYDOWN Func _NEAR
( $POS_COLS , $POS_ROWS ) Local $RETURN $RETURN &= "[" Local $LEFT = _READLEFT
( $POS_COLS , $POS_ROWS ) If $LEFT <> "0" Then $RETURN &= "LEFT" Local $RIGHT = _READRIGHT
( $POS_COLS , $POS_ROWS ) If $RIGHT <> "0" Then $RETURN &= "RIGHT" Local $UP = _READUP
( $POS_COLS , $POS_ROWS ) If $UP <> "0" Then $RETURN &= "UP" Local $DOWN = _READDOWN
( $POS_COLS , $POS_ROWS ) If $DOWN <> "0" Then $RETURN &= "DOWN" $RETURN &= "]" ;~ _Log($RETURN & @CRLF) Return $RETURN EndFunc ;==>_NEAR Func _GPS
( $POS_COLS , $POS_ROWS , $POS_END_COLS , $POS_END_ROWS ) Local $GPS If $POS_COLS < $POS_END_COLS Then $GPS &= "Down" ;Down Else $GPS &= "Up" ;Up EndIf If $POS_ROWS < $POS_END_ROWS Then $GPS &= "Right" ;Right Else $GPS &= "Left" ;Left EndIf If $POS_COLS = $POS_END_COLS And $POS_ROWS = $POS_END_ROWS Then $GPS = "DESTINATION" ;Down Else EndIf $GPS_ACTUAL = $GPS Return $GPS EndFunc ;==>_GPS Func _EXIT
( ) ShellExecute ( $LOG_PATH , "" , @ScriptDir , "" , @SW_MAXIMIZE ) Exit EndFunc ;==>_EXIT Func _Log
( $txt ) ConsoleWrite ( $txt ) FileWrite ( $LOG_PATH , $txt ) EndFunc ;==>_Log Func SUPPR
( ) FileDelete ( @ScriptName & ".log" ) FileDelete ( "VISITED.log" ) EndFunc ;==>SUPPR Func _VISITED
( $POS_COLS , $POS_ROWS ) FileWriteLine ( $VISITED_FILE , $POS_COLS & ";" & $POS_ROWS ) $VISITED &= $POS_COLS & ";" & $POS_ROWS & "|" EndFunc ;==>_VISITED Func _VISITED_SEARCH
( $POS_COLS , $POS_ROWS ) If StringInStr ( $VISITED , $POS_COLS & ";" & $POS_ROWS ) Then Return "1" Return "0" EndFunc ;==>_VISITED_SEARCH ;~ Func _START();HOTKEY ;~ HotKeySet("{ESC}", "_EXIT") ;Up presser ;~ HotKeySet("{UP}", "_HOTKEYUP") ;Up presser ;~ HotKeySet("{DOWN}", "_HOTKEYDOWN") ;Down presser ;~ HotKeySet("{LEFT}", "_HOTKEYLEFT") ;Left presser ;~ HotKeySet("{RIGHT}", "_HOTKEYRIGHT") ;Right presser ;~ _Log("STARTING FROM:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS) ;~ $GPSDATA = _GPS($POS_ACTUAL_COLS, $POS_ACTUAL_ROWS, $POS_END_COLS, $POS_END_ROWS) ;~ _Log("[GPS:" & $GPSDATA & "]") ;~ _NEAR($POS_ACTUAL_COLS, $POS_ACTUAL_ROWS) ;~ _Log(@CRLF) ;~ While 1 ;~ Sleep(100) ;Boucle d'attente de touche ;~ WEnd ;~ EndFunc ;==>_START ;~ Func _START() ;SEMIAUTO ;~ _Log("STARTING FROM:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS) ;~ $GPSDATA = _GPS($POS_ACTUAL_COLS, $POS_ACTUAL_ROWS, $POS_END_COLS, $POS_END_ROWS) ;~ _Log("[GPS:" & $GPSDATA & "]") ;~ _NEAR($POS_ACTUAL_COLS, $POS_ACTUAL_ROWS) ;~ _Log(@CRLF) ;~ Local $i = 0 ;~ While $i <= 1000 ;~ _HOTKEYDOWN() ;~ _HOTKEYUP() ;~ $i = $i + 1 ;~ WEnd ;~ _HOTKEYDOWN() ;~ _HOTKEYDOWN() ;~ _HOTKEYDOWN() ;~ _HOTKEYDOWN() ;~ _HOTKEYDOWN() ;~ _HOTKEYRIGHT() ;~ _HOTKEYRIGHT() ;~ _HOTKEYRIGHT() ;~ _HOTKEYRIGHT() ;~ EndFunc ;==>_START Func _START
( ) ;AUTO Global $DATE_SIM_START = _Timer_Init ( ) ;~ _Log("STARTING FROM:" & $POS_ACTUAL_COLS & ";" & $POS_ACTUAL_ROWS) $GPSDATA = _GPS
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS , $POS_END_COLS , $POS_END_ROWS ) ;~ _Log("[GPS:" & $GPSDATA & "]") _NEAR
( $POS_ACTUAL_COLS , $POS_ACTUAL_ROWS ) ;~ _Log(@CRLF) Local $SIM_ACTUAL_LOCAL = 1 $SIM_ACTUAL = $SIM_ACTUAL_LOCAL While $SIM_ACTUAL_LOCAL <= $SIM_TOTAL _PreProcess
( ) While 1 Local $RANDOM = Random ( 1 , 4 , 1 ) Switch $RANDOM Case 1 _HOTKEYLEFT
( ) Case 2 _HOTKEYRIGHT
( ) Case 3 _HOTKEYUP
( ) Case 4 _HOTKEYDOWN
( ) EndSwitch WEnd $SIM_ACTUAL_LOCAL = $SIM_ACTUAL_LOCAL + 1 $SIM_ACTUAL = $SIM_ACTUAL_LOCAL WEnd EndFunc ;==>_START Func _POSTPROCESS
( ) $TSTAMP = Round ( _Timer_Diff ( $DATE_SIM_START ) , 0 ) _Log
( @CRLF & "SIMULATION" & $SIM_ACTUAL & ":" & $TOTAL_MOVE & " Moves" & " In " & $TSTAMP & "ms" & " = " & Round ( $TOTAL_MOVE / $TSTAMP * 1000 , 0 ) & "/sec" & @CRLF ) If $SIM_BEST_SIM = "" Then $SIM_BEST_SIM = $SIM_ACTUAL $SIM_BEST_MOVE = $TOTAL_MOVE MsgBox ( 0 , "" , "BEST" ) EndIf If $TOTAL_MOVE < $SIM_BEST_MOVE Then $SIM_BEST_SIM = $SIM_ACTUAL $SIM_BEST_MOVE = $TOTAL_MOVE MsgBox ( 0 , "" , "BEST1" ) EndIf _Log
( $VISITED ) $SIM_ACTUAL = $SIM_ACTUAL + 1 $POS_ACTUAL_COLS = $POS_START_COLS $POS_ACTUAL_ROWS = $POS_START_ROWS If $SIM_TOTAL = $SIM_ACTUAL Then _Log
( @CRLF & "BEST SIM WAS SIM" & $SIM_BEST_SIM & " WITH " & $SIM_BEST_MOVE & " MOVES " & @CRLF ) _EXIT
( ) EndIf $TOTAL_MOVE = "" $VISITED = "" EndFunc ;==>_POSTPROCESS