IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Trouver le chemin le plus court


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de poly128
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 73
    Points
    73
    Par défaut Trouver le chemin le plus court
    Je fais présentement un jeux (du style age of empire) avec delphi 6. Mais j'ai un probleme. Lorceque je demande a mes unités de se déplacer ils vont au point indiquer en ligne droite sans éviter les obstacle(maison,arbre,falaise, etc...). J'aimerais savoir comment faire pour trouver le chemin le plus court entre deux pixels à l'écran tout en évitant les obstacles pour qu'enfin les unités ne marche plus sur les maisons.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Voilà un bout de code qui fonctionne (bien).
    Malheuresement, c'est un vieux code que j'avais pas commenté.
    La fonction MAP_IsPathOk indique si'il la case n'est pas un obstacle.

    CODE SUPPPRIME : voir code commenté dans message suivant.

  3. #3
    Membre régulier Avatar de poly128
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 73
    Points
    73
    Par défaut
    Merci mais je ne comprend pas très bien ton code. J'ai esseyer de plusieur facon et il me sort toujours des erreur (workArray non déclaré),(la fonction nessesite un type de résultat). Est que tu pourais m'expliquer un peu.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut

    fait une recherche sur l'algoritme "pathfinding" il exite beaucoup d'exemple

    @+ Phil

  5. #5
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut,

    En effet, anapurna te donne le "bon mot" à chercher.

    Ce que tu cherches a déjà été maintes fois débattu sur le forum Algo.
    Par exemple ce fil te donne plein de pistes :
    http://www.developpez.net/forums/sho...g+court+chemin

    Bonne recherche, puis bon dev' !

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,
    Mes messages précédents sont partis tout seul (il semble que l'utilisation de la touche TAB pose problème).

    J'ai commenté le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    function TMapObj.Map_PathFind(StartPathX,StartPathY,EndPathX,EndPathY:integer):integer ;
    // input : coordonnées des positions de départ et d'arrivée. result = longueur du plus court chemin
    var PointX,PointY,PointP : array of integer ;
        istart,iend : integer ;
    (**)procedure AddPoint(X,Y:integer) ;
        // Ajout d'un nouveau point à traiter  dans la pile
        // PointP est un lien sur le point précédent du chemin
        begin
        inc(iend) ;
        PointP[iend]:=istart ;
        PointX[iend]:=X ;
        PointY[iend]:=Y ;
        Workarray[X,Y]:=1 ; // indique que le point de la carte est dans la pile de traitement
        end ;
    var X,Y,i,j,k,P :  integer ;
    begin
    // teste si les points de départ et d'arrrivée sont sur des obstacles
    if MAP_IsPathOk(StartPathX,StartPathY) and MAP_IsPathOk(EndPathX,EndPathY)
       then begin
            // allocation d'espace dans la pile
            result:=-1 ;
            SetLength(PointX,grid.nbx*grid.nby) ;
            SetLength(PointY,grid.nbx*grid.nby) ;
            SetLength(PointP,grid.nbx*grid.nby) ;
            // il faut aussi allouer le tableau workarray à 2 dimensions
            // qui comporte autant de cases que la carte + bordure exterieure
            // init du tableau à 0 sauf obstacle à -1
            // toutes les cases de la bordure extérieure en tant qu'obstacle
            for i:=0 to grid.nby-1 do for j:=0 to grid.nbx-1 do
                if Map_isPathOK(i,j)
                   then workarray[i,j]:=0
                   else workarray[i,j]:=-1 ;
            // mettre le point de départ dans la pile
            // istart/iend=premier/dernier point à traiter
            istart:=0 ;
            iend:=0 ;
            for i:=0 to grid.nby do workarray[grid.nbx,i]:=-1 ;
            for i:=0 to grid.nbx do workarray[i,grid.nby]:=-1 ;
            PointP[0]:=-1 ;
            PointX[0]:=StartPathX ;
            PointY[0]:=StartPathY ;
            while (iend>=istart) do begin
            // traiter tous les points de la pile jusqu'à tomber sur le point d'arrivée
                 X:=PointX[istart] ; Y:=PointY[istart]   ;
                 if (X=EndPathX) and (Y=EndPathY)
                    then begin
                         // on tombe sur l'arrivee : bingo
                         result:=0 ;
                         iend:=-1 ;
                         end
                    else begin
                    // on traite les points voisins de Istart en évitant le point précédent (P)
                    // si le point voisin n'est pas un obstacle et s'il n'a pas été traité, on l'ajoute à la pile
                         P:=PointP[istart] ;
                         if (P>=0) and (PointX[P]<>X)
                            then begin
                                 if (Y>0) and (workArray[X  ,Y-1]=0) then AddPoint(X  ,Y-1) ;
                                 if           (workArray[X  ,Y+1]=0) then AddPoint(X  ,Y+1) ;
                                 if (X>0) and (workArray[X-1,Y  ]=0) then AddPoint(X-1,Y  ) ;
                                 if           (workArray[X+1,Y  ]=0) then AddPoint(X+1,Y  ) ;
                                 end
                            else begin
                                 if (X>0) and (workArray[X-1,Y  ]=0) then AddPoint(X-1,Y  ) ;
                                 if           (workArray[X+1,Y  ]=0) then AddPoint(X+1,Y  ) ;
                                 if (Y>0) and (workArray[X  ,Y-1]=0) then AddPoint(X  ,Y-1) ;
                                 if           (workArray[X  ,Y+1]=0) then AddPoint(X  ,Y+1) ;
                                 end ;
                         inc(istart) ;
                         end ;
                 end ;
            end
       else result:=-1 ;
    if result=0 then begin
      // on réutilise les tableaux POintX/PointY en partant du dernier élément pour stocker le chemin
      // istart = dernier point traité de la pile (en début de while, c'est l'arrivée, à la fin c'est 0 =départ)
      // iend = point du chemin stocké dans la fin de tableau
      iend:=grid.nbx*grid.nby-1 ;
      //  on trouve la longueur et le chemin parcourt les liens de la pile (liste des prédecesseurs en partant de l'arrivée)
      while istart>=0 do begin
            PointX[iend]:=PointX[istart] ; PointY[iend]:=PointY[istart] ;
            dec(iend) ; inc(result) ;
            istart:=PointP[istart] ;
            end ;
      dec(result) ;
      // tracé du chemin (on parcourt la fin de tableau en déscendant)
      for i:=grid.nbx*grid.nby-1 downto iend+1 do begin
          MapCell[PointX[i],Pointy[i]]:=-3 ;  //  marque la case comme apparenant au chemin
          Map_DrawCell(PointX[i],Pointy[i]) ;
          end ;
      end ;
    end ;

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Tu as un exemple d'algorithme de tracé de chemin avec obstacle dans le package pédagogique de RM Di Scala télechargeable sur le site.

  8. #8
    Membre régulier Avatar de poly128
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 73
    Points
    73
    Par défaut
    Enfin ca marche!!! Merci graffito, ta fonction marche a merveille.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Oublie pas de mettre "resolu" dans ton titre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver l'arborescence des plus courts chemins (algorithme de Bellman-Ford)
    Par geforce dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 11/03/2015, 05h39
  2. JAVA - Trouver l'arborescence des plus courts chemins
    Par geforce dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 24/02/2015, 16h11
  3. Trouver les chemins les plus courts avec l'algorithme de Bellman-Ford
    Par geforce dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 06/02/2015, 16h28
  4. Trouver le k-ème plus court chemin
    Par zamato dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 31/08/2011, 21h56
  5. algorithme de Ford (recherche chemin le plus court)
    Par abstraite dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/05/2005, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo