Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker


Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Jeux: puie z / Jeux: Citymaime - Chapitre 1 / Jeux: Mer, îles et fous / News: Du neuf dans le making / News: Muma|Rope est disponible en (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

287 connectés actuellement

30732117 visiteurs
depuis l'ouverture

2095 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Level Up!

Tashiroworld

Le Temple de Valor

New RPG Maker

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [R][Java] PathFinding en ligne droite


Mack - posté le 06/10/2013 à 20:18:49 (2310 messages postés) - staff -

❤ 0

Domaine concerné: Prog
Logiciel utilisé: [Java]
Salut !
Alors voila, en faite j'ai décider de reprendre mon projet La Tour du Crepuscule.
Et je cherche à refaire le système de création aléatoire de niveau.
J'ai réussis à faire à créer les salles en nombres et tailles aléatoires, les placer, mais je n'arrive pas à les relier.
Donc mon problème est "simplement" de relier deux points A et B, sans passer à l'intérieur des salles ( Mais les couloirs peuvent se croiser eux. ), et en étant le plus possible "droits".
Pour faire simple :
image
Le point Vert est le point de départ, et le Rouge l'arrivé.
Moi je voudrais avoir le chemin Noir, et pas le chemin Bleu.

Voila un autre petit dessin :
image
Les deux chemins Verts peuvent donc se croiser, mais ils ne peuvent pas rentrer dans les carrés Noirs.

Je pense que le mieux serait d'utiliser l'Algorithme AStar, mais impossible de trouver une explication "correcte" en français.

Si possible, je cherche des explications qui prennent le Java pour base, ça me sera moins compliquer que si c'est expliquer pour un langage.

Merci d'avance !

( Je prend note de tout les commentaires, même si je n'y répond pas )


zou - posté le 13/10/2013 à 16:37:52 (2197 messages postés)

❤ 0

Avec A* tu pourras pas faire des tracés le plus droit possible. Parce que il considère toujours le chemin le plus court. Ou alors il faut que tu le modifies. Tu peux faire une sorte de "priorité" pour les trajets droits, ce qui pénaliserait les changements de direction.

Par exemple quand tu testes la distance entre tes trois cases adjacentes praticables (celle à gauche, celle devant et celle à droite) tu augmentes "artificiellement" la distance pour les cases à gauche et à droite (ce sont celles qui te font changer de direction), du coup ton personnage va avoir tendance à toujours aller tout droit. A toi de voir de combien augmenter pour pas qu'il fasse n'importe quoi non plus ^^

J'avais fais une manip plus ou moins identique dans mon jeu pour que le personnage utilise au maximum les sentiers et évite l'herbe.

Par contre pour le tracé vert clair, je ne vois aucune solution, ton personnage va avoir tendance à coller le mur sur sa gauche au départ (point rose).


Tassle - posté le 13/10/2013 à 17:18:07 (5274 messages postés)

❤ 0

Disciple de Pythagolf

Bah ptêt que tu peux foutre un prix de mouvement très élevé sur les cases adjacentes aux salles pour que le chemin y passe le moins possible.

~~


Nukidoudi - posté le 13/10/2013 à 19:30:34 (736 messages postés) -

❤ 0

yo

Citation:

Parce que il considère toujours le chemin le plus court.


Ah bon?

https://xvw.lol


zou - posté le 13/10/2013 à 19:37:37 (2197 messages postés)

❤ 0

Citation:

Ah bon?


Tu veux dire quoi par là ?


Kno - posté le 13/10/2013 à 20:55:52 (4274 messages postés) - admin

❤ 0

IV L'Empereur

Je n'y ai réfléchit que très sommairement mais peut-être un truc dans ce genre ferait l'affaire:

-De base, tu traces depuis la porte un chemin de deux cases qui s'éloigne de la salle, et tu appliques l'algorithme sur l'extrémité de ces chemins plutôt que sur les portes.
-L'algo suit l'un des parcours en L d'un point à l'autre (tout horizontal puis tout vertical, ou l'inverse).
-S'il s'approche d'une salle, il la contourne jusqu'à retombe sur un de point d'un des L.

Par contre si on applique ça sur ton deuxième dessins le couloir vert clair va se superposer au vert foncé sur 5 case, je sais pas si ça pose problème?

Je suis venu ici pour corriger des bugs et botter des culs, et chez moi ça marche.


Mack - posté le 13/10/2013 à 22:02:47 (2310 messages postés) - staff -

❤ 0

zou a dit:


Citation:

Ah bon?


Tu veux dire quoi par là ?


Surement que AStar cherche pas le plus court, mais le chemin le moins coûteux ( Et c'est pas la même chose apparemment )


Kno a dit:


Je n'y ai réfléchit que très sommairement mais peut-être un truc dans ce genre ferait l'affaire:

-De base, tu traces depuis la porte un chemin de deux cases qui s'éloigne de la salle, et tu appliques l'algorithme sur l'extrémité de ces chemins plutôt que sur les portes.
-L'algo suit l'un des parcours en L d'un point à l'autre (tout horizontal puis tout vertical, ou l'inverse).
-S'il s'approche d'une salle, il la contourne jusqu'à retombe sur un de point d'un des L.

Par contre si on applique ça sur ton deuxième dessins le couloir vert clair va se superposer au vert foncé sur 5 case, je sais pas si ça pose problème?


-Si c'est pour éviter de coller les chemins aux salles, c'est pas graves, j'ai légèrement modifier le truc depuis ( CF plus bas )
-Pour les portes, je pensais plutôt qu'il choisirais le point le plus proche.
( En gros, je prend un mur de ma salle principale, et je trace un cercle autour avec un rayon qui augmente jusqu'à ce qu'il tombe sur une salle "libre". )
Après, oui faire que des chemins en L sera une bonne idée, mais aucune idée de comment le faire xD.

Pour la dernière question, non c'est pas grave, c'est même presque mieux, si possible j'aimerais justement que lorsque deux chemins sont côte à côte, ils se superpose ( Eviter d'avoir des couloirs de deux cases de largeurs donc ).


Zou :

Pour le chemin vert, y a pas de soucis, j'ai modifier légèrement le code, ce qui fait que autour de la salle y a un mur en plus dans lequel les couloirs ne peuvent pas être créé.

Je me doute que ça sera pas possible d'obtenir exactement ça, je voudrais juste avoir quelques choses le plus près de ça possible ^^.


Tassle : C'est ce que me propose Zou ^^.
J'y avais pas pensé, mais c'est une bonne idée, même si j'en suis pas encore là xD.

J'ai trouvé ce tutoriel :
http://www.game-corp.net/article-12-les-algorithmes-de-pathfinding.html

J'ai essayer de le suivre, mais j'arrive à rien :

Portion de code : Tout sélectionner

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
package mack.pathfinding;
 
import java.util.ArrayList;
 
public class Path {
 
        
        //Mes deux listes
        public ArrayList<Node> open;
        public ArrayList<Node> close;
 
        
        //Mes Nodes de départ et d'arrivé.
        public Node start;
        public Node end;
 
        
        //Ma carte
        public int[][] map;
 
        //Quand je demande de créer un chemin, j'initialise mes variables.
        public Path(Node s, Node e, int[][] m) {
                start = s;
                end = e;
 
                map = m;
 
                close = new ArrayList<Node>();
                open = new ArrayList<Node>();
        }
 
        //Je lance la création en essayant la première case.
        public void calc() {
                try_node(start);
        }
 
        public void try_node(Node n) {
                close.add(n);
                Node n2 = null;
 
                //J'essai sur la case de Droite
                //Si c'est passable
                if (passable(n.x + 1, n.y)) {
                        //Je créer une node, avec les coordonnées testées, et le parent.
                        Node n3 = new Node(n.x + 1, n.y);
                        n3.parent = n;
                        n3.F = calc_F(n3);
                        //Si elle est pas fermé, je l'ajoute dans la liste fermé, et si son F est plus petit que l'ancien
                        //F je remplace n2 par la nouvelle node.
                        //( Ca se voit pas ici puisque de toute façon c'est la première node )
                        if (!contains(n3)) {
                                n2 = n3;
                                close.add(n2);
                        }
                }
 
                //Et je teste comme ça les 4 cases autours.
                if (passable(n.x - 1, n.y)) {
                        Node n3 = new Node(n.x - 1, n.y);
                        n3.parent = n;
                        n3.F = calc_F(n3);
                        if (!contains(n3))
                                if (n2 != null) {
                                        if (n3.F > n2.F) {
                                                n2 = n3;
                                                close.add(n2);
                                        }
                                } else {
                                        n2 = n3;
                                        close.add(n2);
                                }
 
                }
 
                if (passable(n.x, n.y - 1)) {
                        Node n3 = new Node(n.x, n.y - 1);
                        n3.parent = n;
                        n3.F = calc_F(n3);
                        if (!contains(n3))
                                if (n2 != null) {
                                        if (n3.F > n2.F) {
                                                n2 = n3;
                                                close.add(n2);
                                        }
                                } else {
                                        n2 = n3;
                                        close.add(n2);
                                }
                }
 
                if (passable(n.x, n.y + 1)) {
                        Node n3 = new Node(n.x, n.y + 1);
                        n3.parent = n;
                        n3.F = calc_F(n3);
                        if (!contains(n3))
                                if (n2 != null) {
                                        if (n3.F > n2.F) {
                                                n2 = n3;
                                                close.add(n2);
                                        }
                                } else {
                                        n2 = n3;
                                        close.add(n2);
                                }
                }
                if (n2 != null) {
                        if (n2 != end) {
                                map[n2.x][n2.y] = 5;
                                open.add(n2);
                                try_node(n2);
                        } else {
                                System.out.println("QSD");
                        }
                }
 
        }
 
        //Vérifie si une node avec ces coordonnées existe déjà.
        private boolean contains(Node n3) {
                for (int i=0;i<close.size();++i)
                {
                        if (n3.x==close.get(i).x && n3.y==close.get(i).y)
                                return true;
                }
                return false;
        }
 
        //Je calcul le F  de la node
        public int calc_F(Node n) {
                int i = calc_manhatan(n);
                int j = calc_AN(n);
 
                return i + j;
 
        }
 
        //Je calcul la distance de Manhatan
        public int calc_manhatan(Node n) {
                int i = Math.abs(end.x - n.x) + Math.abs(end.y - n.y);
 
                return i;
        }
 
        //Et je calcul la distance AN ( Pas sur de celle là )
        public int calc_AN(Node n) {
                double i = Math.sqrt(Math.pow(start.x - n.x, 2)
                                - Math.pow(start.y - n.y, 2));
 
                return (int) i;
        }
 
        //Permet de savoir si je peux créer un chemin.
        public boolean passable(int i, int j) {
                if (i >= 0 && j >= 0 && i < map.length && j < map[0].length)
                        return map[i][j] == 0 || map[i][j] == 1; 
                return false;
        }
 
        
        //Permet de lancer le programme directement sans passer par le jeu en lui même.
        //Je m'en sert pour faire mes tests avec une map prè-créer.
        public static void main(String[] args) {
                System.out.println("START");
                
                //Ma map test.
                int[][] m = new int[][] { new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 2, 2, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 2, 2, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 2, 1, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                                new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
 
                //J'initialise mes Nodes de départ et d'arrivé.
                Node s = new Node(1, 1);
                Node e = new Node(6, 4);
 
                //J'essaie de créer un chemin.
                Path p = new Path(s, e, m);
 
                p.calc();
 
                //Me permet d'afficher dans la console le résultat.
                show_build(m, m.length, m[0].length);
        }
 
        public static void show_build(int[][] room, int x, int y) {
                for (int i = 0; i < x; ++i) {
                        System.out.println();
                        for (int j = 0; j < y; ++j) {
                                switch (room[i][j]) {
                                case 0:
                                        System.out.print(".");
                                        break;
                                case 1:
                                        System.out.print("O");
                                        break;
                                case 2:
                                        System.out.print("#");
                                        break;
                                case 5:
                                        System.out.print("H");
                                        break;
                                }
                        }
                }
        }
 
}
 




Et ça me donne ça à chaque fois :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
HHHH....HH
H.HH....HH
HO#H....HH
H##H....HH
HHHH.##.HH
HHHH.#O.HH
HHHH....HH
HHHH....HH
HHHHHHHHHH
HHH......H
HHHHHHHHHH


H c'est mon chemin, O c'est le point de départ et d'arrivé et les # sont les chemins pas traversables.


Et voila la Maj du schéma :
image
Avec en noir les murs "traversable" par le chemin, en rouge les murs non traversables, en vert le chemin que je souhaiterais avoir, et en bleu celui que j'aimerais éviter.

( Je prend note de tout les commentaires, même si je n'y répond pas )


TLN - posté le 14/10/2013 à 00:28:06 (16352 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Bon je vais utiliser des gros mots, mais j'ai la flemme de tout expliquer donc essaie d'aller sur Wikipédia s'il y a des trucs dans ma réponse que tu ne comprends pas :D


Donc déjà, tu peux modéliser ton problème par un graphe dont les sommets sont les pixels de ta map, et où tu mets des arêtes pour joindre deux sommets représentant des cases voisines (horizontales ou verticales dans ta map).

Dans l'algo de pathfinding classique, tu as ton graphe et à chaque arête tu associes un poids correspondant à la distance séparant les deux sommets voisins. Vu qu'ici on a pas de déplacement en diagonal, tu peux mettre tous tes poids à 1 ça ne changera rien (la métrique utilisée pour distance est en fait une Distance de Manhattan, cf. wikipédia).

Bref, dans ce cas très simple, un simple parcours en largeur du graphe devrais te donner ton plus court chemin facilement (là encore cf. Wikipédia).


Dans ton problème, tu cherches à trouver le plus court chemin en distance de Manhattan ET à minimiser le nombre de "virages" que tu fais. Une manière très simple de procéder et d'ajouter un coût de 1 à chaque fois que tu fais un virage dans ton chemin. Comment modéliser ça ? Simplement en dupliquant les sommets correspondant à chaque pixel. Tu en mets un pour les chemins "verticaux" et un pour les chemins "horizontaux". Et quand tu veux passer de l'un à l'autre, tu ajoutes une pénalité. Petit schéma fait à l'arrache pour illustrer le pb :

image

En noir : ta grille de pixel représentant la carte. Les points sont les sommets associés à chaque pixel (dupliqués). En violet c'est les liens joignant les pixels voisins (les liens verticaux et horizontaux sont séparés). Du coup, dès que tu veux passer d'un chemin "vertical" à un chemin "horizontal" tu devras passer par une arête verte et payer un coût de 1 (par exemple). Tu fais ça associé à un parcours en largeur ça devrait te donner la réponse que tu cherches de manière très efficace.

Apôtre du Grand Kirby tkt.


Mack - posté le 14/10/2013 à 19:28:53 (2310 messages postés) - staff -

❤ 0

Et si j'ai rien compris je fais comment ? :F.

En faites, c'est la partie avec le Graphes que je comprend pas. Enfin, je comprend pas l'intérêt, en faite :/.
Après, je pense que je comprend ce que tu essayes de m'expliquer, mais j'arrive pas à comprendre comment le programmer ^^".




Enfin, déjà, je pense que le mieux c'est que j'arrive à relier mes deux points sans contrainte spécifique xD.
( Autres que de pas passer dans les endroits interdits xD. )
Cf le message au dessus si y a des gens qui connaisse pas le "nouveau" problème ^^.

( Je prend note de tout les commentaires, même si je n'y répond pas )


TLN - posté le 14/10/2013 à 19:52:56 (16352 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Ben euh pourtant un graphe c'est pas compliqué quoi mince. T'as des points qui s'appellent des sommets, et tu les relies par des traits que t'appelle des arêtes. Deux sommets reliés par une arête sont dits voisins.

Un parcours en largeur d'un graphe ça consiste à partir d'un sommet x, à regarder tous voisins et à les ajouter à une liste L de sommet "à visiter". Une fois que tu à fini, tu recommences en prenant le premier sommet de L, tu l'enlèves, tu regardes ses voisins (ceux qui n'ont pas déjà été visités), et à les ajouter aussi dans L. En retirant les sommets de L dans l'ordre où ils ont été ajoutés, tu fais un parcours dis "en largeur" qui explore les sommets par distance croissante à ton sommet de départ.

Enfin là j'explique très sommairement mais mec j'ai envie de dire que si tu sais pas ce que c'est qu'un graphe faut que t'arrête de coder quoi xD

Apôtre du Grand Kirby tkt.


Kno - posté le 14/10/2013 à 19:56:46 (4274 messages postés) - admin

❤ 0

IV L'Empereur

Oui, les graphes c'est juste indispensable en fait. J'ai réussi à faire marcher ton code mais il n'est pas fonctionnel (ou l'inverse). L'algorithme est trop "téméraire", il trace le chemin sans savoir ce qu'il y a vraiment devant lui, donc il a tendance à foncer dans les murs et a plus trop savoir où aller après. Et aussi le fait qu'il teste les différentes directions possible l'une après l'autre, donc en cas d'égalité de distance il en prend une arbitrairement et ça peu donner des trucs assez aberrant. Avec un graphe tu peux lancer un algorithme qui prend en compte l'ensemble de la carte.

Autrement voilà le code corrigé

Portion de code : Tout sélectionner

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.io.*;
import java.util.Vector;
 
public class Path {
 
        public Node[] startEnd;
        public char[][] map;
        //J'ai viré les deux ArrayList parce que j'ai pas trop compris à quoi elles servaient en fait.
        
        //lecture de la carte et des coordonnées de départ arrivé à partir d'un txt parce que c'est plus pratique, quand même :p
        public Vector<String> lectureMap(String file){
                FileReader fread=null;
                Vector<String> vec=new Vector<String>();
                int c=0;
                int cnt=0;
                String strtmp=new String();
                startEnd=new Node[2];
                try {
                        fread =new FileReader(file);
                } catch (FileNotFoundException e) {
                        System.out.println("Nom de fichier invalide");
                }
                do{
                        try {
                                c= fread.read();
                        } catch (IOException e) {
                                System.out.println("Erreur lors de la lecture");
                        }
                        if((char)c=='\n'){
                                if(cnt<2){
                                        String[] coord=strtmp.split(",");
                                        startEnd[cnt]=new Node(Integer.parseInt(coord[0]),Integer.parseInt(coord[1]));
                                        cnt++;
                                        strtmp=new String();
                                }
                                else{
                                        vec.add(strtmp);
                                        strtmp=new String();
                                }
                        }
                        else{
                                strtmp=strtmp+(char)c;
                        }
                }while(c!=-1);
                strtmp=strtmp.substring(0,strtmp.length()-1);
                        vec.add(strtmp);
                        map= new char[vec.size()-1][];
                        for(int i=0; i<vec.size()-1; i++){
                                map[i]=vec.elementAt(i).toCharArray();
                        }
                show_build(map);
                return vec;
        }
 
        public void calc() {
                try_node(startEnd[0]);
        }
 
        public void try_node(Node n) {
                Node n2 = new Node(-1,-1);
                n2.F=map.length*map[1].length;
                for(int i=1; i<5; i++){
                        /*, pour éviter la redondance de code j'ai numéroté les cases adjacentes de 1 à 4 et j'ai bidouiller
                        des formules qui donnent les variations de x et de y en fonction numéro de case, et j'ai fourré le tout
                        dans un "for*/
                        int modX=(i%2)*(int)Math.pow(-1,(-i/3));
                        int modY=((i+1)%2)*(int)Math.pow(-1,(-i/4));
                        System.out.println(passable(n.x+modX,n.y+modY));
                        if (passable(n.x+modX,n.y+modY)) {
                                Node n3 = new Node(n.x+modX,n.y+modY);
                                n3.parent = n;
                                //J'ai viré la distance de AN parce qu'elle faisait faire un peu n'importe quoi. 
                                n3.F = calc_manhatan(n3);
                                if (n2 != null&&n3.F <= n2.F) {
                                        System.out.println("n2:"+i);
                                        n2=n3;
                                }
                        }
                
                if (n2 != null) {
                        if (n2.x==startEnd[1].x&&n2.y==startEnd[1].y) {
                                System.out.println("QSD");
                        }
                        else {
                    map[n2.x][n2.y] = '5';
                                show_build(map);
                    try_node(n2);
                        }
                }
        }
 
        public int calc_manhatan(Node n) {
                return (int) (Math.abs(startEnd[1].x - n.x) + Math.abs(startEnd[1].y - n.y));
        }
 
        public boolean passable(int i, int j) {
                if (i >= 0 && j >= 0 && i < map.length && j < map[0].length)
                        return map[i][j] == '0' || map[i][j] == '1'; 
                return false;
        }
 
        public static void main(String[] args) {
            Path p=new Path();
                p.lectureMap("map.txt");
                System.out.println("START");
                        p.calc();
                        show_build(p.map);
        }
 
        public static void show_build(char[][] room) {
            for (int i = 0; i < room.length-1; ++i) {
                System.out.println();
                for (int j = 0; j < room[i].length-1; ++j) {
                    switch (room[i][j]) {
                            case '0':
                                    System.out.print(".");
                                    break;
                            case '1':
                                    System.out.print("O");
                                    break;
                            /*J'ai modifié le code pour le départ (3), pour en retirer la passabilité sinon
                            dans certains cas le chemin peut revenir en arrière.*/
                            case '3':
                                        System.out.print("0");
                                        break;
                            case '2':
                                    System.out.print("#");
                                    break;
                            case '5':
                                    System.out.print("H");
                                    break;
                    }
                }
            }
        }
 
}
 


Le fichier texte c'est de ce format là:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
2,1,
5,6,
0000000000
0000000000
0320000000
0220000000
0000022000
0000021000
0000000000
0000000000
0000000000
0000000000
0000000000


Ne pas oublier la deuxième virgule après les coordonnées sinon ça marche pas (je sais pas d'où ça vient)

Pour ce qui est des gros aberrations, voilà celle que j'ai rencontrée:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
..........
..........
H0#.......
H##.......
HHHHH##...
....H#O...
..........
..........
..........


Jusque là tout va bien.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
..........
..........
H0#.......
H##.......
HHHHH##...
...HH#O...
..........
..........
..........


Sauf que là les deux choix possibles sont à égale distance de la fin, et le code fait que la gauche est prioritaire sur le bas. Donc le chemin fait demi-tour.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
..........
..........
H0#.......
H##.......
HHHHH##...
HHHHH#O...
H.........
..........
..........


La même chose se passe sur tout la ligne, jusqu'à ce que le bord vienne bloquer la gauche.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
..........
..........
H0#.......
H##.......
HHHHH##...
HHHHH#O...
HHHHHHH...
..........
..........


Au final on obtient ça.

Je suis venu ici pour corriger des bugs et botter des culs, et chez moi ça marche.


Mack - posté le 16/10/2013 à 17:34:45 (2310 messages postés) - staff -

❤ 0

Je comprends juste pas l'intérêt de faire un graphe, c'est tout hein.


Bon, finalement, après avoir batailler pendant plusieurs jours, j'ai finalement réussis à faire ce que je voulais.


Kno :
Ouais, j'aurais pu utiliser un .txt, m'enfin, faudrait que je modifie la création de la map pour la sauvegarder dans un .txt. Et ça me parait pas être une super idée ^^".
( A la limite, une fois que j'ai relié les salles, ça peut peut être ce faire. J'vais voir de ce côté là. )

( Je prend note de tout les commentaires, même si je n'y répond pas )


TLN - posté le 16/10/2013 à 17:54:30 (16352 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Ben Mack un graphe c'est juste un modèle abstrait de ton problème. Une fois que tu as exprimé ton problème sous forme de graphe tu peux sortir toute l'artillerie de la théorie des graphes derrière et résoudre très simplement ton problème avec un algo ultra classique et ultra basique.

Apôtre du Grand Kirby tkt.


Mack - posté le 16/10/2013 à 18:30:54 (2310 messages postés) - staff -

❤ 0

Hmm ... En faite, j'ai compris où je coinçais.
Un graphe pour moi c'étais ça :
image
Pas un petit dessins comme t'as fait plus haut.
Donc je comprenais pas comment avec un truc comme ça on pouvait "plus facilement" résoudre mon problème.
( Qui d'ailleurs était de le coder, et pas de comprendre comment faire ^^" )

Mais du coup, oui je comprend à quoi ça sert.
( Enfin, je comprenais déjà l’intérêt de ton dessin avant d'avoir compris ce que t'entendais par Graphe, m'enfin xD. )


Par contre, si c'est pas ça, je suis complètement stupide :F.

( Je prend note de tout les commentaires, même si je n'y répond pas )


TLN - posté le 16/10/2013 à 22:38:24 (16352 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Ben justement moi je parle de ces graphes là :
http://fr.wikipedia.org/wiki/Th%C3%A9orie_des_graphes
http://en.wikipedia.org/wiki/Graph_(mathematics)

Le parcours en largeur :
http://en.wikipedia.org/wiki/Breadth_first_search

La distance de Manhattan :
http://en.wikipedia.org/wiki/Manhattan_distance

Apôtre du Grand Kirby tkt.


Anton_ - posté le 17/10/2013 à 13:19:46 (1535 messages postés)

❤ 0

Ah bah, la théorie des graphes, c'est une des matières qu'on enseigne, là où je suis. X)
Sommets, Arêtes, arbres, chemins, cycles, etc ... Si tout cela aide à bien s'organiser en programmation (et pas que), il faudra en faire un topic [/hs]

Raetribution | Megamike || tutos : 1 2 || Une bonne dose de maths pour la route


Nukidoudi - posté le 17/10/2013 à 14:00:48 (736 messages postés) -

❤ 0

yo

Ne parles-t-on pas de "digraphe" (graph dirigé) pour éviter l'ambiguité ?
On peut aussi se soustraire aux graphes en utilisant des ensembles.

https://xvw.lol


TLN - posté le 17/10/2013 à 14:33:02 (16352 messages postés) - honor

❤ 0

Architecte d'Outre-Mondes

Euh non dans le cas d'une map en pixel tes arêtes ne sont pas dirigées (tu peux aller dans les deux sens).

Apôtre du Grand Kirby tkt.


Nukidoudi - posté le 17/10/2013 à 15:04:01 (736 messages postés) -

❤ 0

yo

Il n'y a pas de sens de passabilité ? (Sous VXAce et XP oui, donc le graphe est dirigé).

https://xvw.lol

Index du forum > Entraide > [R][Java] PathFinding en ligne droite

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers