(1) 2 »


Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Salut !

J'avais envie de faire un peu de Python, et j'ai eu l'idée de commencer un jeu de type tower defense. Dans ce type de jeu, tout tourne autour du pathfinding, donc j'ai commencé par là.

Le blend

Vous pouvez éditer la map directement dans le script avec :
X = obstacle
A = arrivée
D = départ


Au démarrage du jeu la map est construite, le chemin est calculé et il est affiché en vert.



J'ai choisi l'algo A* qui n'est pas très compliqué mais qui a l'avantage de toujours donner une solution si elle existe.

Dans mon cas il est un peu simplifié car la zone de jeu est une grille, un échiquier : les "nodes" ont donc tous 4 voisins (NESW), et ils sont tous à la même distance (1).

Pour le moment ça fonctionne bien, mais le code est vraiment crado. Je dois isoler ce qui relève du pathfinding et le coller dans un fichier py, pour que ça soit plus pratique. Et surtout vérifier les paramètres passés aux fonctions, ce genre de petits détails Mais je montre déjà parce que je suis friand de conseils sur ces sujets.

J'aimerais bien obtenir un algo que tout le monde puisse utiliser dans ses projets BGE, sans rien avoir à coder ; on en est pas encore là..

Contribution le : 14/11/2012 19:36
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
OverdOzed
Inscrit:
19/01/2008 03:25
De tu voit le nuage sur la carte météo bin j'habite là
Post(s): 2554
alors:

1 déjà c''est vraiment sympa comme code

2 donne des noms explicite a tes variables pour simplifier la lecture de ton code

3 toi tu appelle le module init et tu lui dit de rien faire si il a déjà était appeler autant faire l'inverse
dans ta fonction main
if not 'init' in own:
init()

4 pour la suite il serait intéressant de crée une fonction qui recherche de vrai objets pour crée la map parce que avec le système actuel faire une grande map risque de devenir compliqué

5 ton truc pourrait devenir un super module GPS avec un peu de travail en plus

Contribution le : 16/11/2012 10:28
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Salut moaaa, j'avoue que j'étais impatient de te lire sur ce sujet

1. merci, pour un premier programme en python je suis content
2. et 3. c'est noté. j'ai pompé le système d'init sur un des tutos que j'ai trouvé, mais de toute façon je ne l'utilise pas vraiment puisque je n'ai rien dans ma boucle update.

4.Tu veux dire créer la map dans Blender, et c'est le programme qui "traduit" ça en tableau ? Oui c'est une bonne idée je n'y avais pas pensé.
Mais de toute façon je dois m'arranger pour que le joueur puisse placer des obstacles pendant le jeu, donc à la limite ça peut facilement se transformer en éditeur de map

5.Ouep, ce serait chouette


Bon j'ai un peu avancé. Comme le pathfinding n'utilise en rien le module bge, il est utilisable pour n'importe quel programme en python, donc j'en ai fait un module. Il est à fignoler, mais en l'état il est à peu près utilisable. Je le publie en gpl dès que possible.

Je teste le système de placement des tourelles, a priori je devrais pouvoir m'en sortir sans trop de galères. La grosse interrogation, c'est que je vais devoir tester, avant d'autoriser le placement, que la tourelle ne rend pas le pathfinding bloquant ; et dans l'idéal, sans que ça ralentisse le jeu. C'est là que je vais voir comment ma fonction s'en sort en temps réel.


J'ai pas mal de questions sur l'organisation du programme. On trouve plein d'infos sur comment organiser un projet python, mais peu sur comment organiser un projet BGE. Est-ce que je dois créer un seul script sur un objet quelconque et l'appeler avec un always, puis tout gérer depuis là ? Ou alors plein de petits scripts sur chaque objet ?

Est-ce que pour utiliser un Sensor en python, il doit forcément être connecté par une brique logique, ou bien je peux le créer à la volée ?

Est-ce que je peux facilement éditer les scripts avec un vrai éditeur de texte ? Je n'ai réussi à le faire que pour des modules, pas pour les scripts appelés par une brique logique.

Ah et une petite question rhétorique, c'est quoi ce cirque avec les tabulations et les espaces ? J'ai passé 1/2 heure à comprendre pourquoi mon module ne fonctionnait pas, je l'avais copié-collé depuis l'éditeur de blender vers kate, ce qui m'a fichu un cirque pas possible en me doublant chaque indentation.. Faut que je trouve une astuce pour la prochaine fois

Contribution le : 16/11/2012 16:13
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
OverdOzed
Inscrit:
19/01/2008 03:25
De tu voit le nuage sur la carte météo bin j'habite là
Post(s): 2554
pour les problèmes de tabulations c'est parce que par défaut convert tab as space est cocher dans l'éditeur de texte je te l'accorde c'est très c*****

Contribution le : 16/11/2012 17:11
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Comme promis, je publie (en GPL tant qu'à faire) le module de pathfinding. Il ne fait pas appel à des fonctions du bge, il peut donc être utilisé dans n'importe quel programme python

Le .zip contient le module en lui même et un .blend simple pour l'essayer*. Une doc rudimentaire est en commentaires au début du module.

Je ne prétends pas que le code puisse servir d'exemple, ni qu'il offre de bonnes performances, ni d'ailleurs qu'il n'existe pas déjà un module bien plus efficace... Mais on sait jamais ça peut servir


edit : * il faut décompresser le zip pour que ça fonctionne, je n'ai pas réussi à "packer" le module

Contribution le : 21/11/2012 19:23
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
OverdOzed
Inscrit:
20/10/2012 05:53
Post(s): 485
Hi, merci pour le partage.

Je viens de télécharger ton archive. Intéressant cet algo, ça peut servir en effet!

Au passage juste un p'tit conseil: quand tu mets des commentaires au début d'une fonction (ou d'une class) mets-les entre triple guillemets """ ...[coms]... """"; ça s'appelle un "docstring".
Par la suite python offre des outils qui permettent de générer une doc (utile pour ceux qui vont utiliser ton script) sur ton programme à partir de ces docstring.

Penses-y ça vaut le coup, surtout si tu distribues, ton code.


Autre chose, pour élargir ton fonctionnement avec la map (var ma_map, ligne 339), tu peux regarder du côté du format json. Tu mets tes maps dans un(des) fichier(s) json, et au lancement de ton appli (ou quand tu veux durant ton programme), tu génères tes maps à partir de json.
Tu peux imaginer du coup un choix aléatoire de maps, ou défini en fonction des actions utilisateurs, etc...


Bonus, les liens qui vont avec tout ça:

* docstring -> http://www.python.org/dev/peps/pep-0257/
* python et json -> http://docs.python.org/2/library/json.html
* json -> http://www.json.org/


Extra bonus:

* python, guide de style pour l'écriture de code -> http://www.python.org/dev/peps/pep-0008/
* geany, un éditeur de code multilanguage -> http://www.geany.org/ (en plus de toutes ses chouettes features, ce logiciel gère les remplacements de tabulations par des espaces (et inversement) dans tes fichiers (facile et partique))

Bonne continuation! Eclate-toi bien avec Blender et Python!

Contribution le : 22/11/2012 04:26
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Salut, merci pour tes conseils. Les docstrings et le guide de style vont bien me servir.

Pour la map, j'ai commencé à écrire le code pour la parser depuis un simple fichier texte. Je vais regarder ce que pourrait m'apporter json.

Geany a l'air puissant mais étant sous KDE je reste avec Kate qui me va très bien

Contribution le : 22/11/2012 16:17
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
OverdOzed
Inscrit:
19/02/2009 16:27
De Un peu plus à l'ouest...
Post(s): 475
Salut !

Ton script va me servir, ça c'est sûr ! :)

Cependant, voici ce que j'ai relevé :

• Il y a beaucoup d'espaces dans ton code ! Et des retours à la ligne non justifiés. Un peu ça améliore la lisibilité, beaucoup ça perd le lecteur
• Fait attention ! Tu nommes une variable "map". Mais ce mot désigne une fonction intégrée à python. En soi, ton code reste fonctionnel, mais par principe, évite d'utiliser des mots réservés...
• Dans la fonction noeuds_voisins, lorsque tu collectes la valeur de retour de la fonction obstacles, tu mets une syntaxe pas très "pythonnique", si j'ose dire :
À ceci :
if (obstacle(tmp,map)==0):
            voisins.append(tmp)

Préfère cela :
if (!obstacle(tmp,map)):
            voisins.append(tmp)

• La vérification des variables, c'est super, et l'utilisation d'une liste pour récolter les messages d'erreurs, c'est une bonne idée. Mais ça n'est pas assez verrouillé : les vérifications que tu effectues dans des boucles for ajoutent autant de fois le message d'erreur à la liste qu'il y a d'erreurs. Un seul exemplaire de chaque message serait plus compréhensible pour le lecture du rapport d'erreurs.
• En restant dans le rapport d'erreurs, il n'est pas très lisible, je trouve : on obtient une liste issue d'un print(liste_d'erreurs) (ou tout comme) alors qu'en parcourant la liste, on pourrait faire une présentation plus compréhensible. Après, certains préfèrent laisser les rapports d'erreurs inbouffables, c'est ton droit si tu es l'un d'eux.
• Pareil, pour les erreurs, je pense que tu mets deux conditions identiques à la suite pour le retour à la ligne. Certaines seraient simplifiables en une seule, et en remplaçant un code du genre : ("\n" => Retour à la ligne)

(Lignes 193-194)
if verbose>1: print(" ")
if verbose>1: print("-- a* - itération " + str(j) + " -----------------------------")

par un truc de ce style :
if verbose>1: print("\n-- a* - itération " + str(j) + " -----------------------------")



Bon, là je pinaille, c'est vraiment un bon bout de code :)
Merci à toi !

Contribution le : 22/11/2012 18:09
_________________
« Affirmation sans argumentation est signe de confusion ! »
Le mot de la fin : « Meeeeeuuuuuhhhh ! »
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Merci pour tes conseils !

Citation :
Fait attention ! Tu nommes une variable "map". Mais ce mot désigne une fonction intégrée à python.
Ah c'est pour çà qu'elle s'affichait en bleu

Citation :
Après, certains préfèrent laisser les rapports d'erreurs inbouffables, c'est ton droit si tu es l'un d'eux.
Non, c'est surtout que je ne sais pas trop comment gérer les erreurs. Là je l'ai "printé", mais je pense qu'il vaudrait mieux que je "return" la liste des erreurs, qu'est-ce que tu en penses ?


Pour tout ce qui est en "verbose", en fait c'était des prints de test qui m'ont servi pendant le debug, donc c'est du vite fait mal fait. Je les ai laissé pour que les curieux puissent avoir des infos sur le déroulement de l'algo

Contribution le : 22/11/2012 18:38
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Pathfinding en python
OverdOzed
Inscrit:
20/10/2012 05:53
Post(s): 485
Citation :

_tibo_ a écrit:
Merci pour tes conseils !

...il vaudrait mieux que je "return" la liste des erreurs...



Ton return faut que tu puisses l'exploiter, donc soit l'afficher (d'une manière ou d'une autre), soit utiliser sa valeur.

Exemple:

def youpi():
    x = y
    return x

test = youpi()



Maintenant tu fais quoi de 'test'? Si tu fais pas un print ou autre chose pour connaître sa valeur, tu ne sauras pas ce que contient 'test' (en admettant que tu ne connaisses pas la valeur de 'y').


Sinon pour revenir à json, tu te demandais à quoi ça allait te servir...
Considère que là pour exploiter json, tu vas passer par un module python. Donc avec toutes les outils qu'il contient. Et ça ouvre des perspectives.

Comme toujours, regarde la doc! Module json:

http://docs.python.org/2/library/json.html

Contribution le : 23/11/2012 05:40
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
[WIP] et travaux terminés [WIP] Kanata et personnage secret coucours Blender 3D France 1 10 Aujourd'hui 16:58:10
meltingman 
Questions & Réponses Boids, boids, boids... 1 53 Aujourd'hui 13:12:07
meltingman 
The Blender Clan 'tchat Ralentissement du chargement de Blender 5 60 Aujourd'hui 12:57:15
Bibi09 
Le coin des geeks gain de fluidité viewport entre ryzen 3900X et 3950X    [1][2] 13 307 Aujourd'hui 11:04:42
Bibi09 
The Blender Clan 'tchat Avenir du blender clan    [1][2][3]...[12] 115 7448 Hier 20:08:54
Bibi09 
The Blender Clan 'tchat Benchmark EEVEE    [1][2] 19 487 Hier 20:08:01
JaAlVir657 
Questions & Réponses application de texture à taille réelle sur objets 3D simples 4 88 Hier 12:52:58
jc223 
Questions & Réponses Anomalies visuelles lors d'un export vidéo 4 70 Hier 10:37:47
Bibi09 
[WIP] et travaux terminés [terminé] Blender 2.9 Tracking Camera - Tutoriel en Français 0 39 Hier 01:58:17
meltingman 
[WIP] et travaux terminés [WIP] Teeny Tiny - Story    [1][2][3]...[10] 92 7132 16/09 19:10:38
Bibi09 
Questions & Réponses [WIP] Cours Blender 2.9 une proposition de liste 5 334 16/09 14:20:42
CBY 
[WIP] et travaux terminés [WIP] Court métrage de sauvegarde des tortues marines 3 154 15/09 23:31:29
meltingman 
Questions & Réponses Médaille club de karate 3 151 15/09 15:25:10
meltingman 
Questions & Réponses Dimininuer la déformation avec une texture transparente (Cycles) 3 156 15/09 09:32:10
Gabdng 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Nouvelle mise à jour Steam    [1][2][3]...[63] 621 104022 14/09 23:19:41
Bibi09 
Questions & Réponses Fichier blender volumineux 4 184 14/09 21:57:38
Rimpotche 
Questions & Réponses Feu avec EEVEE 8 187 14/09 17:53:58
Crocodile_13 
Hors Sujet !! Tutoriel : Strasses et paillettes #eevee #debutant #blender2.8 4 130 14/09 17:25:05
Bibi09 
Questions & Réponses alignement d'une primitive géométrique sur un nuage de points 3 198 14/09 08:13:00
Sziuny 
Hors Sujet !! Tuto vidéo soft Body 2.8 les base et avancés 3 153 13/09 22:05:57
Bibi09 

Qui est en ligne
162 utilisateur(s) en ligne (dont 113 sur Forums)

Membre(s): 0
Invité(s): 162


plus...
Nouveaux membres
GidgetCort 18/9/2020
jc223 16/9/2020
clarasarah42 15/9/2020
Gabdng 15/9/2020
Brigade 12/9/2020
Le_Moko_67 12/9/2020
cottarts 8/9/2020
Babalou27 8/9/2020
charlyone 6/9/2020
caydave973 6/9/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 9
BUG de Lyon
plus 264 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445