[R] Labyrinthe

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
sozary
Niveau 6
Niveau 6
Messages : 274
Enregistré le : lun. 20 janv. 2014 19:17
Status : Hors ligne

[R] Labyrinthe

#1

Message par sozary »

Je suis en train de créer un labyrinthe qui se génère tout seul!! Pouvez vous me dire où code bloque svp? ^^
► Afficher le texte
Modifié en dernier par sozary le mar. 31 mars 2015 20:32, modifié 1 fois.
"Là où la volonté est grande, les difficultés diminuent.", Niccolò Machiavelli
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Labyrinthe

#2

Message par jguinch »

On fait quoi avec ton script ? :roll:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Labyrinthe

#3

Message par ZDS »

Bonjour,

Plusieurs points problématiques retiennent mon attention
  • 1° Tout d'abord, les [] pour l'index dans un tableau s'appliquent à une variable uniquement, et non à un retour de fonction par exemple. Ainsi :

    Code : Tout sélectionner

    $X2 = StringSplit($OpenList[$rand], ",")[1]
    $Y2 = StringSplit($OpenList[$rand], ",")[2]
    est incorrect, par contre ceci l'est :

    Code : Tout sélectionner

    Local $split = StringSplit($OpenList[$rand], ",")
    $X2 = $split[1]
    $Y2 = $split[2]
  • 2° Tu mélanges les torchons et les serviettes en appliquant des strings "0" ou "15" dans le tableau $aLaby, et autant faire des BitAnd sur des nombres est logique pour tester un bit en particulier (comme un masque), autant le faire sur une chaîne de caractères n'a pas de sens (surtout entre un seul caractère comme "7" et deux caractères comme "13")
  • 3° Ton tableau final est à 3 dimensions, ce qui me semble totalement inutile puisque tu gères la dernière dimension pour un état marqué ou non : c'est aussi ce que tu fais dans le cadre des murs de ton labyrinthe 1 + 2 + 4 + 8, donc autant ajouter un 16 pour ce marquage, et s'abstraire de cette troisième dimension qui casse un peu les c**illes ^^
  • 4° Ton algorithme est trop compliqué, quasiment illisible et non commenté. Merci de remédier à ça avant que qui que ce soit ne puisse t'apporter une aide plus importante sur ton code.
En bref, dans son état actuel ton code ne peut pas fonctionner, il faudra sans doute le reprendre en totalité (et commenté pour que d'autres puissent t'aider).
A bientôt !

PS: Deux fonctions qui pourraient t'être utile _get() et _set(), et un code exemple commenté qui pourra t'aider à comprendre comment les utiliser
► Afficher le texte_get / _set
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Labyrinthe

#4

Message par jguinch »

@ZDS : pour le point 1, cette écriture est possible depuis la v3.3.10 :
Added: Array access on expression: StringSplit("a,b", ",")[1].

Code : Tout sélectionner

MsgBox( 0, "", StringSplit("a,b", ",")[1] )
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Labyrinthe

#5

Message par ZDS »

Je suis en 3.3.10.2, j'ai seulement ajouté "Exit _CreerLaby()" en ligne 3 et pourtant j'ai droit à un :

Code : Tout sélectionner

"C:\Users\ZDS\Desktop\Nouveau AutoIt v3 Script.au3" (66) : ==> Subscript used on non-accessible variable.:
$X2 = StringSplit($PrivateList[$rand], ",")[1]
$X2 = StringSplit($PrivateList[$rand], ",")^ ERROR
Même si cela devrait être faisable comme tu dis puisque, bizarrement, ça, ça marche :

Code : Tout sélectionner

Func f()
    Local $result[10] = [10,11,12,13,14,15,16,17,18,19]
    Return $result
EndFunc
MsgBox(0, "", f()[5])
De toute manière d'un point de vue algo, répéter le split deux fois pour $X et $Y reste superflu voire absurde ^^
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
sozary
Niveau 6
Niveau 6
Messages : 274
Enregistré le : lun. 20 janv. 2014 19:17
Status : Hors ligne

Re: [..] Labyrinthe

#6

Message par sozary »

Re!! Désolé! Cet après midi je n'étais pas chez moi et est donc écrit ce post très trop rapidement!

Oui donc j'ai terminé l'algorithme, seulement je n'ai pas beaucoup pris en compte tes conseils ZDS, du fait que je suis surbouqué en ce moment et que j'ai pas le temps de réécrire tout l'algo!

Je ferais donc cela un peu plus tard en prenant compte de tes remarques!

En revanche, voici sont fonctionnement: j'ai les 4 murs principaux d'une cellule d'un tableau 2D du labyrinthe, elle a donc l'état non visité (0) et la valeur 15. En effet, les murs Nord, Ouest,Sud et est sont bloqués, j'ai donc N=1, O=1, etc, on a donc 1111, ce qui en binaire donne 15.

Ensuite j'ai deux listes, une privé contenant tous les voisins potentiels de la cellule étudiée. L'algo, si il y a un voisin potentiel au minimum, en choisi un aléatoirement dans la liste privée, puis je coupe le chemin allant de la cellule voisine à celle actuelle, puis par une opération AND, je fais en sorte que la cellule actuelle soit ouverte sur la cellule voisine, en conservant ses liaisons d'avant (si ce fût le cas). Le reste des voisins potentiels est ajouté à la fin de l'open list.

Si la liste privée est vide, on prend un élément aléatoirement dans l open list, et on réitère sur les nouvelles coordonnées.


Pour ceux qui n'ont pas encore trop saisi, cette méthode est bien expliquée ici!

P-S: Merci pour ta patience ZDS, et je te comprends jguinch :? !
Voici le code provisoire: (il marche)
► Afficher le texte
"Là où la volonté est grande, les difficultés diminuent.", Niccolò Machiavelli
Avatar du membre
sozary
Niveau 6
Niveau 6
Messages : 274
Enregistré le : lun. 20 janv. 2014 19:17
Status : Hors ligne

Re: [..] Labyrinthe

#7

Message par sozary »

Rebonjour!

Alors voilà, j'ai apporté des amélioration au code, enlevé la 3D inutile, et est enlevé la récursivité!
On à donc quelque chose de plus simple, j'aimerais néanmoins savoir si vous trouvez des erreurs dans le code.
Il est également moins long que le précédant, et plus facile à comprendre aussi!
► Afficher le texte
Merci d'avance!
"Là où la volonté est grande, les difficultés diminuent.", Niccolò Machiavelli
Répondre