[R] Texte mapping

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

[R] Texte mapping

#1

Message par ultimateheadcenter »

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

Code : Tout sélectionner

S1111
10101
11111
10101
1111E

#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
Modifié en dernier par ultimateheadcenter le mar. 02 août 2016 10:54, modifié 3 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Texte mapping

#2

Message par mikell »

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
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: Texte mapping

#3

Message par ultimateheadcenter »

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 :P

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
Modifié en dernier par ultimateheadcenter le mar. 02 août 2016 10:49, modifié 2 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R]Texte mapping

#4

Message par mikell »

:mrgreen:

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
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R]Texte mapping

#5

Message par ultimateheadcenter »

Ah ben tu as été plus rapide je viens de corrigé mon script, mais je vais utilisé le tiens, plus clair lol
Merci beaucoup :D
C'est là qu'on voit les pro ^^ :P
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R]Texte mapping

#6

Message par mikell »

Il est surtout moins lourd
Il faut de temps en temps avoir une petite pensée pour son processeur :mrgreen:
" 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
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R]Texte mapping

#7

Message par ultimateheadcenter »

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 :)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Texte mapping

#8

Message par Tlem »

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). :mrgreen:
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. :lol:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R] Texte mapping  

#9

Message par ultimateheadcenter »

Probleme résolut

map.txt

Code : Tout sélectionner

S1111
10101
11111
10101
1111E
#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
Répondre