Se connecter

Informatique

Programmation

Sujet : [Python] Conception d'un "jeu", questionnement sur l'organisation générale
1
Niko1982
Niveau 2
09 juillet 2020 à 23:42:17

Bonjour cher forum,

Je suis enseignant en école primaire et j’ai commencé l’apprentissage de la programmation en autodidacte depuis presque deux ans afin de mener à bien un projet perso.
Aujourd’hui mon projet avance comme je le souhaite et malgré des hauts et des bas, je sens que je continue à progresser et que mon projet finira par voir le jour. Seulement j’ai le sentiment que les bases de mon programme ont besoin d’être revues sans quoi je risque d’être embêté plus tard si je souhaite le faire évoluer.
Je me pose donc la question d’une révision complète de tout ça et il me vient quelques questions de conception générale auxquelles une personne plus expérimentée que moi saura sans doute répondre.

Quelques détails avant de commencer :
- Je programme avec Python et utilise Django. Je bricole à côté en html, css (Bootstrap) et js (jquery).
- Mon projet consiste en la création d’un petit site web sans prétention proposant des « aventures » à jouer en classe de type Escape Game ou chasse au trésor (avec énigmes, lectures, réinvestissement des compétences travaillées en classe…) avec un aspect RP supplémentaire (création d’un personnage avec des compétences).

Les questions existentielles (certaines pourront peut-être paraître stupides, veuillez pardonner mon ignorance) :

La création d’applications :
J’ai appris que les applications regroupaient tous les éléments gravitant autour de mêmes modèles. J’ai donc fait :
- une application pour la navigation générale sur le site et la gestion des utilisateurs.
- une application pour la gestion des aventures.
C’est la seconde application qui m’interroge. J’ai l’impression qu’y mettre toutes mes aventures (actuellement au nombre de 0 du coup c’est pas trop problématique en ce moment :p) risque de créer une grosse bdd et d’y compliquer ainsi mes requêtes.
Même si les modèles resteront les mêmes d’une aventure à l’autre, n’est-il pas plus simple de séparer les tables en créant à chaque fois une nouvelle application ?
Ainsi je pourrais créer une copie d’une application témoin pour chaque création d’une nouvelle aventure, dans laquelle je créerai les instances spécifiques.
Ou existe-t-il un moyen de travailler sur une même application mais en séparant clairement les aventures ?

Le lancement d’une aventure :
Une aventure comprend un mini univers avec les héros, des lieux et des interactions. Tous seront définis en tant qu’instances dans mes modèles. Les instances peuvent évoluer lors de l’aventure (bonus/malus de caractéristique, lieux qui devient accessible…), ces changements ne doivent bien sûr pas modifier la base de données initiale de l’aventure.
Mon programme actuel :
Je crée pour chaque session d’aventure une liste des effets (bonus, accès…) que j’interroge systématiquement dès que je recherche une information.
Exemple : je souhaite récupérer la valeur « logique » d’un héros
1) Je récupère la valeur initiale du héros.
2) J’interroge ma liste pour voir s’il ne dispose pas d’un bonus ou un malus.
3) J’additionne le tout.
Et cela de nombreuses fois pour chaque vue, puisque j’ai besoin de récupérer plusieurs données. Mon programme n’est certes pas optimisé du tout, mais j’atteints quand même 7-8s de chargement par moment.
Une autre idée :
Je copie l’ensemble des instances que je peux ensuite directement modifier. Je garde toujours une liste des effets à appliquer ou à annuler plus tard dans la partie, que j’interroge à chaque tour pour mettre à jour les données.
Il me semble que ça réduirait considérablement le nombre de requêtes, mais augmenterait significativement la taille de la bdd. Même si à la fin de chaque aventure, je garde les stats et peux supprimer la copie.

Les modèles :
- Vaut-il mieux un gros modèle passe-partout avec beaucoup de données vides ou inutiles la plupart du temps, ou plusieurs modèles spécifiques avec des relations ?
- Vaut-il mieux utiliser le système d’héritage quand c’est possible ou bien les relations génériques ? J’ai lu quelque part que le système d’héritage n’était pas toujours fiable.

Voilà, si je pouvais avoir quelques pistes sur ces différents points ce serait une grande aide pour moi !

Merci beaucoup à ceux qui m’ont lu :)

affreteur2march
Niveau 5
11 juillet 2020 à 22:58:21

Si tes aventures ont suffisament de points communs (attributs/methodes) entre elles alors il est plus judicieux d'utiliser l'héritage, mais c'est pas obligatoire. Ca va te permettre par exemple de boucler facilement sur tes instances d'aventure (polymorphisme)

Donc en gros, créer un modèle Aventure, puis des modèles enfants AventureDansLaForet, AventureSurLaLune...

Je crée pour chaque session d’aventure une liste des effets (bonus, accès…) que j’interroge systématiquement dès que je recherche une information.
Exemple : je souhaite récupérer la valeur « logique » d’un héros
1) Je récupère la valeur initiale du héros.
2) J’interroge ma liste pour voir s’il ne dispose pas d’un bonus ou un malus.
3) J’additionne le tout.

J'ai du mal à te comprendre mais là il faudrait que tu ai un modèle "Héros" qui regroupe toutes les attributs et méthodes inhérent aux héros. Ta liste par exemple devrait être un attribut de ton instance de modèle "Héros" et pour intéragir avec cette liste tu dois utiliser des methodes du modèle "Héros". C'est le principe de la programmation objet

APrès pourquoi as tu choisis Python + Django pour ce genre de projet ? car clairement pour moi ce n'est pas adapté. Pour t'imager la chose, ça me donne l'impression que tu es en train de faire de la dance classique avec une armure de chevalier

POur ton projet j'aurai plus vu un framework JS du genre Phaser ( https://phaser.io/ ) ou même VueJS ou PyGame si tu veux du python (mais impossible online à ma connaissance)

Néanmoins c'est tout à ton honneur de te démener autant pour tes élèves, si tu as d'autres questions n'hésite pas

Raidden36
Niveau 6
12 juillet 2020 à 01:19:39

Ton jeu consiste en une suite de boîte de texte, si j'ai bien compris ? Si tel est le cas, la seule vraie partie conception, c'est au niveau de la base de données.
Peut être est-il judicieux de la penser en trois modèles, un modèle personnage, un modèle événement (là où sera contenu ton texte entre autre) et un modèle aventure.

Le premier contient ce que tu veux, des stats, un nom... Le second un texte, un type, et une liste vers d'autres événements en fonction de l'échec ou de la réussite de se dernier, et le troisième contient une référence vers un événement courant ainsi qu'une liste de personnages (pour pouvoir arrêter et reprendre la partie à souhait).
Tu définit en suite tes événements en fonction de la trame que tu veux leur donner, instancie un premier événement initiateur dans une aventure, qui enchaîne sur d'autres événements définit en fonction du résultat de l'événement (en faisant attention bien sûr, à ce que ces enchaînement d'événements finissent bien quelque part)

Tu développe une interface web pour choisir une aventure, afficher son événement courant, et effectuer le changement d'événement courant en fonction du résultat de ce dernier, grâce aux autres événements préalablement enregistrés, et tu enregistres tes aventures à l'aide d'une fonction que tu définiras toi-même, et dans laquelle tu notera caques événements, en les créant dans ta base de données, puis en créant une aventure dans laquelle tu y mettras l'événement initiateur, ainsi qu'un petit nom, par exemple.

Comme ça, à l'appelle de ta fonction, tu génère toute ton aventure, tu la stock, puis, par exemple, tu fais, dans ton jeu, une petite page où chaque joueurs peuvent créer un personnage, et chaque personnage créé est ajouter dans la liste à l'intérieur de la nouvelle aventure. Tu stock un id de l'aventure courante ainsi que de quoi authentifier chaque joueurs en cookie, et ils pourront tous jouer à ton aventure sans soucis, et même la reprendre quand ils le souhaiteront.

Niko1982
Niveau 2
13 juillet 2020 à 23:24:41

Bonjour,

Pour commencer un grand merci pour votre retour, c'est sympa de partager votre expérience avec un noob :-) et mes excuses pour la réponse tardive.

Si tes aventures ont suffisament de points communs (attributs/methodes) entre elles alors il est plus judicieux d'utiliser l'héritage

Elles suivront les mêmes modèles.
Du coup chaque instance du modèle Aventure représentera une nouvelle aventure. Quant au "polymorphisme", je vais regarder ce que c'est.

J'ai du mal à te comprendre mais là il faudrait que tu ai un modèle "Héros" qui regroupe toutes les attributs et méthodes inhérent aux héros.

Oui, c'est le cas.
Mais pour chaque décision prise par le héros, et donc réussite ou échec qui en résulte, je souhaite mettre en place un système de "récompense/punition". Par exemple, une action peut permettre de récupérer une clé donnant accès à un nouveau lieu, la découverte d'un livre peut apporter des connaissances (donc l'amélioration d'une compétence)...
Si le héros gagne un bonus de +1 en athlétisme, je ne peux pas directement modifier sa fiche de caractéristiques (le bonus doit être disponible le temps de l'aventure uniquement, ou un nombre de tour précis), de même je ne peux pas modifier directement les différents éléments composant l'aventure, sans quoi au prochain lancement de cette aventure, les élément s seront faussés.
J'espère avoir été plus clair :hum:
Quoi qu'il en soit, ça reste ma problématique principale, beaucoup d'éléments peuvent être modifiés lors d'une aventure, je crois que tous les copier pour pouvoir ensuite les mettre à jour quand je le souhaite n'est pas vraiment envisageable...

Ton jeu consiste en une suite de boîte de texte, si j'ai bien compris ? Si tel est le cas, la seule vraie partie conception, c'est au niveau de la base de données.

Effectivement, je m'affranchis de tout le côté graphique. Heureusement, en classe les élèves sont bien moins exigeant qu'à la maison, ils n'ont pas besoin d'en prendre plein les yeux pour se prendre au jeu. Les quelques images seront essentiellement décoratives.

APrès pourquoi as tu choisis Python + Django pour ce genre de projet ? car clairement pour moi ce n'est pas adapté. Pour t'imager la chose, ça me donne l'impression que tu es en train de faire de la dance classique avec une armure de chevalier

J'ai commencé avec Python car on m'a conseillé ce langage comme étant simple et polyvalent, alors que je ne savais pas encore exactement quelle route j'allais prendre (j'ai débuter avec 0 connaissances).
Par la suite, quand j'ai pensé partir sur la construction d'un site web, Django est venu naturellement... Parce que c'est celui où j'ai trouvé le plus (mais pas tant que ça) de tutos!
Mais comme je n'ai pas le côté graphique à faire, je ne me sens pas limité, j'aime beaucoup ce langage, plus que PHP ou JS pour le peu que je connaisse.
Est-ce que je passe vraiment à côté de quelque chose sans les frameworks que tu cites? Leur utilité n'est-elle pas principalement pour les graphiques?

Peut être est-il judicieux de la penser en trois modèles, un modèle personnage, un modèle événement (là où sera contenu ton texte entre autre) et un modèle aventure.

C'est à peu près les trois gros bloques que j'ai (avec tout plein de sous modèles).

un modèle personnage

Mon modèle héros est un héritage du modèle Interaction (contenant: héros, PNJ, Monstre, Piège, Fermeture, Obstacle, Objet) qui lui-même hérite du modèle Élément (contenant: Action, Jet, Interaction, Événement, Effet, Chapitre, Lieu).
Chaque élément sera lié à une Aventure.

un modèle événement

Chaque chapitre de mon aventure proposera un choix qui mènera à un jet qui aura un effet (bonus/Malus), un texte, et une avancée ou non au chapitre suivant.

un modèle aventure

S'apparente chez moi à mon modèle session qui comprend entre autres les participants et une relation avec un modèle Archive. Pour reprendre une partie, je récupère la dernière archive.

Tu développe une interface web pour choisir une aventure, afficher son événement courant, et effectuer le changement d'événement courant en fonction du résultat de ce dernier, grâce aux autres événements préalablement enregistrés, et tu enregistres tes aventures à l'aide d'une fonction que tu définiras toi-même, et dans laquelle tu notera caques événements, en les créant dans ta base de données, puis en créant une aventure dans laquelle tu y mettras l'événement initiateur, ainsi qu'un petit nom, par exemple.

Alors là je ne sais pas si je dois pleurer ou être content.
En gros, c'est ce que j'ai fait! :-)
Moi ça m'a pris 1 an et demi :snif2:

Comme ça, à l'appelle de ta fonction, tu génère toute ton aventure, tu la stock, puis, par exemple, tu fais, dans ton jeu, une petite page où chaque joueurs peuvent créer un personnage, et chaque personnage créé est ajouter dans la liste à l'intérieur de la nouvelle aventure. Tu stock un id de l'aventure courante ainsi que de quoi authentifier chaque joueurs en cookie, et ils pourront tous jouer à ton aventure sans soucis, et même la reprendre quand ils le souhaiteront.

Hum, moi j'ai lié les héros créés au compte User... Je suis parti du principe qu'un héros peut jouer toutes les aventures, mais effectivement, il faut que j'y réfléchisse.
Quand tu parles de générer et stocker toutes l'aventure à l'appel de la fonction, tu parles de faire une copie de tous les éléments pour pouvoir les modifier sans affecter les originaux?

Merci encore pour votre aide ! :ok:

1
Sujet : [Python] Conception d'un "jeu", questionnement sur l'organisation générale
   Retour haut de page
Consulter la version web de cette page