(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
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[22] 218 21489 Hier 16:17:44
moonboots 
Moteur de jeu GameBlender et alternatives [WIP] Godot Engine - Projet Arsenal    [1][2] 18 1266 22/10 16:38:22
Redstar 
Questions & Réponses Pousser le pc au max 3 121 22/10 11:07:37
xjoce 
Questions & Réponses [non résolu] Problème de vide 1 67 21/10 18:09:50
sapajou 
Le coin des geeks vitesse d'un rendu EEVEE Windows/Linux 4 73 21/10 18:01:09
sapajou 
[WIP] et travaux terminés [WIP] La gabarre '' Le Gros Ventre''    [1][2][3]...[10] 98 17625 21/10 15:53:58
Guiu 
Questions & Réponses Armature en IK sur squelette complexe 2 81 21/10 11:37:34
Thewada 
Questions & Réponses [résolu] Os et FBX 3 248 20/10 16:15:38
zeromeetsinfinity 
Moteur de jeu GameBlender et alternatives [non résolu] Cs (vaisseau)    [1][2][3]...[56] 559 170959 20/10 11:06:51
Redstar 
Questions & Réponses texture procédurale qui suis une plane 2 123 20/10 10:19:22
Many 
Questions & Réponses Vertex groups qui disparaissent 0 50 20/10 09:09:22
Melodicpinpon 
Questions & Réponses MeasureIt et dpi 4 934 20/10 09:02:36
jcnouveau 
Questions & Réponses De Maya vers Blender concordance de axes. 9 172 19/10 17:04:59
Bibi09 
Questions & Réponses [résolu] Enlever "snapping" dans la timeline ? 6 148 19/10 09:47:12
CBY 
[WIP] et travaux terminés [terminé] Appli Blender de Poche en FR    [1][2][3] 29 1293 18/10 19:14:29
moonboots 
Questions & Réponses Débutant Blender, temps de travail pour un rendu ? 2 122 18/10 11:37:55
Jalis 
Questions & Réponses [WIP] Dragster-Tracteur pour Bécassine    [1][2][3] 24 5805 17/10 18:37:48
Laorz 
Graphisme alternatif faire de la bd avec blender    [1][2][3]...[13] 123 9373 17/10 14:20:26
blend74 
Questions & Réponses Bug texture sur plane avec bevel 1 224 16/10 08:09:13
Laorz 
Questions & Réponses [terminé] Supprimer le lien d'un objet entre 2 scènes 4 11758 15/10 12:52:21
Horemheb 

Qui est en ligne
180 utilisateur(s) en ligne (dont 86 sur Forums)

Membre(s): 3
Invité(s): 177


MollerCorinne, CelestaSch, LauraRitte, plus...
Nouveaux membres
DoraPainte 24/10/2021
MiraGass48 24/10/2021
AdeleT3009 24/10/2021
LynetteWal 24/10/2021
BrittLgg97 24/10/2021
SamualClax 24/10/2021
EliasRusso 24/10/2021
NydiaVivie 24/10/2021
GWUClaribe 24/10/2021
ArlieR3467 24/10/2021
Dernier Ajout
2020-09-24.jpg

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