Ou bien de rajouter un bord à ta matrice de chaque coté. bord où il est impossible de modifier la valeur ou même d'aller, juste consulter.
La méthode de JCHD est la plus simple, tu n'as qu'à changer ta fonction cocher_case(ByRef $tab, $i, $j)
Code : Tout sélectionner
Func cocher_case(ByRef $tab, $i, $j)
Local $x = Ubound($tab,1), $y = Ubound($tab,2)
If $i<0 Or $i>=$x Or $j<0 Or $j>=$y Then Return 0 ; 0 est un retour disant que la procédure a échoué
$tab[$i][$j] = 1
Return 1 ; 1 est un retour disant que la procédure a réussi
EndFunc
et ajouter une fonction lire_case($tab, $i, $j), le ByRef est inutile car aucune écriture est prévue dans $tab
Code : Tout sélectionner
Func lire_case($tab, $i, $j)
Local $x = Ubound($tab,1), $y = Ubound($tab,2)
If $i<0 Or $i>=$x Or $j<0 Or $j>=$y Then Return -1 ; Si la case est en dehors du tableau, on renvoye le résultat qu'on a prévu pour une case inaccessible
Return $tab[$i][$j]
EndFunc
Ensuite, il n'y a plus qu'à remplacer les $tableau[$x][$y] de ton code par des lire_case($tableau, $x, $y), ce qui empèchera les plantages. Voici une version modifiée de ton dernier code :
► Afficher le texteScript (version sécurisée)
Code : Tout sélectionner
#include <Array.au3>
Global $X = 14, $Y = 8
Global $tableau_general
Global $position_X = 3, $position_Y = 4, $finish = 0
Global $gauche_dispo = 0, $droite_dispo = 0, $bas_dispo = 0, $haut_dispo = 0
$tableau_general = generer_tableau($X,$Y)
cocher_case($tableau_general, $position_X, $position_Y)
While $finish = 0
;~ Boucle du programme : Tant que le tableau n'est pas rempli alors faire ceci :
check_et_deplacement()
cocher_case($tableau_general, $position_X, $position_Y)
_ArrayDisplay($tableau_general, "")
;MsgBox(0,"", $position_X & " " & $position_Y)
WEnd
;~ -------------------------------- Limite debut fonctions ------------------------
Func generer_tableau($position_X, $position_Y)
;~ Genere un tableau de X lignes a Y colonnes
Dim $name[$X][$Y]
For $i = 0 To $X-1
For $j = 0 To $Y-1
ecrire_case($name,$i,$j,0)
Next
Next
Return $name
EndFunc
Func cocher_case(ByRef $tab, $i, $j)
Return ecrire_case($tab, $i, $j, 1)
EndFunc
Func lire_case($tab, $i, $j)
Local $x = Ubound($tab,1), $y = Ubound($tab,2)
If $i<0 Or $i>=$x Or $j<0 Or $j>=$y Then Return -1 ; Si la case est en dehors du tableau, on renvoye le résultat qu'on a prévu pour une case inaccessible
Return $tab[$i][$j]
EndFunc
Func ecrire_case(ByRef $tab, $i, $j, $value)
Local $x = Ubound($tab,1), $y = Ubound($tab,2)
If $i<0 Or $i>=$x Or $j<0 Or $j>=$y Then Return 0 ; 0 est un retour disant que la procédure a échoué
$tab[$i][$j] = $value
Return 1 ; 1 est un retour disant que la procédure a réussi
EndFunc
Func check_et_deplacement()
;~ Si voisins de gauche (X-1) est disponible (=0) et dans les cases existantes alors se deplacer
;~ Meme syntaxe pour la suite
If lire_case($tableau_general,$position_X-1,$position_Y) <> 0 And lire_case($tableau_general,$position_X+1,$position_Y) <> 0 And lire_case($tableau_general,$position_X,$position_Y-1) <> 0 And lire_case($tableau_general,$position_X,$position_Y+1) <> 0 Then
$finish = 1
;Fct interpreter
MsgBox(0,"","fini en ("&$position_X&","&$position_Y&")")
Exit
Else
;~ Effectue un random de 1 a 4 pour determiner dans quel sens se dirige, si _dispo = 1 alors s'y deplacer, sinon relancer la fonction
;~ 1 a 4 equivaut a la direction prises.
Local $var= Random(1,4,1), $position_X_initial = $position_X, $position_Y_initial = $position_Y
Select
Case $var = 1 And lire_case($tableau_general,$position_X-1,$position_Y) = 0
$position_X -= 1
Case $var = 2 And lire_case($tableau_general,$position_X+1,$position_Y) = 0
$position_X += 1
Case $var = 3 And lire_case($tableau_general,$position_X,$position_Y-1) = 0
$position_Y -= 1
Case $var = 4 And lire_case($tableau_general,$position_X,$position_Y+1) = 0
$position_Y += 1
EndSelect
If $position_X = $position_X_initial And $position_Y = $position_Y_initial Then check_et_deplacement() ; Si on a pas bougé, alors on reteste
EndIf
;EndIf
EndFunc
PS: J'ai modifié pas mal de chose, dont ton generer_tableau(...), j'ai notamment enlevé le $name, car tu fournissais en entrée une variable (une chaine de caractères en l'occurrence) et tu la "modifiais" en un tableau : D'une part une cohérence des données pouvant s'avérer catastrophique, et de l'autre une variable d'entrée qui au final n'était ni lue ni travaillée. J'ai aussi modifié ton switch final (il y avait une erreur concernant le $var=4, tout comme le $var=3 tu décrémentais Y, je suppose qu'il fallait l'incrémenter cette fois, non? ^^), et j'en ai fait un select, plus facile pour la compréhension à mon avis (surtout que les And et Or sont des coupe-circuits en AutoIt, pas besoin de se prendre la tête ^^).
Bref, bonne lecture à bientôt !
PS: Au final dans ta matrice :
- 1 = case cochée
- 0 = case libre
- -1 = case inaccessible => valeur non présente dans le tableau, mais pouvant être retournée par la fonction lire_case(...)