CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Besoin d'aide création d'aventure textuel

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 17:38:11

Yo all :hap:/

J'ai mon projet pour le bac à rendre dans extrêmement peu de temps et je dois faire un jeu d'aventure en texte.
J'ai fait un topic sur openclassroom ou j'explique un peu mon projet : https://openclassrooms.com/forum/sujet/projet-bac-besoin-d-aide-jeu-d-aventure-textuel sauf que je bide un peu donc je me tourne vers vous.

Donc je résume: je dois faire un jeu en texte, de ce type par exemple: http://iplayif.com/?story=http%3A%2F%2Fwww.ifarchive.org%2Fif-archive%2Fgames%2Fzcode%2Fzdungeon.z5 (attention à ne pas confondre avec le livre dont vous êtes le héros !)
J'ai déjà fait quelques trucs mais étant un néophyte, ça me prend beaucoup plus de temps que je le pensais...
du coup je suis un peu en stress [[sticker:p/1kki]]
J'ai déjà fait :

  • créer quelques lieux du jeu selon en faisant des dictionnaires dans des dictionnaires (cf mon topic sur openclassroom pour plus de précisions)
  • le même système pour les objets.
  • une fonction location qui gère les déplacements qui marche plus ou moins bien :hap:

il me reste 1000 trucs à faire et rien que ça m'a déjà pris énormément de temps :rire:

Du coup j'userai avec grand plaisir de votre aide [[sticker:p/1lmh]]

Là en ce moment je cherche à faire mes fonctions d'actions (prendre, inspecter, attaquer, etc...) mais je galère un peu, surtout sur les fonctions qui demandent plusieurs paramètres (prendre(objet), inspecter(lieu), etc...)

Je sais pas vraiment aborder le truc enfaite:
l'utilisateur entre une commande, récupérée dans une variable avec input.
à partir de là, comment différencier les différentes commandes ?
devrai-je faire un test genre

  • if "prendre" in commande:
  • ...

je pense pas avoir été hyper clair, posez moi des questions ici, en MP ou sur openclassroom pour plus de précision, en tout cas je serai vraiment hyper reconnaissant si vous pouviez me donner quelques conseils ! :ok:

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 20:26:04

Salut,

Pas trop compris le jeu ( pour moi la description correspond justement parfaitement à un LDVELH :hap: ), mais je vais tenter de t'aider un peu.

D’abord, je te déconseille de te lancer dans les classes, le niveau attendu en ISN n'est absolument pas celui ci, les classes peuvent demander beaucoup trop de temps pour les comprendre ; ça serait dommage de rendre un truc complètement foireux en ayant voulu te lancer dans un domaine bien trop haut pour quelqu'un de ton niveau ( je n'ai pas fait ISN, mais j'ai vu assez de projets pour savoir que ce n'est pas du niveau... :( ).

Après si tu penses avoir les capacités pour comprendre facilement juste les bases de la Programmation Orientée Objet ( POO ), pourquoi pas, mais y en a pas besoin pour un petit projet ISN. :(

Contente toi déjà de bien comprendre les différentes structures, les utiliser à bonne escient ( quand utiliser while, quand utiliser for, c'est la base attendu ; comment se servir des conditions : quel rôle ont les opérateurs logiques, quel rôle ont les opérateurs de comparaison etc ).
Ensuite, montre aussi que tu maîtrises les fonctions ( qu'est ce que l'espace global / l'espace local, qu'est ce qu'un argument / une valeur de retour => éviter par exemple d'appeler les variables globales dans une fonction, plutôt que de les envoyer par argument, j'ai déjà vu ça une fois ).

Et voilà, je pense pas qu'ils en attendent plus en ISN... Boucles, conditions, fonctions et variables, c'est tout ce qu'il faut pour obtenir une note " correcte ".

Bref, tu m'as compris je pense.

Qu'as tu comme difficulté précisément encore maintenant ? :(

Nodli
Nodli
Niveau 2
06 mai 2016 à 20:31:55

Salut,
Pour ta question concernant les entrée utilisateur, je dirai que tu as deux solutions.
La première c'est celle que tu donnes, la plus simple, mais de mon point de vue la moins lisible et la plus longue en terme de lignes de code.
La deuxième solution est pas des masse plus complexe mais il faut connaître les dictionnaires.
Dans les grandes lignes,ils permettent d'associer une / plusieurs valeurs à des clés.
Un petit lien si tu veux savoir comment ça se manipule.
http://www.tutorialspoint.com/python/python_dictionary.htm
En gros, pour ton problème, tu écris une fonction pour chaque action que tu veux faire (ex : fonctionPrendre, fonctionInspecter, ...) et tu utilises un dictionnaire qui va associer les entrées utilisateur aux noms des fonctions. Tu récupères le nom de la fonction dans une variable et tu l'utilise comme si c'etait la fonction.

Message édité le 06 mai 2016 à 20:33:30 par Nodli
Grimmys
Grimmys
Niveau 19
06 mai 2016 à 20:38:49

Ouai, il parle justement des dicos sur son autre topic, c'est vrai que c'est une bonne économie.

Parce que une suite d'une dizaine de " if ", c'est pas très beau : ça ne valorisera pas ton travail ( dans certains autres langages, on a la structure case, qu'est vachement sympa pour ce cas :hap: ).

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 21:26:55

Okok merci beaucoup à tous pour vos réponses, je commençais à désespérer :hap:

Alors premièrement je le redis, c'est différent d'un LDVELH: j'avais écrit un pavé sur le fofo d'open, que je vais c/c ici par flemme, j'espère que ce sera plus clair pour ceux qui ne voient pas bien la différence:

Enfaite c'est pas un livre dont vous êtes le héros mais un jeu texte. Je vous le concède ça se ressemble mais y a une différence. Dans le jeu texte c'est vraiment des salles, avec des objets et des actions à faire et chacune reliées entre elles avec la possibilité d'aller et revenir entre chaque salles. Tandis que le livre dont vous êtes le héros... bah c'est un livre dont vous êtes le héros quoi, vous y avez déjà joué je pense. Il y a moins de fonctionnalités que le jeu textuel à mon avis, c'est plus focalisé sur la narration tandis que le jeu textuel c'est vraiment des phrases courtes, le strict minimum quoi.

Désolé si je m'explique mal, c'est vrai que c'est assez dur à représenter. La meilleure façon de voir la différence c'est encore un exemple, essayez ça si vous voulez:

http://iplayif.com/?story=http%3A%2F%2Fwww.ifarchive.org%2Fif-archive%2Fgames%2Fzcode%2Fzdungeon.z5

C'est un vieux jeu texte, j'espère que vous verrez la différence avec le livre.

Enfin bref je sais pas si c'est moi qui divague mais je vois une structure assez différentes entre les 2 types de jeu et par conséquent une structure de programme assez différente.

Par exemple, pour éviter de donner une impression de couloirs assez bornée, je comptais faire une carte "illimitée", c'est à dire que si le joueur va dans une certaine direction et continue d'y aller, les lieux seront toujours exactement les mêmes (le même enfaite, je répète mon dico du lieu jusqu'à l'infini quoi) et si au bout d'un certain nombre de tours le joueur est toujours perdu, il meurt.
Dans ma tête je me suis vraiment imaginé une carte quoi, et non un livre.

Maintenant pour ce qui est de la complexité du projet, j'en avais parlé sur un autre topic ici y a un petit moment:
mon prof est vraiment un timbré, et il nous demande des trucs hallucinants pour le peu de truc qu'il nous a inculqué avec ses faibles skills de pédagogue :rire:
(cf ledit topic pour les intéressés : https://www.jeuxvideo.com/forums/42-47-46417291-1-0-1-0-debutant-besoin-d-idee-pour-un-projet.htm je poste la liste des projets en page 1 si jamais)

Alors pour ce qui est des difficultés qui me restent...
Ça fait 2 jours que je m'y suis mit et que je fais ça presque non-stop, et franchement ça avait l'air beaucoup plus simple sur le papier qu'en pratique, ça commence gentiment à me faire peur. Je redoute de m'"égarer dans mon code", et d'au final me perdre dans des trucs hypers compliqués alors qu'il y avait moyen de faire beaucoup plus simple :(

Au début j'ai essayé de suivre un tuto (http://inventwithpython.com/blog/2014/12/11/making-a-text-adventure-game-with-the-cmd-and-textwrap-python-modules/) mais au final je m'en éloigne un peu, et je sais pas si j'ai raison de faire un truc plus perso ou si je devrai vraiment me rapprocher le plus possible du tuto

Sinon concrètement ce qu'il me reste, eh bien c'est surtout ce problème du catalogue d'action...
Le truc que vous me proposez avec les dicos à l'air bien mais je suis pas sûr de comprendre vraiment le concept (je suis extrêmement fatigué, j'ai passé ma journée à coder et je le crâne et les yeux en feu du coup je suis pas trop à 100% niveau assimilage de nouveaux concepts) du coup si vous pouviez préciser ce serait chouette :hap:

Sinon on me propose à la place de laisser l'utilisateur choisir de lui poser 2 questions:
choisir une action parmi une liste d'action et choisir sur quel objet il aimerait appliquer l'action.
Ça pourrait être plus simple, mais ça s'éloigne un peu du concept de liberté du jeu.

Sinon redites moi ce que vous pensez du code que j'ai déjà fait (je l'ai posté ici: https://openclassrooms.com/forum/sujet/creer-une-liste-d-action-pour-un-jeu-textuel) et surtout des structures que j'utilise pour décrire les pièces et les objets.
Tous les conseils sont bienvenus :hap:

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 21:42:20

Ouais le truc que je me demandais aussi c'est comment traiter les entrées utilisateur, est-ce que j'accepte qu 'il me donne plusieurs mots ou je fais genre: je lui demande l'action d'abord, puis selon l'action je lui demande à quel objet il veut l'appliquer. Ça pourrait simplifier la chose mais ça rajoute de la lourdeur au gameplay.
Et si j'accepte plusieurs mots, comment je traite le input ? J'ai meilleur temps de faire une liste des mots entrés en faisant un " ".join(entrée_utilisateur) ? Ou alors autre chose ? Un dictionnaire comme vous aviez proposé :question:

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 21:53:16

https://www.jeuxvideo.com/tinysergi/forums/message/773128859

" Mon prof nous a dit, à titre d'exemple qu'un de nos projets pourrait être de recoder minecraft [...] "

Ah oui quand même... Un truc qui doit même pas être attendu après 2/3 années d'étude. :hap:
Il a de sérieux problème... Il devait rigoler, ou ne pas avoir conscience de ce qu'il venait de dire.

Mais.... C'est lui qui va évaluer ton projet au bac ? :(

Bref, pour quelqu'un qui n'a jamais pris le temps de s'intéresser à la programmation ( parce qu'il faut se dire que certains on déjà appris pas mal à côté des cours, par exemple moi je suis en Terminal spé Maths là... Je n'ai donc jamais suivis le moindre cours et pourtant j'ai déjà quelques notions fondamentales... ), tu t'y prends un peu tard... Tu t'es foutu tout seul dans la merde. :/

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 22:01:56

Oui c'est lui et non je m'y prends pas maintenant ça fait un moment que je fais les cours python sur open classroom (1 mois environ :hap:) alors oui je m'y prends un peu tard mais franchement ça faisait un moment qu'on lui demandait des idées de projets car justement, on avait aucune idée de quoi faire car les trucs qu'il proposait "comme ça" c'était des trucs impossibles justement. Bref finalement il nous a envoyé une liste de projets et on a du choisir définitivement ce qu'on faisait. Franchement c'est aussi lui qui s'y prend tard pour la grosseur des projets qu'il demande..

Nodli
Nodli
Niveau 2
06 mai 2016 à 22:16:02

Pour les dictionnaires, il y a tout ce qu'il faut dans le lien que je t'ai donné.

En gros, c'est une base de données, tu associes une valeur à une clé.
Le dictionnaire est crée avec les accolades dict = { clé : valeur, clé2 : valeur2 }
Les clés et valeurs peuvent être des chaines de caractères, des entiers...

Supposons qu'on veuille entrer une clé "avancer", que l'on veut associer à une fonction fonctionAvancer
et pour une autre action "manger", associée à fonctionManger.

A la création du dictionnaire, tu mets dict = { "avancer" : fonctionAvancer, "manger" : fonctionManger}

Du coup, quand tu as ton input, par exemple "avancer" dans une variable var, quand tu tapes dans la console, dict[var], ça pointe vers ta fonction fonctionAvancer. Et donc si ta fonction prend en entrées deux nombres entiers par exemple, tu peux faire dict[var](5, 2) qui equivant à fonctionAvancer(5, 2).

Un bon petit pavé, mais j'espère avoir été clair et que tu comprends pourquoi ça serait vachement utile pour ton projet.

Et sinon, comme les clés peuvent être des entiers ou des chaines de caractères, tu peux accepter de l'utilisateur qu'il soit "libre" et qu'il te donne des chaines de caractères ou tu lui fais une liste et tu attends des chiffres. Dans tous les cas, vérifie que la valeur est bien dans le dictionnaire avant de l'utiliser, sinon tu vas obtenir une erreur. Tu mets un petit if chaine in dictionnaire et une boucle while pour retourner au input tant qu'il rentre pas une valeur qui te convient.

Message édité le 06 mai 2016 à 22:20:11 par Nodli
Grimmys
Grimmys
Niveau 19
06 mai 2016 à 22:25:21

Ah d'accord, excuse moi alors... T'as vraiment pas de chance dans ce cas, pas moyen d'en parler à votre prof principal ? :(

Le truc c'est que je suppose qu'il doit être le seul prof d'ISN du lycée ( vu la quantité d'élèves demandant cette spé :hap: ), et qu'aucun autre prof ne doit être vraiment qualifié pour estimer ce qu'il demande... Embêtant. :/

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 22:43:04

Le 06 mai 2016 à 22:16:02 Nodli a écrit :
Pour les dictionnaires, il y a tout ce qu'il faut dans le lien que je t'ai donné.

En gros, c'est une base de données, tu associes une valeur à une clé.
Le dictionnaire est crée avec les accolades dict = { clé : valeur, clé2 : valeur2 }
Les clés et valeurs peuvent être des chaines de caractères, des entiers...

Supposons qu'on veuille entrer une clé "avancer", que l'on veut associer à une fonction fonctionAvancer
et pour une autre action "manger", associée à fonctionManger.

A la création du dictionnaire, tu mets dict = { "avancer" : fonctionAvancer, "manger" : fonctionManger}

Du coup, quand tu as ton input, par exemple "avancer" dans une variable var, quand tu tapes dans la console, dict[var], ça pointe vers ta fonction fonctionAvancer. Et donc si ta fonction prend en entrées deux nombres entiers par exemple, tu peux faire dict[var](5, 2) qui equivant à fonctionAvancer(5, 2).

Un bon petit pavé, mais j'espère avoir été clair et que tu comprends pourquoi ça serait vachement utile pour ton projet.

Et sinon, comme les clés peuvent être des entiers ou des chaines de caractères, tu peux accepter de l'utilisateur qu'il soit "libre" et qu'il te donne des chaines de caractères ou tu lui fais une liste et tu attends des chiffres. Dans tous les cas, vérifie que la valeur est bien dans le dictionnaire avant de l'utiliser, sinon tu vas obtenir une erreur. Tu mets un petit if chaine in dictionnaire et une boucle while pour retourner au input tant qu'il rentre pas une valeur qui te convient.

Ça m'a l'air d'être une extrêmement bonne idée ça ! Je vais essayer de mettre ça en pratique, merci bien en tout cas !

Grimmy :d) oui sûrement mais tu connais comment ça marche, c'est beaucoup d'énergie pour au final pas grand chose, la situation ne s'améliore souvent pas et le prof en question t'as encore plus à la mauvaise...
moi personnellement je suis pas en galère niveau passage d'année, donc j'ai décidé de laisser couler, après j'ai pas envie de rien rendre non plus et franchement ça m'intéresse encore assez la programmation, le problème c'est que là ça demande beaucoup de temps et je dois mettre entre parenthèses mes révisions de bac pour ça.
Et ouais c'est le seul prof malheureusement...

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 22:50:13

Mais du coup Nodli avec ton histoire de dico, ce serait quand même possible que l'utilisateur rentre genre "prendre épée" ? Parce que ce que je me demande surtout c'est comment gérer les entrées multiples de ce genre. Je sais pas si c'est ce que t'as voulu dire avec le dict[var](5,2) car dans ce cas-là je vois pas vraiment comment recueillir en un seul input la clé pour le dico et le tupple (si c'en est un ?) contenant les deux autres variables

Message édité le 06 mai 2016 à 22:54:11 par TinySergi
Nodli
Nodli
Niveau 2
06 mai 2016 à 22:54:42

Le 06 mai 2016 à 22:50:13 TinySergi a écrit :
Mais du coup Nodli avec ton histoire de dico, ce serait quand même possible que l'utilisateur rentre genre "prendre épée" ? Parce que ce que je me demande surtout c'est comment gérer les entrées multiples de ce genre. Je sais pas si c'est ce que t'as voulu dire avec le dict[var](5,2) car dans ce cas-là je vois pas vraiment comment recueillir en un seul input la clé pour le dico et le tupple (si c'est un ?) contenant les deux autres variables

Oui, c'est tout à fait possible, tu découpes d'abord la chaîne de caractères avec chaine.split(), puis tu passes ce qui t’intéresse dans le dictionnaire. Après si tu as peu d'objets, il vaut peut-être mieux faire une fonction pour chaque.

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 22:59:33

Ok nickel alors, c'est parfait !
Merci beaucoup pour ce conseil divin ! :ange:
Après faut encore que j'arrive à le mettre en pratique, y a toujours des petites erreurs sneaky qui surgissent, mais là ça semble largement faisable [[sticker:p/1kki]]

TinySergi
TinySergi
Niveau 10
06 mai 2016 à 23:04:12

Ah oui sinon on doit aussi lui rendre un organigramme du programme, ce qui, je pense, va me prendre plus de temps que faire le programme lui-même surtout en utilisant Dia qui est le programme le plus pourri de la création à ma connaissance [[sticker:p/1kki]]

Nodli
Nodli
Niveau 2
06 mai 2016 à 23:04:24

Et pour éclaircir ta deuxième question, ce n'est pas un tuple, c'est l'appel à la fonction.
Comme dict[var] point vers la fonction, c'est comme si tu l'appelais directement.
Pour faire plus simple, si tu définis une fonction fonctionManger, qui prend deux entiers en paramètres, tu peux taper f = fonctionManger.
Ensuite, si tu fais f(2, 3), tu obtiens le résultat de fonctionManger(2, 3)
En gros, tu stockes l'adresse de la fonctionManger dans une variable et ça te permet de l'appeler.
Bonne chance pour ton projet !

Message édité le 06 mai 2016 à 23:05:56 par Nodli
TinySergi
TinySergi
Niveau 10
06 mai 2016 à 23:15:06

Mais ça ne l'empêche pas d'être un tupple, non ? Il me semblait que justement les parametres de fonctions étaient des tupples, ou alors je me goure. Bref dans tous les cas c'est pas important :hap:
Et oui merci encore, ça peut sembler bête mais t'as reboosté ma motiv là ! :banzai:

Nodli
Nodli
Niveau 2
06 mai 2016 à 23:25:31

Je t'avoue avoir eu un doute lorsque j'ai écrit ça, mais il existe une méthode particulière pour passer un tuple en argument à une fonction via nom_fonction(*nom_tuple), donc je ne pense pas que cela puisse être considéré comme un tuple sinon il suffirait de donner le tuple à la fonction via nom_fonction(tuple(nom_tuple)).

Cool ! Ca fait plaisir, ça me démangeait depuis longtemps mais je viens de m'inscrire pour te répondre :)

Grimmys
Grimmys
Niveau 19
06 mai 2016 à 23:30:47

Non, dans ce cas précis, " () " n'est pas là pour délimiter un tupple, mais l'appel de ta fonction (avec de potentiels arguments ).

C'est exactement le même fonctionnement qu'en maths : f(x) = x² par exemple : on donne la valeur qu'on veut à x, et la fonction nous renverra x². Soit f(2) = 2² = 4, on passe 2 en argument. :hap:

Donc aucune histoire de tupple. :(

Mais oui, au final, tant que tu comprends pourquoi on le fait... :hap:

TinySergi
TinySergi
Niveau 10
07 mai 2016 à 13:54:43

T'as bien fait de t'inscrire, bienvenu dans le monde des forumeurs de jvc alors :noel:
Ouais vous avez raison pour les tupple, c'est pas logique ce que j'ai dit quand j'y repense.

Sinon un truc qui pose souvent problème c'est de faire appel à des variables qui ne sont pas encore définies, ou définies ailleurs:

j'ai fait mes 3 fichiers: le fichier principal, où je mets tout ensemble, le fichier fonction, ou je définis mes fonctions et le fichier données, où je créer les données, par exemple les dicos des lieux, etc...

Par exemple, j'ai définies mes fonctions dans le fichier fonction. Admettons la foncton prendre:
def prendre(objet,lieu_actuel,objet):
Jusque là, pas de problème, mais quand je veux faire le dico rassemblant les fonctions, eh bien ça me sort du TypeError comme quoi il me manque 3 positional arguments. Je comprends, car là justement je fais appel à la fonction, mais je précise pas ce que je mets dedans. Et ce problème m'arrive hyper souvent enfaite. Je sais pas si je dois réécrire ma fonction, en mettant plutôt des trucs par défaut, (objet="épée", inventaire=[],...) où alors j'utilise plutôt global lieu_actuel, par exemple, directement dans le corps de ma fonction ?
Où sinon j'écris mon dico directement dans le fichier principal(je l'avais mis dans les fonctions) et je définis tous les parametres qui seront appelés avec le dico avant ?

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment