(1) 2 »


Pathfinding en python
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11301
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): 11301
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): 11301
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): 11301
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): 11301
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
Questions & Réponses Blender : le bon logiciel ?    [1][2][3] 20 2631 Hier 21:46:14
Rimpotche 
Questions & Réponses Problème de collision dans un player FPS 4 114 Hier 19:33:24
vegetalain 
Hors Sujet !! Le petit déjeuner à la Française - série de tutos - 2.9 6 77 Hier 18:03:25
meltingman 
Questions & Réponses impression 3d avec blender et créatily 2 76 Hier 09:14:58
Lady 
Hors Sujet !! Quels secteurs exploite l'impression 3D ? 3 92 28/10 15:56:59
Sziuny 
Hors Sujet !! Un poisson clown low poly - 15 mm - Tutoriel - 2.9 3 97 28/10 13:09:07
debutant 
Questions & Réponses Affiner les contours d'un feu 1 410 28/10 13:09:01
Melodicpinpon 
[WIP] et travaux terminés [terminé] Scène de Pti dej à la Française - EVEE a donf - 2.9 Blender    [1][2][3]...[5] 44 661 27/10 20:44:23
meltingman 
Questions & Réponses Peindre des voxels 3D: Est-ce possible? 0 45 27/10 17:23:30
Melodicpinpon 
Questions & Réponses Disparition de matériaux après système de particule 2 75 27/10 12:43:02
Zarathoustra 
Questions & Réponses Esalier avec ARRAY 4 64 27/10 11:04:28
francerf 
Questions & Réponses [résolu] Modificateur Curve sur une courbe multiple 3 77 27/10 09:29:38
oliviertij 
[WIP] et travaux terminés [WIP] Teeny Tiny - Story    [1][2][3]...[13] 125 10213 27/10 01:53:31
meltingman 
The Blender Clan 'tchat Pour les arboriculteurs 3D 2 161 26/10 21:47:01
iet 
Questions & Réponses [résolu] Placer sa camera sur un HDRI    [1][2] 11 427 26/10 14:38:31
Crocodile_13 
Questions & Réponses [WIP] Problème Rétopo    [1][2] 10 163 26/10 09:53:59
Laorz 
Questions & Réponses Prioriser la visibilité d'un objet ? 2 94 25/10 17:31:26
Rimpotche 
[WIP] et travaux terminés image couteau dans caillou qui saigne 2 97 25/10 07:03:37
Crocodile_13 
[WIP] et travaux terminés [terminé] Chaussures Très Réalistes (.bend disponible) 5 197 24/10 21:23:47
Crocodile_13 
Le coin des geeks gain de fluidité viewport entre ryzen 3900X et 3950X    [1][2][3] 28 1508 24/10 15:45:54
papillon 

Qui est en ligne
278 utilisateur(s) en ligne (dont 119 sur Forums)

Membre(s): 1
Invité(s): 277


KimberleyC, plus...
Nouveaux membres
KrystalCar 29/10/2020
LonnyCradd 29/10/2020
JaymeToome 29/10/2020
DianeTunne 29/10/2020
KimberleyC 29/10/2020
Juan28S82 29/10/2020
LinoJansse 29/10/2020
Lady 28/10/2020
VINCHZ 27/10/2020
yawdpwal 26/10/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