IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Site web sur un jeu vidéo


Sujet :

Schéma

  1. #1
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut Site web sur un jeu vidéo
    Bonjour,

    Je suis présentement dans le processus afin de créer un site web, et je cherche le moyen le plus efficace pour stocker mes données. Je vais donc essayer de décrire la situation le plus brièvement possible, en espérant que le post ne tire pas trop en longueur. Je doute malheureusement qu'il sera aussi court que je l'espère, mais j'ai besoin d'aide pour construire adéquatement ma base de données.

    Le projet et les contraintes

    Je réalise un site web sur un jeu vidéo. Dans ce jeu vidéo, le joueur incarne un personnage qui peut équiper des objets. Le site web aura deux modules importants : une banque de données pour rechercher les items (objets) et un simulateur de personnage, où l'utilisateur pourra choisir les items à équiper sur son personnage (et le simulateur calculera la somme des attributs, entre autres). Chaque item possédera des attributs (par exemple +5 Endurance).

    Les items en général

    Tous les objets ne peuvent pas nécessairement être portés par un personnage (exemple: potion). Les items ont par contre tous des points en commun (exemple: ils ont tous un nom), mais certains ont des effets que d'autres n'ont pas. Par exemple, les casques ont des points d'armure, les armes ont des dommages minimaux et maximaux, etc.

    Les items normaux

    Ces objets servent de base à tous les autres. Ils n'ont pas d'attributs à proprement parler (comme +5 Endurance), mais par exemple, les casques ont des points d'armure même s'ils sont normaux. Ces items se retrouvent en jeu et peuvent être équipés, même s'ils servent de moule aux autres.

    Les items magiques et rares

    Ce sont des objets normaux auxquels ont été ajoutés des attributs aléatoires (i.e. +5 Endurance). Bref, en plus de ce qui leur est propre (les attributs, voire plus loin), ils héritent de tous les points communs de leur parent (ex. la durabilité d'un objet magique sera la même que la durabilité de son parent qui est un objet normal). Pour donner un exemple, si j'ai un item normal appelé "Knife", il peut exister un item magique appelé "Ornate Knife" qui donne un attribut spécial. Le hic, c'est que ces items sont générés aléatoirement par le jeu : les attributs sont variables et leurs valeurs aussi (un item peut donner +4 Endurance ou +5 Endurance ou encore +4 Énergie). Vu le nombre de possibilités (plusieurs millions de milliards), il n'est pas possible de tous les générer pour les mettre dans la BDD.
    Petite précision : tous les items normaux ne peuvent pas nécessairement avoir tous les attributs en même temps. Il y a des règles arbitraires qui font qu'un item a une liste d'attributs possibles plus restreintes.

    Les items légendaires

    Ce sont des objets normaux auxquels ont été ajoutés des attributs fixes. Ils auront toujours les mêmes attributs, la seule chose qui peut changer est leur valeur. Si un item légendaire donne de l'Endurance, ils donneront toujours de l'Endurance, par contre, un item peut en donner 5 tandis que l'autre va en donner 10 (il y a toujours un minimum et un maximum, donc). Ils héritent aussi des points communs de leur parent, mais ont maintenant un nom fixe. Par exemple, il est possible d'avoir un item appelé "Légendaire #1" qui est une version légendaire de l'objet normal "Casque".

    La banque de données

    Dans la banque de données, il sera possible de chercher ces items dans la banque (par nom, par attributs, etc.). Ce qui est important à ce niveau, c'est que si l'utilisateur cherche l'item "Légendaire #1", il doit pouvoir trouver tous ses attributs ainsi que les valeurs possibles. Si cet item donne entre +5 et +10 d'Endurance, ce doit être indiqué. Pour les items légendaires, les attributs sont toujours fixes, donc c'est plus simple.
    Pour les items rares et magiques, comme ils sont créés aléatoirement par le jeu, c'est plus délicats. En fait, l'utilisateur pourra chercher un item normal, et il devrait s'afficher la liste des attributs possibles et la plage de valeurs qu'ils peuvent prendre que cet item normal peut avoir s'il est magique ou rare.

    Le simulateur de personnages

    L'utilisateur peut choisir les items qu'il veut, avec les attributs qu'il veut. Cela veut donc dire que s'il choisit un item légendaire, il peut choisir que l'attribut Endurance, qui prend une valeur entre 5 et 10, vaut 7. Il peut aussi ne pas spécifier de valeur, dans quel cas le simulateur va faire deux sommes des stats : celle dans le cas où la valeur serait minimale et celle si elle était maximale.
    Ça devient un peu plus corsé pour les items magiques et rares. Comme ces items ont des attributs variables, l'utilisateur peut choisir un item normal et lui donner tous les attributs qu'il souhaite parmi ceux que l'item normal peut avoir (règles arbitraires données par le jeu). Il peut aussi (c'est facultatif comme les items légendaires, il peut laisser la plage disponible) fixer une valeur à un attribut.
    Une fois que l'utilisateur a choisi ses items, je dois donc les enregistrer dans la base de données, en sachant que certains attributs peuvent être fixés ou non.

    Résumé rapide

    Il y a donc des items normaux qui servent de base à tous les autres items. Il y a des items magiques et rares qui prennent des attributs et des valeurs variables, et des items légendaires qui ont toujours les mêmes attributs, mais la valeur de ceux-ci peut être variable.
    Je dois trouver un moyen pour :
    A) Stocker les items pour qu'ils puissent être recherchés adéquatement par l'utilisateur selon divers critères;
    B) Permettre aux utilisateurs de faire leurs items personnels pour le simulateur de perso.


    Les données techniques

    Je tiens à préciser que je n'ai jamais reçu de formation quelconque. La programmation est une de mes passions et je suis naturellement curieux, donc au fil du temps, j'ai appris certaines bonnes et mauvaises pratiques. Je ne suis pas un vrai débutant, mais je suis loin d'être un expert dans le domaine. Ceci étant dit, je ne connais malheureusement pas les termes techniques du domaine (c'est pourquoi il n'y a pas de préfixe dans mon titre) et je n'ai jamais utilisé d'outils pour créer de jolis schémas comme j'en vois ici. Je décris plutôt la structure des tables directement.

    Je vais donc utiliser PostgreSQL 9.0.4 (avec Python et Django, mais je doute que ce soit nécessaire de le mentionner ici). Je vais enlever certains détails qui ne sont pas importants à ce qui me pose problème pour aller au vif du sujet. J'ai préfixé d'un @ les colonnes qui font référence à une table qui n'est pas utile de nommer. Grosso modo, voici comment je vois la chose :

    attribute [attr_id, attr_name]
    item [item_id, item_name, @item_type_id (casque, arme...), @item_quality_id (normal, légendaire...)]
    item_attr [@item_id, @attr_id, min_value (valeur minimale que la stat peut prendre pour l'item), max_value (idem)]

    Il y aura donc, pour un item, autant de lignes qu'il y a d'attributs, et la table de liaison item_attr permettra de donner la valeur minimale et maximale qu'un attribut peut prendre.

    Problème #1
    Comme je l'ai dit plus haut, certains items ont des attributs qui leur sont spécifiques (ex. les c asques ont des points d'armure). J'avais prévu utiliser l'héritage que fourni PGSQL, mais je me suis rendu compte qu'une FK sur la table parent ne s'étend pas jusqu'aux enfants, ce qui rendait la solution inutilisable si je souhaite conserver l'intégrité référentielle. Je vois donc deux solutions :
    1) On oublie l'intégrité référentielle et on fait de l'héritage
    2) On ajoute des tonnes de colonnes à la table item, qui seront NULL si la colonne ne s'applique pas pour un item (les armes n'ont pas de points d'armure => NULL). Je penche pour celle-ci.

    Y a-t-il une autre option qui s'offre à moi ? J'ai pensé à convertir certains points spécifiques en attribut (genre que les points d'armure soient un attribut plutôt qu'un point spécifique à un item). Si ça semble logique dans ce cas-ci, ça ne l'est pas pour tous. Par exemple, une arme aura une classe (ex. une arme peut être une hache, un bâton, etc.), ce qui ne se transpose pas très bien en attribut.


    Ensuite, les items personnels des utilisateurs. Il y a deux cas possibles :
    1) On prend un item légendaire dans la table item et on lui donne des valeurs spécifiques ou pas
    2) On prend un item normal dans la table item et on lui donne des attributs et des valeurs spécifiques ou pas

    Le pattern est similaire. Je dois donc trouver un moyen efficace de stocker ces informations, de préférence en essayant d'éviter les doublons (deux utilisateurs différents créent le même item avec les mêmes attributs et les mêmes valeurs => une seule entrée pour les deux). J'avais pensé à un truc dans le genre :

    custom_item [custom_item_id, @item_id]
    custom_item_attr [@custom_item_id, @attr_id, min_value, max_value]
    profile_items [@profile_id, @custom_item_id]

    L'utilisateur choisit donc son item, et s'il choisit des attributs ou valeurs personnalisés, ceux-ci sont privilégiés par rapport à ceux que l'item de base a habituellement. On ne remet pas tous les attributs de l'item, seulement ceux qui ne sont pas par défaut.

    Problème #2
    Est-ce une solution envisageable ? Je vais devoir ajouter tous les items de l'utilisateur dans la table custom_item même s'ils ne sont pas modifiés, mais je n'ai pas trouvé de meilleures solutions.


    Conclusion

    Ce sont les deux principaux problèmes qui m'empêchent d'avancer présentement. Enfin, les seuls auxquels je pense présentement, il est fort probable que j'aie encore besoin d'aide plus tard. Je suis conscient que mon post est très long et c'est une de mes peurs : que je n'aie pas de réponses parce que les gens ne veulent pas lire autant. J'ai essayé de réduire à l'essentiel (croyez-moi, je pourrais en dire beaucoup plus), mais même si mes problèmes sont d'apparence simples, ils nécessitent de connaître l'information derrière.
    Ensuite, je ne suis pas persuadé que je poste au bon endroit. Il y a tellement de forums sur DVP que je ne sais plus où donner de la tête. C'est ici que semblait être le forum approprié, mais si ce n'est pas le cas, n'hésitez pas à déplacer (ou je peux refaire un nouveau sujet). Je sais que je ne fournis pas de beaux schémas et que je n'utilise pas de termes techniques propres à ce forum, mais je fais mon possible.

    Dernière chose : ça me paraît clair parce que je sais de quoi je parle, mais n'hésitez pas à demander des précisions si c'est nécessaire, je me ferai un plaisir de les apporter.

    Merci beaucoup de m'avoir lu, c'est très, très apprécié, et merci d'avance pour les futures réponses.

    Jihnn

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Bonjour,
    Il y a déjà eu une discussion, voire plusieurs, sur la modélisation de jeux vidéo avec des personnages et des objets. Fais une recherche dans le forum.

    Lis la phrase en bleu de ma signature et applique son principe car ta prose est parfois confuse !
    Dans ce jeu vidéo, le joueur incarne un personnage qui peut équiper des objets.
    Ne sont-ce pas plutôt les objets qui équipent le personnage ?
    "Le personnage Jihnn est équipé d'un casque, d'une armure et d'une lance."

    une banque de données pour rechercher les items (objets)
    Puisqu'il s'agit d'objets, pourquoi les appelles-tu ensuite "items" qui est beaucoup moins signifiant ?

    Chaque item possédera des attributs
    Voilà un début de règle de gestion. Essaie de toutes les formuler de la sorte :
    " Un objet possède de un à plusieurs attributs et un attribut peut être possédé par plusieurs objets."

    On en déduit facilement le morceau de MCD suivant :
    objet -1,n----posseder----0,n- attribut

    Et de ce MCD découleront les tables suivantes :
    objet (obj_id, obj_nom...)
    attribut (att_id, att_nom...)
    obj_posseder_att (opa_id_objet, opa_id_attribut, opa_valeur...)

    Exemple de données :
    objet (obj_id, obj_nom...)
    1, 'potion'
    2, 'casque'
    3, 'lance'
    4, 'arc'

    attribut (att_id, att_nom...)
    1, 'Endurance'
    2, 'Armure'
    3, 'Dommages mini'
    4, 'Dommages maxi'

    obj_posseder_att (opa_id_objet, opa_id_attribut, opa_valeur...)
    2, 2, 1
    3, 3, 10
    3, 4, 100
    4, 3, 10
    4, 4, 100

    Les items normaux

    Ces objets servent de base à tous les autres. Ils n'ont pas d'attributs à proprement parler (comme +5 Endurance), mais par exemple, les casques ont des points d'armure même s'ils sont normaux.
    Donc, selon ce que tu as dit précédemment et selon mon schéma, et contrairement à ce que tu dis ici, un casque a au moins l'attribut 'armure'.

    Les items magiques et rares

    Ce sont des objets normaux auxquels ont été ajoutés des attributs aléatoires (i.e. +5 Endurance). Bref, en plus de ce qui leur est propre (les attributs, voire plus loin), ils héritent de tous les points communs de leur parent (ex. la durabilité d'un objet magique sera la même que la durabilité de son parent qui est un objet normal). Pour donner un exemple, si j'ai un item normal appelé "Knife", il peut exister un item magique appelé "Ornate Knife" qui donne un attribut spécial. Le hic, c'est que ces items sont générés aléatoirement par le jeu : les attributs sont variables et leurs valeurs aussi (un item peut donner +4 Endurance ou +5 Endurance ou encore +4 Énergie). Vu le nombre de possibilités (plusieurs millions de milliards), il n'est pas possible de tous les générer pour les mettre dans la BDD.
    J'ajoute une propriété booléenne "magique" à l'entité type "objet" et donc une colonne à la table :
    objet (obj_id, obj_nom, obj_magique...)

    Et je complète les données :
    1, 'potion', FALSE
    2, 'casque', FALSE
    3, 'lance', FALSE
    4, 'arc', FALSE
    5, 'couteau', FALSE
    6, 'couteau Omate', TRUE

    Avance à petits pas de cette façon en construisant petit à petit ton MCD. Reviens nous voir avec un début de schéma et dis-nous sur quel aspect tu as des problèmes.

    Bon courage !

    Puisque tu aimes les jeux, tu connais Swing ?

  3. #3
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut
    Bonjour,

    Tout d'abord, je tiens à te remercier énormément de ta réponse CinePhil, ça m'aide beaucoup. J'ai essayé une recherche et je n'ai rien trouvé de concluant, mais j'ai probablement mal cherché, j'en conviens.

    Lis la phrase en bleu de ma signature et applique son principe car ta prose est parfois confuse !
    J'essaie tant que possible d'appliquer ce principe, mais j'ai souvent tellement d'idées que j'emmêle mes phrases. Également, je suis Québécois. J'essaie d'employer un français aussi international que possible, mais certains patois ou structures de phrases restent. Je vais essayer d'y faire un peu plus attention.

    Ne sont-ce pas plutôt les objets qui équipent le personnage ?
    "Le personnage Jihnn est équipé d'un casque, d'une armure et d'une lance."
    Hum, bonne question, je crois que tu as raison.

    Puisqu'il s'agit d'objets, pourquoi les appelles-tu ensuite "items" qui est beaucoup moins signifiant ?
    Je programme (et je joue) surtout en anglais, et c'est le terme "item" qui est particulièrement utilisé. Je n'ai jamais vu le terme "object" l'être, en fait. "item" en anglais a le sens de "objet" en français.

    Donc, selon ce que tu as dit précédemment et selon mon schéma, et contrairement à ce que tu dis ici, un casque a au moins l'attribut 'armure'.
    Oui. J'avais initialement pensé que l'armure n'était pas exactement un attribut, mais je me suis ravisé.

    ...
    6, 'couteau Omate', TRUE
    C'est un point que j'ai volontairement oublié dans mon premier post pour éviter d'aller plus en longueur, mais je vais le détailler ici. Un objet magique ou rare possède des affixes (préfixes ou suffixes). Les affixes sont liés à un attribut et à un intervalle de données. Par exemple, le préfixe "Ornate" peut donner entre 5 et 10 d'Endurance, le préfixe "Super Ornate" peut donner entre 11 et 20 d'Endurance, etc. Ça veut donc dire qu'il n'est pas nécessaire de stocker le nom des items puisqu'ils peuvent être générés dynamiquement.
    Par ailleurs, un objet magique doit aussi hériter des attributs de ses parents. Si le casque "Helm" donne 50 et 100 points d'armure, le casque "Ornate Helm" donnera aussi 50 à 100 points d'armure. C'est pourquoi je pense créer une table de plus pour ces items, parce que sinon, je vais devoir dupliquer les informations à plusieurs endroits et que ça peut devenir compliqué à gérer (exemple: le jeu change et "Helm" ne donne maintenant que 50 à 75 points d'armure, il faudrait changer TOUS les items magiques).
    Je sais que c'est mal de ne pas donner toutes les infos, si je ne l'ai pas fait, c'est parce que je sais qu'un post trop long ne donne pas envie d'être lu et parce que je suis capable de créer un schéma correct à quelques détails prêts. En fait, le seul point important que je n'ai pas nommé, et en rétrospective, j'aurais dû le faire.

    Bref, voici tout ce qui me sera nécessaire :

    Les tables

    Les items

    item (item_id, item_class_id, item_quality_id, parent_id_id, item_name)
    Tous les items. parent_item_id réfère à item_id, s'il n'est pas null.

    item_class (item_class_id, item_slot_id, item_class_label)
    La classe d'un item (Ceinture, Hache, etc.)

    item_quality (item_quality_id, item_quality_label)
    La qualité d'un item (Normal, Légendaire, Magique, etc.)

    item_slot (item_slot_id, item_slot_label)
    L'emplacement de l'objet sur le personnage (Tête, Poignets, etc)

    attribute (attr_id, attr_label, attr_desc)
    Attributs

    item_attr (item_id, attr_id, attr_min_value, attr_max_value)
    Associe des attributs aux items. Les valeurs peuvent être variables.

    affix (affix_id, attr_id, affix_label, affix_min_value, affix_max_value)
    Les affixes. Uniquement visibles par les items magiques, mais les items rares les utilisent aussi. Les valeurs min et max pour pouvoir faire la jointure avec les items, et parce que les utilisateurs doivent savoir quels sont les stats minimales et maximales qu'un item peut avoir selon un attribut en particulier.

    affix_item_rule (item_id, affix_id)
    Les règles pour savoir quel item peut avoir quels affixes.

    Les personnages

    character (char_id, user_id, char_name, char_level)
    Les personnages que les utilisateurs peuvent créer

    char_items (char_id, item_id)
    Associe les items aux personnages

    Je n'ai pas mis les tables pour les membres et quelques petits détails parce que ce n'est pas important.

    Mon problème

    Le seul point qui me pose problème, c'est le fait que des items héritent des valeurs des autres. Par exemple, si je crée un item magique basé sur un casque, il doit hérité des attributs du casque (armure, durabilité) en plus d'avoir ses propres attributs (+5 endurance). Par contre, il n'a pas nécessairement besoin d'hériter le nom, celui-ci ne changera pas. Pour les items rares et magiques, ça ne fait que deux niveau, mais pour les items légendaires, il peut y en avoir jusqu'à trois :
    1) l'item normal de base
    2) l'item légendaire, avec les valeurs d'attributs variables
    3) l'item légendaire personnel d'un membre, avec les attributs fixes.

    Est-ce que fonctionner ainsi est une bonne idée ? Je sais que je ne devrais pas y penser tout de suite, mais j'imagine que je vais avoir besoin des requêtes récursives. Est-ce que ça peut poser des problèmes de lenteur à la longue, en sachant qu'il peut y avoir quelques centaines de personnes qui font un perso en même temps, qu'il y a une dizaine d'items par personnage et que je dois récupérer énormément de lignes pour chaque perso ?

    Merci encore de m'avoir lu,

    Jihnn

    P.S. J'ai lu la partie de ton message sur les règles de gestion, j'ai un peu de difficulté à comprendre comment les coucher sur papier.

    Puisque tu aimes les jeux, tu connais Swing ?
    Non, connais pas ! Je ne joue pas vraiment aux jeux par navigateur.

Discussions similaires

  1. [Bénévole] Recherche un programmeur PHP pour site Web sur le monde du jeu vidéo
    Par xcalibure- dans le forum Autres
    Réponses: 0
    Dernier message: 08/06/2009, 00h53
  2. Un site basé sur un jeu vidéo
    Par sourivore dans le forum Juridique
    Réponses: 5
    Dernier message: 22/06/2008, 05h58
  3. Site web sur un jeu d'entraineur
    Par molesqualeux dans le forum Projets
    Réponses: 14
    Dernier message: 23/01/2006, 15h16
  4. recherche pour presentation site web sur PC et app. mobile
    Par Marc_3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/04/2005, 15h33
  5. site web sur le Haskell
    Par ab_sam dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 30/09/2003, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo